尤度比検定、Wald検定、LM検定 (プログラム)

// LR test, Wald test, LM test after Maximum likelihood estimation
#include<oxstd.h>
#include<oxfloat.h> // to use M_2PI
#import<maximize>   // to use maximization package

static decl s_mX, s_vY; // static variable to use in the functions
// Unconstrained Loglikelihood Function
fLoglik(const vP, const adFunc, const avScore, const amHess)
{
decl ck,cnobs;decl dsum,dsig2;decl vb,ve;
 cnobs=rows(s_vY);ck=rows(vP);
 vb=vP[0:ck-2];dsig2=vP[ck-1];ve=s_vY-s_mX*vb;
 dsum=-sumsqrc(ve)/(2*dsig2);
 adFunc[0]=-0.5*cnobs*log(M_2PI*dsig2)+dsum;
if(avScore) // provides analytical 1st derivative
 {
 (avScore[0])[0:ck-2]=s_mX'*ve/dsig2;
 (avScore[0])[ck-1]=-0.5*cnobs/dsig2+sumsqrc(ve)/(2*dsig2^2);
 }
if(amHess) // provides expected value of hessian matrix
 {
 (amHess[0])=zeros(ck,ck);
 (amHess[0])[0:ck-2][0:ck-2]=-s_mX'*s_mX/dsig2;
 (amHess[0])[ck-1][ck-1]=-cnobs/(2*dsig2^2);
 }
 return 1;
}
// Constrained Loglikelihood Function
fLoglikC(const vP, const adFunc, const avScore, const amHess)
{
decl ck,cnobs;decl dsum,dsig2;decl vb,ve;
 cnobs=rows(s_vY);ck=rows(vP);
 vb=vP[0:ck-2]|1-vP[2]-vP[3];dsig2=vP[ck-1];
 ve=s_vY-s_mX*vb;dsum=-sumsqrc(ve)/(2*dsig2);
 adFunc[0]=-0.5*cnobs*log(M_2PI*dsig2)+dsum;
return 1;
}
main()
{
decl ck,cnobs; // scalar (count, number of ...)
decl dfunc,dlm,ds2,dssr,dloglr,dloglu,dlrt; // scalar (double)
decl mhess,mi,msigma,mx; // matrix
decl vp,vpvalue,vse,vscore,vstat,vzvalue; // vector
decl file;
 // Read file
 file = fopen("nerlove.asc");fscan(file,"%#m",145,5,&mx);
 fclose(file); mx=log(mx);
//
 println("Maximum Likelihood Esimation using BFGS method.");
 s_mX=mx[][1:2]~mx[][4]~mx[][3];  // X matrix: independent variable
 s_mX=ones(145,1)~s_mX; //          + constant term
 s_vY=mx[][0]; // Y vector: dependent variable
 cnobs=rows(s_mX); // number of observations
 ck=columns(s_mX)+1; // number of parameters (including constant term & sigma^2)
 vp=<0;0;0;0;0;10>; // initial values

println("*************************************************");
println("Unconstrained Model");
println("*************************************************");
//
// Unconstrained maximum likelihood estimation
// y=b1+b2*x2+b3*x3+b4*x4+b5*x5
//
 MaxBFGS(fLoglik,&vp,&dfunc,0,TRUE);
 dloglu=dfunc; // log L (unconstrained)
 vscore=zeros(ck,1); // score vector (d logL/d theta)
 fLoglik(vp,&dfunc,&vscore,&mhess);
 mi=-mhess;msigma=invert(mi);
 vse=sqrt(diagonal(msigma))';
 vzvalue=vp./vse; // z-value for H0: parameter=0
 vpvalue=tailn(fabs(vzvalue)); 
 println("%r",{"beta1","beta2","beta3","beta4","beta5","sigma^2"},
         "%c",{"est. coeff.", "std. err.","z-value", "p-value"},
         "%10.6",vp~vse~vzvalue~vpvalue);
 // Wald Test
 decl dg,vg,dwald; // g & G
  dg=vp[2]+vp[3]+vp[4]-1;vg=<0,0,1,1,1,0>;
  dwald=dg*invert(vg*msigma*vg')*dg;

println("*************************************************");
println("Constrained Model (B3+B4+B5=1)");
println("*************************************************");//
// Constrained maximum likelihood estimation
// y=b1+b2*x2+b3*x3+b4*x4+(1-b3-b4)*x5
//
 decl vpc;
 vpc=vp[0:3]|vp[5];
 MaxBFGS(fLoglikC,&vpc,&dfunc,0,TRUE);
 dloglr=dfunc; // log L (constrained)
 Num2Derivative(fLoglikC,vpc,&mhess); // Numerical Hessian Matrix
 mi=-mhess;msigma=invert(mi); 
 vse=sqrt(diagonal(msigma))';
 vzvalue=vpc./vse; // z-value for H0: parameter=0
 vpvalue=tailn(fabs(vzvalue)); 
 println("%r",{"beta1","beta2","beta3","beta4","sigma^2"},
         "%c",{"est. coeff.", "std. err.","z-value", "p-value"},
         "%10.6",vpc~vse~vzvalue~vpvalue);
 dlrt=-2*(dloglr-dloglu);
 // LM Test
  vp=vpc[0:3]|1.0-vpc[2]-vpc[3]| vpc[4];
  fLoglik(vp,&dfunc,&vscore,&mhess);
  mi=-mhess;msigma=invert(mi);
  dlm=vscore'*msigma*vscore;
  vstat= dlm | dlrt | dwald;vpvalue=tailchi(vstat,1);
println("*************************************************");
println("TEST H0:B3+B4+B5=1 vs H1:B3+B4+B5 =! 1");
println("*************************************************");

 println("%r",{"LM test", "Likelihood ratio test", "Wald test"},
         "%c",{"Statistic", "p-value"},
         "%10.6",vstat~vpvalue);
}