nkf<-read.csv("nkf.csv");
nkflog<-log(nkf[,2]);
yobs<-matrix(t(nkflog),1);
N <-length(yobs); time<-1:N; N2<-6;
#データ確認
plot(time,yobs,type="l");
# State Space Representation
#
# x(t+1) = F x(t) + G w(t);# cov{w(t) w(t)} = {Q 0}
# y(t) = H x(t) + v(t);# {v(t),v(t)} = {0 R}
F <- matrix(c(1,0,0,0,0,0, 1,1,0,0,0,0, 0,0,1,0,0,0, 0,0,1,1,0,0, 0,0,0,0,1,0, 0,0,0,0,1,1),6,6);
G <- matrix(c(1,0,0,0,0,0, 1,1,0,0,0,0, 0,0,1,0,0,0, 0,0,1,1,0,0, 0,0,0,0,1,0, 0,0,0,0,1,1),6,6);
H <- matrix(c(1,0,1,0,1,0),1,6);
Q <- matrix(c(1,0,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 0,0,0,0,0,1),6,6);
R <- matrix(c(1),1,1);
# ----------------------------------
# Kalman Filter
# ----------------------------------
#
# initial value
x <- matrix(0,N2,1); # x(0|0)
P <- diag(N2); # P(0|0)
ypre <- matrix(numeric(N),1);#予測値
Spre <- matrix(numeric(N),1);#誤差共分散
arpre <- matrix(numeric(N*2),2);#AR(2)
Tpre <- matrix(numeric(N),1);#推定トレンド
MApre<- matrix(numeric(N),1);#MA移動平均
K <- matrix(0,N2,1);
#
x[1,1] = yobs[1,5];
#
for(t in 5:N){
#
# prediction
x <- F %*% x; # x(t+1|t) <- x(t|t)
P <- F %*% P %*% t(F) + G %*% Q %*% t(G); # P(t+1|t) <- P(t|t)
H[1,1] = 1; #推定トレンド
H[1,2] = 0;
H[1,3] = yobs[t-1] - yobs[t-2];
H[1,4] = 0;
H[1,5] = yobs[t-2] - yobs[t-3];
H[1,6] = 0;
ypre[t] <- H %*% x;#予測値
Spre[t] <- sqrt(H %*% P %*% t(H)+R);#誤差共分散
Tpre[t] = x[1,1]; #推定トレンド
MApre[,t] = x[2,1]; #MA移動平均
arpre[,t] = x[5:6,1];#AR(2)係数行列
#
# filtering
K <- P %*% t(H) %*% solve(H %*% P%*%t (H)+R); # Kalman Gain
x <- x + K * (yobs[,t] - ypre[t]); # x(t|t) <- x(t|t-1)
P <- P - K %*% H %*% P; # P(t|t) <- P(t|t-1)
}
par(ask=TRUE);#作図確認
par(mfrow=c(3,2));#画面を3×2 に分割