📄 ham_like.m
字号:
function likv = ham_like(parm1,y,x,nlag,st_mat);
% PURPOSE: log likelihood function for Hamilton's model
% y(t) - mu_(st) = phi1*(y(t-1) - mu_(st-1) + ...
% + phi_nlag*(y(t-nlag) + mu_(st-nlag)) + e(t)
% mu_(st) = mu0*(1-st) + mu1*(st)
% e(t) = N(0,sigma^2)
% pr(st=1 | st-1 = 1) = p
% pr(st=0 | st-1 = 0) = q
% -----------------------------------------------------
% Usage: like = ham_like(parm,y,x,nlag,st_mat);
% where: y = nx1 vector of dependent variable
% x = nxk matrix of lagged dependent variables
% nlag = nxk matrix of explanatory variables
% st_mat = an input matrix computed once
% in hamilton() function to save time
% -----------------------------------------------------
n = length(y);
nstates = nlag+1;
dimen = 2.^nstates;
parm = ham_trans(parm1); % transform input parameters
ppr = parm(1,1); % pr(st=1 | st-1 = 1)
qpr = parm(2,1); % pr(st=0 | st-1 = 0)
phi = parm(3:3+nlag-1,1);
sig = parm(3+nlag,1)*parm(3+nlag,1);
mu0 = parm(3+nlag+1,1); % recession vs. boom
mu1 = parm(3+nlag+2,1);
mu_mat = st_mat*mu1 + (ones(dimen,nstates) - st_mat)*mu0;
pr_tr = [qpr (1-ppr)
(1-qpr) ppr];
a = [eye(2) - pr_tr
ones(1,2)];
en = [0
0
1];
probt = inv(a'*a)*a'*en;
% pr(st=0) | pr(st=1) a 2x1 steady state probabilties vector
pr_trf0 = vec(pr_tr);
pr_trf1 = [pr_trf0
pr_trf0];
pr_trf2 = [pr_trf1
pr_trf1];
pr_trf = [pr_trf2
pr_trf2];
probt = vecr([probt probt]).*pr_trf0; % PR[S_{-2},S_{-3}|I_0) 4x1
probt = vecr([probt probt]).*pr_trf1; % PR[S_{-1},S_{-2},S_{-3}|I_0) 8x1
probt = vecr([probt probt]).*pr_trf2; % PR[S_{0},S_{-1},S_{-2},S_{-3}|I_0) 16x1
prob = vecr([probt probt]); %should be 2^5 x 1 vector
likv = 0;
iter = 1;
while iter <= dimen
lik = 0;
size(x)
size(phi)
dimen
size(mu_mat)
n
size(y)
fcast = (y(iter,1) - x(iter,:)*phi')*ones(dimen,1) ...
- (mu_mat(:,5) - mu_mat(:,4)*phi(1,1) ...
- mu_mat(:,3)*phi(2,1) ...
- mu_mat(:,2)*phi(3,1) ...
- mu_mat(:,1)*phi(4,1));
fcast2 = fcast.*fcast;
var_l = sig*ones(dimen,1);
prob_dd = pr_trf.*prob;
% Pr[S_t,S_{t-1},S_{t-2},S_{t-3},S_{t-4} | I(t-1)]
term1 = ones(dimen,1)./sqrt(2*pi*var_l);
term2 = exp(-0.5*fcast2./var_l);
pr_vl = term1.*term2.*prob_dd;
%pr_vl = (ones(dimen,1)./sqrt(2*pi*var_l)).*exp(-0.5*(fcast.*fcast)./var_l).*prob_dd;
% should be 2^5 x 1 vector
% with joint density of y_t,S_t,..,S_{t-4} given past information
pr_val = sum(pr_vl); % f(y_t|I(t-1)), density of y_t given past
% information: This is weighted average of
% 2^5 conditional densities
if pr_val ~= 0
lik = -log(pr_val);
pro = pr_vl/pr_val;
else % we do a fix-up in this case
pr_val = 0.1;
pr_vl = pr_vl + 0.001;
% warning('problem in likelihood function');
lik = -log(pr_val);
pro = pr_vl/pr_val;
end;
% Pr[S_t,S_{t-1},S_{t-2},S_{t-3},S_{t-4} | I(t-1),y_t]
% Updating of prob. with new information, y_t
probt = pro(1:dimen/2,1) + pro(dimen/2+1:dimen,1);
% Integrate out S_{t-4}: then you get
% Pr[S_t, S_{t-1},S_{t-2},S_{t-3}| Y_t]
% 2^4x1 vector
prob = vecr([probt probt]);
% should be 2^5 x 1 vector
likv = likv + lik;
iter = iter + 1;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -