psnreg.src
来自「没有说明」· SRC 代码 · 共 718 行 · 第 1/2 页
SRC
718 行
endif;
if iswt;
cv = seqa(1,1,rows(minx)-1);
else;
cv = seqa(1,1,rows(minx));
endif;
if minc(minx[cv]-maxx[cv]) == 0;
errmsg = "ERROR: An independent variable has no variation.";
goto errout(error(73));
endif;
if wnused < nivar+1;
errmsg = "ERROR: Too few nonmissing observations.";
goto errout(error(31));
endif;
/* Initialize variables for iterations */
oldtrap = trapchk(1);
trap 1,1;
olsst = solpd(xy,xx); /* OLS approximation */
trap oldtrap,1;
if scalerr(olsst);
errmsg = "ERROR: X'X matrix is singular.";
goto errout(olsst);
endif;
if readdisk; /* only read if data won't fit in memory */
call seekr(fin,1);
endif;
/* ML Iterations for intercept only */
bstrt = meanlny;
if _qriter == 0 and __output;
print;
print "Restricted Model Iterations: ";;
endif;
bchng = 1000;
iter = 1;
clear f;
ky = upper(chrs(key)) $== "C";
do until abs(bchng) < __tol or iter > _qrmiter or ky;
tm = 0;
tzu = 0;
if readdisk;
call seekr(fin,start);
count = counter;
do while count < lastobs;
dta = readr(fin,nr);
count = count + rows(dta);
if count > lastobs;
dta = trimr(dta,0,count-lastobs);
endif;
if __miss == 1;
dta = packr(dta[.,varindx]);
else;
dta = dta[.,varindx];
endif;
if scalmiss(dta);
continue;
endif;
y = trunc(dta[.,1]);
xi = ones(rows(dta),1);
if iswt;
wt = dta[.,cols(dta)];
else;
wt = ones(rows(dta),1);
endif;
wx = xi.*wt;
gosub comput1;
endo;
clear dta;
else;
xi = ones(rows(y),1);
gosub comput1;
endif;
goto updat1;
comput1:
nparm = 1;
w = xi*bstrt;
lam = exp(w);
tzu = tzu+ (sumc((y-lam).*(wt.*xi)));
tm = tm+(sumc(wt.*xi.*xi.*lam));
return; /* end of compute subroutine */
updat1:
/* vcml = -invpd(tm);*/
oldtrap = trapchk(1);
trap 1,1;
bchng = solpd(tzu,tm);
trap oldtrap,1;
if scalerr(tm);
errmsg = "\nERROR: Iterations failed.";
goto errout(error(35));
endif;
bnew = bstrt + bchng;
/* bnew = bstrt - vcml*tzu;*/
/* bchng = bnew-bstrt; */
if __output;
if _qriter == 0;
print " " ftos(iter,"*.*lf",1,0);;
elseif _qriter == 1;
output off;
call psnreg_iter(iter,bstrt,bnew,"CONSTANT");
output on;
elseif _qriter == 2;
call psnreg_iter(iter,bstrt,bnew,"CONSTANT");
endif;
endif;
bstrt = bnew;
iter = iter + 1;
endo; /* end of ML iterations loop */
bonly = bstrt;
/* ML Iterations with indep variables */
bstrt = olsst;
if _qriter == 0 and __output;
print "\n Full Model Iterations: ";;
endif;
bchng = 1000;
iter = 1;
clear f;
ky = upper(chrs(key)) $== "C";
do until abs(bchng) < __tol or iter > _qrmiter or ky;
tm = zeros(nivar,nivar);
tzu = zeros(nivar,1);
if readdisk;
call seekr(fin,start);
count = counter;
do while count < lastobs;
dta = readr(fin,nr);
count = count + rows(dta);
if count > lastobs;
dta = trimr(dta,0,count-lastobs);
endif;
if __miss == 1;
dta = packr(dta[.,varindx]);
else;
dta = dta[.,varindx];
endif;
if scalmiss(dta);
continue;
endif;
y = trunc(dta[.,1]);
x = ones(rows(dta),1)~trimr(dta',1,0)';
if iswt;
wt = dta[.,cols(dta)];
x = trimr(x',0,1)';
else;
wt = ones(rows(dta),1);
endif;
wx = x.*wt;
gosub compute;
endo;
clear dta;
else;
gosub compute;
endif;
goto update;
compute:
nparm = rows(bstrt);
w = x*bstrt;
lam = exp(w);
tzu = tzu+ (sumc((y-lam).*wx));
tm = tm+((lam.*x)'wx);
return; /* end of compute subroutine */
update:
vcml = -invpd(tm);
bnew = bstrt - vcml*tzu;
bchng = bnew-bstrt;
if __output;
if _qriter == 0;
print " " ftos(iter,"*.*lf",1,0);;
elseif _qriter == 1;
output off;
call psnreg_iter(iter,bstrt,bnew,"CONSTANT");
output on;
elseif _qriter == 2;
call psnreg_iter(iter,bstrt,bnew,"CONSTANT");
endif;
endif;
bstrt = bnew;
iter = iter + 1;
ky = upper(chrs(key)) $== "C";
endo; /* end of ML iterations loop */
vcml = -vcml;
sdml = sqrt(diag(vcml));
tml = bstrt./sdml;
pml = 2*cdfnc(abs(tml));
tol = maxc(bchng); /* tolerance at convergence */
print;
print;
if __output;
print ("ESTIMATES FROM POISSON REGRESSION ON: " $+ ylbl);
print;
if iter > _qrmiter;
print " WARNING: Maximum iterations - " ftos(iter-1,"*.*lf",
1,0) " - exceeded";
elseif ky;
print " WARNING: Convergence forced at " ftos(iter-1,"*.*lf"
,1,0);;
print " Newton-Raphson iterations.";
else;
print " Convergence after " ftos(iter-1,"*.*lf",1,0);;
print " Newton-Raphson iterations.";
endif;
print " Tolerance of " ftos(tol,"*.*lf",8,7) " achieved.";
print;
print " Poisson Std.";
print " Variable Estimate Error t-value p>|t|";
print " -----------------------------------------------------";
mask = 0~1~1~1~1;
let fmt[5,3] = "*.*lf " 10 8 "*.*lf " 12 5 "*.*lf " 10 4 "*.*lf "
10 2 "*.*lf " 10 3;
omat = xlbl~bstrt~sdml~tml~pml;
call printfm(omat,mask,fmt);
elseif iter > _qrmiter;
errorlog "WARNING: Maximum iterations exceeded";
elseif ky;
errorlog "WARNING: convergence forced";
endif;
/* Compute likelihood ratio statistics */
/* log-likelihood for all parameters */
llfull = 0;
/* log-likelihood with only intercepts */
llrest = 0;
if readdisk;
call seekr(fin,start);
count = counter;
do while count < lastobs;
dta = readr(fin,nr);
count = count + rows(dta);
if count > lastobs;
dta = trimr(dta,0,count-lastobs);
endif;
if __miss == 1;
dta = packr(dta[.,varindx]);
else;
dta = dta[.,varindx];
endif;
if scalmiss(dta);
continue;
endif;
y = trunc(dta[.,1]);
x = ones(rows(dta),1)~trimr(dta',1,0)';
if iswt;
wt = dta[.,cols(dta)];
x = trimr(x',0,1)';
else;
wt = ones(rows(dta),1);
endif;
clear dta;
gosub getll;
endo;
else;
gosub getll;
endif;
/* likelihood ratio test statistics - Maddalla, p.40 */
lrx2 = 2*(llfull - llrest);
df = (nivar-1);
lrxp = cdfchic(lrx2,df);
/* McFadden's pseudo-R2 - Madalla, p.40 */
mcfr2 = abs(1-(llfull/llrest));
if __output;
print;
print "MEASURES OF FIT:";
print;
print (" Likelihood Ratio Chi-square: " $+ ftos(lrx2,"*"\
".*lf",10,4));
print (" with " $+ ftos(df,"*.*lf",1,0) $+ " d.f., prob=" $+
ftos(lrxp,"*.*lf",3,4));
print (" -2 Log Likelihood for full model: " $+
ftos(-2*llfull,"*.*lf",10,4));
print (" -2 Log likelihood for restricted model: " $+
ftos(-2*llrest,"*.*lf",10,4));
print (" Madalla's pseudo R-square: " $+ ftos(mcfr2,""\
"*.*lf",10,4));
endif;
goto done;
getll:
w = x*bstrt;
lam = exp(w);
llfull = llfull+sumc(wt.*(-lam + y.*w - ln(y!)));
w = ones(rows(x),1)*bonly;
lam = exp(w);
llrest = llrest+sumc(wt.*(-lam + y.*w - ln(y!)));
return;
done:
if fin > 0;
fin = close(fin);
endif;
ndpclex;
lrx2 = lrx2|-2*llfull|-2*llrest;
retp(ylbl|xlbl,bstrt,vcml,ndtran,meanx,sdx,lrx2,df,tol);
errout:
pop err;
cls;
if fin > 0;
fin = close(fin);
endif;
ndpclex;
if not trapchk(1);
errorlog errmsg;
print;
end;
endif;
retp(0,err,0,0,0,0,0,0,99999);
endp; /* psnreg */
proc(0) = psnreg_iter(iter,st,en,lbl);
local omat,fmt,mask,st0,i;
print;
print "ITERATION " ftos(iter,"*.*lf",1,0) ":";
print;
print " Parameter Start Value End Value % Change";
print " -----------------------------------------------------";
mask = 0~1~1~1;
let fmt[4,3] = "*.*lf " 10 8 "*.*lf " 16 8 "*.*lf " 16 8 "*.*lf " 11 5;
i = 0;
st0 = st;
do until i == rows(st);
i = i+1;
if st[i]/=0;
st0[i] = 100*(en[i]-st[i])/st[i];
else;
st0[i] = -999;
endif;
endo;
omat = lbl~st~en~st0;
call printfm(omat,mask,fmt);
if rows(omat) == 1;
print;
endif;
endp; /* psnreg_iter */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?