小弟最近在学习simulated maximum likelihood estimation,在做最简单的一个random coefficient linear model的时候遇到了一些问题,请大家帮我解答一下。我参照greene第七版example 15.11的做法编了程序来estimate自己造的一组数据,但是发现group-level variance完全没有办法估算出来。msl估算的结果与简单ols的结果完全一致,请大家帮我看看问题出在了哪里?感谢!
程序如下:
new;cls;
library maxlik;
maxset;
n=1000;
ndraw=1000;
group=10;
seed1=1234;
seed2=2222;
/*generating group-level variance*/
mu0=rndu(group,1);
mu0=3*(mu0-meanc(mu0))/stdc(mu0);
id=seqa(1,1,group);
id=reshape(id,n,1);
mu=mu0[id];
/*theta=theta0;data=x~y;r=1;i=1;*/
/*generating data, y_it=x_it*(b_0+sigma_u*w_i)+sigma_ksi_it, w_i is the unobserved random variance*/
x=rndns(n,1,seed1)*10~rndus(n,1,seed2)*2;
x=ones(n,1)~x;
b0_true=2|5|4;
y=x*b0_true+mu+rndn(n,1)*4;
/*random draws for unobserved heterogeneity*/
draw=rndn(group,ndraw);
theta0=1|1|1|1|1; /*initial values*/
/*loglikelihood function*/
proc ll(theta,data);
local b, w, sigma, loglik, ind;
b=theta[1:3];
w=theta[4];
sigma=theta[5];
loglik=zeros(group,1);
for r(1,ndraw,1);
for i(1, group,1);
ind=indexcat(id,i);
loglik=loglik+exp(sumc( -(data[ind,cols(data)]-data[ind,1:cols(data)-1]*b-draw[i,r]*w).^2/(2*sigma^2)-0.5*ln(2*pi*sigma^2) )/1000);
endfor;
endfor;
retp(sumc(ln(loglik/ndraw)));
endp;
/*gradient function*/
proc gr(theta,data);
local b, w, sigma, loglik, gra, gr12, gr3, gr4, llk, ind;
b=theta[1:3];
w=theta[4];
sigma=theta[5];
gra=zeros(group,rows(theta));
loglik=zeros(group,1);
for r(1,ndraw,1);
for i(1, group,1); /*aggregating over t*/
ind=indexcat(id,i);
llk=exp(sumc(-(data[ind,cols(data)]-data[ind,1:cols(data)-1]*b-draw[i,r]*w).^2/(2*sigma^2)-0.5*ln(2*pi*sigma^2))/1000);
gr12=sumc((data[ind,1:cols(data)-1].*(data[ind,cols(data)]-data[ind,1:cols(data)-1]*b-w*draw[i,r])/sigma^2)/1000)*llk; /*gradient for beta*/
gr3=sumc((draw[i,r]*(data[ind,cols(data)]-data[ind,1:cols(data)-1]*b-w*draw[i,r])/sigma^2)/1000)*llk; /*gradient for sigma_u*/
gr4=sumc(((data[ind,cols(data)]-data[ind,1:cols(data)-1]*b-w*draw[i,r]).^2/sigma^3-1/sigma)/1000)*llk; /*gradient for sigma_ksi*/
loglik=loglik+llk;
gra[i,.]=gra[i,.]+(gr12'~gr3~gr4);
endfor;
endfor;
retp(sumc((gra/ndraw)./(loglik/ndraw))');
endp;
/*coding check*/
/*theta3=2|5|4|0|5;theta4=2|5|4|3|4;
sumc(ll(theta3,x~y));sumc(ll(theta4,x~y));
if sumc(ll(theta3,x~y))<sumc(ll(theta4,x~y));
print "right";
else;
print "wrong";
endif;*/
/*gr(theta0,x~y);*/
_max_Algorithm=2;
_max_GradProc=&gr;
_max_GradCheckTol=1e-3;
{x0,f,g,cov,retcode}=maxlik(x~y,0,&ll,theta0);
call maxprt(x0,f,g,cov,retcode);