General Statistics Examples |
This example fits a linear model to a function of the response probabilities
/* Categorical Linear Models */ /* by Least Squares and Maximum Likelihood */ /* CATLIN */ /* Input: */ /* n the s by p matrix of response counts */ /* x the s by r design matrix */ start catlin; /*---find dimensions---*/ s=nrow(n); /* number of populations */ r=ncol(n); /* number of responses */ q=r-1; /* number of function values */ d=ncol(x); /* number of design parameters */ qd=q*d; /* total number of parameters */ /*---get probability estimates---*/ rown=n[,+]; /* row totals */ pr=n/(rown*repeat(1,1,r)); /* probability estimates */ p=shape(pr[,1:q] ,0,1); /* cut and shaped to vector */ print "INITIAL PROBABILITY ESTIMATES" ,pr; /* estimate by the GSK method */ /* function of probabilities */ f=log(p)-log(pr[,r])@repeat(1,q,1); /* inverse covariance of f */ si=(diag(p)-p*p`)#(diag(rown)@repeat(1,q,q)); z=x@i(q); /* expanded design matrix */ h=z`*si*z; /* crossproducts matrix */ g=z`*si*f; /* cross with f */ beta=solve(h,g); /* least squares solution */ stderr=sqrt(vecdiag(inv(h))); /* standard errors */ run prob; print ,"GSK ESTIMATES" , beta stderr ,pi; /* iterations for ML solution */ crit=1; do it=1 to 8 while(crit>.0005); /* iterate until converge */ /* block diagonal weighting */ si=(diag(pi)-pi*pi`)#(diag(rown)@repeat(1,q,q)); g=z`*(rown@repeat(1,q,1)#(p-pi)); /* gradient */ h=z`*si*z; /* hessian */ delta=solve(h,g); /* solve for correction */ beta=beta+delta; /* apply the correction */ run prob; /* compute prob estimates */ crit=max(abs(delta)); /* convergence criterion */ end; stderr=sqrt(vecdiag(inv(h))); /* standard errors */ print , "ML Estimates", beta stderr, pi; print , "Iterations" it "Criterion" crit; finish catlin;
/* subroutine to compute new prob estimates @ parameters */ start prob; la=exp(x*shape(beta,0,q)); pi=la/((1+la[,+] )*repeat(1,1,q)); pi=shape(pi,0,1); finish prob; /*---prepare frequency data and design matrix---*/ n= { 58 11 05, 75 19 07, 49 14 10, 58 17 08, 33 18 15, 45 22 10, 15 13 15, 39 22 18, 04 12 17, 05 15 08}; /* frequency counts*/ x= { 1 1 1 0 0 0, 1 -1 1 0 0 0, 1 1 0 1 0 0, 1 -1 0 1 0 0, 1 1 0 0 1 0, 1 -1 0 0 1 0, 1 1 0 0 0 1, 1 -1 0 0 0 1, 1 1 -1 -1 -1 -1, 1 -1 -1 -1 -1 -1}; /* design matrix*/ run catlin;
The maximum likelihood estimates are shown in Output 8.5.1.
Output 8.5.1: Maximum Likelihood Estimates
Copyright © 2009 by SAS Institute Inc., Cary, NC, USA. All rights reserved.