clear all;
clc;
s = RandStream('mt19937ar','Seed',0);
RandStream.setGlobalStream(s);
Y = xlsread('experiment.xlsx');
t = size(Y,1);
M = size(Y,2);
tau = 40;
p = M;
plag = 2;
numa = p*(p-1)/2;
ylag = mlag2(Y,plag);
ylag = ylag(plag+1:t,:);
m = p + plag*(p^2);
Z = zeros((t-tau-plag)*p,m);
for i = tau+1:t-plag
ztemp = eye(p);
for j = 1:plag
xtemp = ylag(i,(j-1)*p+1:j*p);
xtemp = kron(eye(p),xtemp);
ztemp = [ztemp xtemp];
end
Z((i-tau-1)*p+1:(i-tau)*p,:) = ztemp;
end
y = Y(tau+plag+1:t,:)';
t=size(y,2);
nrep = 50;
nburn = 0;
apart = 1;
it_print = 10;
a_prob = .5;
b_prob = .5;
ap_0 = a_prob*ones(3,1);
bp_0 = b_prob*ones(3,1);
ap=zeros(3,1);
bp=zeros(3,1);
[B_OLS,VB_OLS,A_OLS,sigma_OLS,VA_OLS]= ts_prior(Y,ylag(1:tau,:),tau,p,plag);
k_Q = 0.01;
B_0_prmean = B_OLS;
B_0_prvar = 4*VB_OLS;
Q_prmean = ((k_Q).^2)*tau*VB_OLS;
Q_prvar = tau;
consQ = 0.0001;
consH = 0.01;
Qdraw = consQ*eye(m);
Qchol = sqrt(consQ)*eye(m);
Ht = kron(ones(t,1),consH*eye(p));
Htsd = kron(ones(t,1),sqrt(consH)*eye(p));
Bdraw = zeros(m,t);
Zs = kron(ones(t,1),eye(p));
kdraw = 1*ones(t,3);
pdraw = .5*ones(1,3);
kold = kdraw;
kmean = zeros(t,3);
kvals = ones(2,1);
kvals(1,1) = 0;
kprior = .5*ones(2,3);
B_post1 = zeros(5,t*nrep/apart);
B_post2 = zeros(5,t*nrep/apart);
B_post3 = zeros(5,t*nrep/apart);
B_post4 = zeros(6,t*nrep/apart);
Q_post = zeros(m,m*nrep/apart);
k_post = zeros(t,3*nrep/apart);
kp_post = zeros(nrep/apart,3);
B_postmean = zeros(m,t);
Qmean = zeros(m,m);
kpmean = zeros(1,3);
temp1_mat = zeros(t-1,(nburn+nrep)/apart);
tic;
disp('Number of iterations');
for irep = 1:nrep + nburn
if mod(irep,it_print) == 0
disp(irep);toc;
end
pdrawa = zeros(3,1);
ap(1,1) = ap_0(1,1) + sum(kdraw(:,1));
bp(1,1) = bp_0(1,1) + t - sum(kdraw(:,1));
pdrawa(1,1) = betarnd(ap(1,1),bp(1,1));
pdraw(1,1) = pdrawa(1,1);
kprior(2,1) = pdrawa(1,1);
kprior(1,1) = 1 - kprior(2,1);
[kdrawa,lpyK,tempv_mat1] = gck(y,zeros(p,t),Z,Htsd,zeros(m,t),...
kron(ones(t,1),eye(m)),Qchol,kold(:,1),t,B_0_prmean,B_0_prvar,2,kprior(:,1),kvals,p,m);
kdraw(:,1) = kdrawa;
kold(:,1) = kdraw(:,1);
temp1_mat(:,irep) = tempv_mat1;
[Bdrawc,log_lik1] = carter_kohn1(y,Z,Ht,Qdraw,m,p,t,B_0_prmean,B_0_prvar,kdraw(:,1));
Bdraw = Bdrawc;
Btemp = Bdraw(:,2:t)' - Bdraw(:,1:t-1)';
sse_2 = zeros(m,m);
for i = 1:t-1
sse_2 = sse_2 + Btemp(i,:)'*Btemp(i,:);
end
Qinv = inv(sse_2 + Q_prmean);
Qinvdraw = wish(Qinv,t+Q_prvar);
Qdraw = inv(Qinvdraw);
Qchol = chol(Qdraw)';
if irep > nburn
if mod(irep-nburn, apart) == 0
B_post1(:,t*((irep-nburn)/apart-1)+1:t*(irep-nburn)/apart) = Bdraw(1:5,:);
B_post2(:,t*((irep-nburn)/apart-1)+1:t*(irep-nburn)/apart) = Bdraw(6:10,:);
B_post3(:,t*((irep-nburn)/apart-1)+1:t*(irep-nburn)/apart) = Bdraw(11:15,:);
B_post4(:,t*((irep-nburn)/apart-1)+1:t*(irep-nburn)/apart) = Bdraw(16:21,:);
Q_post(:,m*((irep-nburn)/apart-1)+1:m*(irep-nburn)/apart) = Qdraw;
k_post(:,p*((irep-nburn)/apart - 1)+1:p*(irep-nburn)/apart) = kdraw;
kp_post((irep-nburn)/apart,:) = pdraw;
B_postmean = B_postmean + Bdraw;
Qmean = Qmean + Qdraw;
kmean = kmean + kdraw;
kpmean = kpmean + pdraw;
end
end
end
B_postmean = B_postmean./(nrep/apart);
Qmean = Qmean./(nrep/apart);
kmean = kmean./(nrep/apart);
kpmean = kpmean./(nrep/apart);
function [Xlag] = mlag2(X,p)
[Traw,N]=size(X);
Xlag=zeros(Traw,N*p);
for ii=1:p
Xlag(p+1:Traw,(N*(ii-1)+1):N*ii)=X(p+1-ii:Traw-ii,1:N);
end
function [bols,bvar,a0,ssig1,a02mo] = ts_prior(rawdat,x,tau,p,plag)
yt = rawdat(plag+1:tau+plag,:)';
m = p + plag*(p^2);
Zt = zeros(tau*p,m);
for i = 1:tau
ztemp = eye(p);
for j = 1:plag
xtemp = x(i,(j-1)*p+1:j*p);
xtemp = kron(eye(p),xtemp);
ztemp = [ztemp xtemp];
end
Zt((i-1)*p+1:i*p,:) = ztemp;
end
yy = reshape(rawdat(plag+1:tau+plag,:)',p*tau,1);
bols = (Zt'*Zt) \ Zt' * yy;
sse2 = zeros(p,p);
y_hat = [];
for i = 1:tau
zhat1 = Zt((i-1)*p+1:i*p,:);
residual = yt(:,i) - zhat1*bols;
y_hat = [y_hat residual];
sse2 = sse2 + residual*residual';
end
hbar = sse2./tau;
Q = zeros(p*plag+1, p*plag+1);
for i = 1:tau
temp = [1 x(i,1:p) x(i,p+1:plag*p)];
Q = Q + temp' * temp;
end
Q = (1/tau)*Q;
bvar = kron(hbar, inv(Q));
achol = chol(hbar)';
ssig = zeros(p,p);
for i = 1:p
ssig(i,i) = achol(i,i);
end
ssig1 = zeros(p,1);
for i = 1:p
ssig1(i,1) = log(ssig(i,i)^2);
end
achol = chol(hbar)';
ssig = diag(diag(achol));
achol = inv(achol/ssig);
numa = p*(p-1)/2;
a0 = zeros(numa,1);
ic = 1;
for ii = 2:p
a0(ic:ic+ii-2,1) = achol(ii,1:ii-1);
ic = ic + ii - 1;
end
ssig1 = 2*log(diag(ssig) );
hbar1 = inv(tau*hbar);
a02mo = zeros(numa,numa);
a0mean = zeros(numa,1);
for irep = 1:4000
hdraw = wish(hbar1,tau);
hdraw = inv(hdraw);
achol = chol(hdraw)';
ssig = diag(diag(achol));
achol = inv(achol/ssig);
a0draw = zeros(numa,1);
ic = 1;
for ii = 2:p
a0draw(ic:ic+ii-2,1) = achol(ii,1:ii-1);
ic = ic + ii - 1;
end
a02mo = a02mo + a0draw*a0draw';
a0mean = a0mean + a0draw;
end
a02mo = a02mo./4000;
a0mean = a0mean./4000;
a02mo = a02mo - a0mean*a0mean';
function A = wish(h,n)
A = chol(h)'*randn(size(h,1),n);
A = A*A';
function [kdraw,lpy2n,tempv_mat1] = gck (yg,gg,hh,capg,f,capf,sigv,kold,t,ex0,vx0,nvalk,kprior,kvals,p,kstate)
tempv_mat1 = [];
lpy2n=0;
mu = zeros(t*kstate,1);
omega = zeros(t*kstate,kstate);
for i = t-1:-1:1
gatplus1 = kold(i+1,1)*sigv;
ftplus1 = capf(kstate*i+1:kstate*(i+1),:);
cgtplus1 = capg(i*p+1:(i+1)*p,:);
htplus1 = hh(i*p+1:(i+1)*p,:)';
rtplus1 = (htplus1'*gatplus1)*(htplus1'*gatplus1)' + cgtplus1*cgtplus1';
btplus1 = gatplus1*gatplus1'*htplus1 / rtplus1;
atplus1 = (eye(kstate) - btplus1*htplus1')*ftplus1;
cct1 = eye(kstate) - gatplus1'*(htplus1 / rtplus1)*htplus1'*gatplus1;
cct2= chol(cct1)';
ctplus1 = gatplus1*cct2;
otplus1 = omega(kstate*i+1:kstate*(i+1),:);
dtplus1 = ctplus1'*otplus1*ctplus1 + eye(kstate);
omega(kstate*(i-1)+1:kstate*i,:) = atplus1'*(otplus1 - otplus1*(ctplus1/dtplus1)*ctplus1'*otplus1)*atplus1 + ftplus1'*(htplus1/rtplus1)*htplus1'*ftplus1;
satplus1 = (eye(kstate) - btplus1*(htplus1'))*f(:,i+1) - btplus1*gg(:,i+1);
mutplus1 = mu(kstate*i+1:kstate*(i+1),:);
mu(kstate*(i-1)+1:kstate*i,:) = atplus1'*(eye(kstate) - otplus1*(ctplus1/dtplus1)*ctplus1')*(mutplus1 - otplus1*(satplus1 + btplus1*yg(:,i+1))) + ftplus1'*(htplus1/rtplus1)*(yg(:,i+1) - gg(:,i+1) - htplus1'*f(:,i+1));
end
kdraw = kold;
ht = hh(1:p,:)';
ft = capf(1:kstate,:);
gat = zeros(kstate,kstate);
rt = ht'*ft*vx0*ft'*ht + ht'*(gat*gat')*ht+ capg(1:p,:)*capg(1:p,:)';
jt = (ft*vx0*ft'*ht + gat*gat'*ht) / rt;
mtm1 = (eye(kstate) - jt*ht')*(f(:,1) + ft*ex0) + jt*(yg(:,1) - gg(:,1));
vtm1 = ft*vx0*ft'+ gat*gat' - jt*rt*jt';
lprob = zeros(nvalk,1);
for i = 2:t
ht = hh((i-1)*p+1:i*p,:)';
ft = capf(kstate*(i-1)+1:kstate*i,:);
for j = 1:nvalk
gat = kvals(j,1)*sigv;
rt = ht'*ft*vtm1*ft'*ht + ht'*(gat*gat')*ht + capg((i-1)*p+1:i*p,:)*capg((i-1)*p+1:i*p,:)';
jt = (ft*vtm1*ft'*ht + gat*gat'*ht)/ rt;
mt = (eye(kstate) - jt*ht')*(f(:,i) + ft*mtm1) + jt*(yg(:,i) - gg(:,i));
vt = ft*vtm1*ft' + gat*gat' - jt*rt*jt';
lpyt = -.5*log(det(rt)) - .5*(yg(:,i) - gg(:,i) - ht'*(f(:,i) + ft*mtm1))'*(rt\(yg(:,i) - gg(:,i) - ht'*(f(:,i) + ft*mtm1)));
[V, lambda] = eig(vt);
tt = V * sqrt(lambda);
ot = omega(kstate*(i-1)+1:kstate*i,:);
mut = mu(kstate*(i-1)+1:kstate*i,:);
tempv = eye(kstate) + tt'*ot*tt;
lpyt1n = -.5*log(det(tempv)) -.5*(mt'*ot*mt - 2*mut'*mt - (mut - ot*mt)'*(tt/tempv)*tt'*(mut - ot*mt));
lprob(j,1) = log(kprior(j,1)) + lpyt1n + lpyt;
if i == 2;
lpy2n = lpyt1n + lpyt;
end
end
pprob = exp(lprob)./sum(exp(lprob));
tempv = rand(1,1);
tempv_mat1 = [tempv_mat1; tempv];
tempu = 0;
for j = 1:nvalk
tempu = tempu + pprob(j,1);
if tempu > tempv;
kdraw(i,:) = kvals(j,:);
break
end
end
gat = kdraw(i,1)*sigv;
rt = ht'*ft*vtm1*ft'*ht + ht'*(gat*gat')*ht + capg((i-1)*p+1:i*p,:)*capg((i-1)*p+1:i*p,:)';
jt = (ft*vtm1*ft'*ht + gat*gat'*ht) / rt;
mtm1 = (eye(kstate) - jt*ht')*(f(:,i) + ft*mtm1) + jt*(yg(:,i) - gg(:,i));
vtm1 = ft*vtm1*ft' + gat*gat' - jt*rt*jt';
end
end
function [bdraw,log_lik] = carter_kohn1(y,Z,Ht,Qt,m,p,t,B0,V0,kdraw)
bp = B0;
Vp = V0;
bt = zeros(t,m);
Vt = zeros(m^2,t);
log_lik_ = 0;
for i=1:t
R = Ht((i-1)*p+1:i*p,:);
H = Z((i-1)*p+1:i*p,:);
cfe = y(:,i) - H*bp;
f = H*Vp*H' + R;
inv_f = H'/f;
log_lik_ = log_lik_ + log(det(f)) + (cfe'/ f)*cfe;
btt = bp + Vp*inv_f*cfe;
Vtt = Vp - Vp*inv_f*H*Vp;
if i < t
bp = btt;
Vp = Vtt + kdraw(i,:)*Qt;
end
bt(i,:) = btt';
Vt(:,i) = reshape(Vtt,m^2,1);
end
log_lik = - (t/2) * log(2*pi) - (1/2)*log_lik_;
bdraw = zeros(t,m);
bdraw(t,:) = btt' + randn(1,m)*chol(Vtt);
for i=1:t-1
bf = bdraw(t-i+1,:)';
btt = bt(t-i,:)';
Vtt = reshape(Vt(:,t-i),m,m);
f = Vtt + kdraw(t-i,:)*Qt;
inv_f = Vtt/f;
cfe = bf - btt;
bmean = btt + inv_f*cfe;
bvar = Vtt - inv_f*Vtt;
bdraw(t-i,:) = bmean' + randn(1,m)*chol(bvar)
end
bdraw = bdraw';