data simudata;
n=500;
seed=1230;
e10=rannor(seed);
e20=rannor(seed);
e30=rannor(seed);
e40=rannor(seed);
x0=0;
do i=-200 to n;
x=0.9*x0+2*rannor(seed);
e1=0.95*e10+rannor(seed);
y1=2.5+0.95*x+e1;
e2=0.9*e20+rannor(seed);
y2=2.0+1.1*x+e2;
e3=0.85*e30+rannor(seed);
y3=1.5+1.25*x+e3;
e4=0.8*e40+rannor(seed);
y4=2.5+0.7*x+e4;
if i>0 then output;
x0=x; e10=e1; e20=e2; e30=e3; e40=e4;
end;
keep y1-y4 x;
run;
proc corr data=simudata;
var y1-y4 x;
run;
proc iml;
start lik(pr) global(y,z0,vz0);
KSI0=z0`;
P0=vz0;
F=diag(pr[1:5]);
A = pr[10:13]; ;
B = pr[6:9]||I(4);
Q = diag((pr[14:18])##2);
R = J(4,4,0);
NRY = nrow(y);
sum = 0;
DO i=1 to NRY;
ERR= y[i, ]` - A - B*KSI0;
OMEGA=B*P0*B` + R;
OMEGA1=inv(OMEGA);
K=P0*B`* OMEGA1 ;
KSI=KSI0 + K*ERR;
P = P0 - K*B*P0;
KSI0=F*KSI;
P0 = F*P*F` + Q;
sum=sum + log(det(OMEGA)) + ERR`*OMEGA1*ERR;
end;
return(-1*sum);
finish;
use simudata var{y1 y2 y3 y4};
read all into y;
pr={ 0.9
0.8 0.8 0.8 0.8
0.95 0.9 0.9 0.9
2 2 2 2
1.5
1 1 1 1
};
z0 = j(1,5,0);
vz0= I(5);
;
logl = lik(pr);
print logl;
gamma=pr[1];
phi=pr[2:5];
beta=pr[6:9];
alpha=pr[10:13];
omega=pr[14];
sigma=pr[15:18];
optn = {1 2 };
con={ . . . . . 0.95 . . . 2.5 . . . . . . . .,
. . . . . 0.95 . . . 2.5 . . . . . . . .
};
call nlpdd(rc, xr,"lik", pr , optn, con) ;
gamma_e=xr[1];
phi_e=xr[2:5];
beta_e=xr[6:9];
alpha_e=xr[10:13];
omega_e=xr[14];
sigma_e=xr[15:18];
gamma_true={0.9};
phi_true={0.95,0.90,0.85,0.80};
beta_true={0.95, 1.1, 1.25,0.7};
alpha_true={2.5,2,1.5,2.5};
omega_true={2};
sigma_true={1,1,1,1};
print gamma_true gamma gamma_e;
print phi_true phi phi_e;
print beta_true beta beta_e;
print alpha_true alpha alpha_e;
print omega_true omega omega_e;
print sigma_true sigma sigma_e;
quit;
proc iml;
start lik(pr) global(y,z0,vz0);
f=diag(pr[1:5]);
a = j(nrow(f),1,0);
h=pr[6:9]||I(4);
b =pr[10:13] ;
var1=(pr[14:18]// {0.000,0.000,0.000,0.000} )##2;
var= diag(var1);
nz = nrow(f);
n = nrow(y);
k = ncol(y);
*print f a h b var z0 vz0;
const = k*log(8*atan(1));
call kalcvf(pred,vpred,filt,vfilt,y,0,a,f,b,h,var,z0,vz0);
et = y - pred*h` - repeat(b`,n);
*et = y - pred*h`;
sum1 = 0;
sum2 = 0;
do i = 1 to n;
vpred_i = vpred[(i-1)*nz+1:i*nz,];
et_i = et[i,];
ft = h*vpred_i*h` + var[nz+1:nz+k,nz+1:nz+k];
sum1 = sum1 + log(det(ft));
sum2 = sum2 + et_i*inv(ft)*et_i`;
end;
*return(-.5*const-.5*(sum1+sum2)/n);
return(-1*(sum1+sum2));
finish;
use simudata var{y1 y2 y3 y4};
read all into y;
pr={ 0.9
0.8 0.8 0.8 0.8
0.95 0.9 0.9 0.9
2 2 2 2
1.5
1 1 1 1
};
z0 = j(1,5,0);
vz0= I(5);
logl = lik(pr);
print logl;
optn = {1 2 };
con={ . . . . . 0.95 . . . 2.5 . . . . . . . .,
. . . . . 0.95 . . . 2.5 . . . . . . . .
};
call nlpdd(rc, xr,"lik", pr , optn, con) ;
logl = lik(xr);
print logl;
quit;



雷达卡



京公网安备 11010802022788号







