SAS PROGRAMMING HANDOUT #26 This is SAS MACRO which uses PROC IML to perform maximium likelihood estimation, using Newtons method to find the iterative solution. DATA KKM; INPUT CITY AGE CASES PYRS @@; LAGE=LOG((AGE-15)/35); LPYRS=LOG(PYRS); CARDS; 0 20 1 172675 1 20 4 181343 0 30 16 123065 1 30 38 146207 0 40 30 96216 1 40 119 121374 0 50 71 92051 1 50 221 111353 0 60 102 72159 1 60 259 83004 0 70 130 54722 1 70 310 55932 0 80 133 32185 1 80 226 29007 0 90 40 8328 1 90 65 7538 ; %MACRO POISSON(DATASET,COUNT,NUMBER,XVAR); PROC IML; USE &DATASET; READ ALL VAR{&XVAR} INTO XX; NR=NROW(XX); NC=NCOL(XX); NV=NC+1; READ ALL VAR{&COUNT} INTO Y; READ ALL VAR{&NUMBER} INTO P; BETA=J(NV,1,0); ONE=J(NR,1,1); XX=ONE||XX; DO ITER=1 TO 20 UNTIL (ADLL<.00001); EB=EXP(XX*BETA); PEB=P#EB; LL=ONE`*(Y#LOG(PEB)-PEB); LL0=ONE`*(Y#LOG(Y)-Y); DLL=XX`*(-PEB+Y); ADLL=MAX(ABS(DLL)); TWO=J(1,NV,1); DDLL=-XX`*((PEB*TWO)#(XX)); BETA=BETA-INV(DDLL)*DLL; BETAP=BETA`; PRINT BETAP (|FORMAT=8.4|) ITER ADLL (|FORMAT=12.4|); DEV=2*(LL0-LL); VAR=-INV(DDLL); SE=SQRT(VECDIAG(VAR)); ZVALUE=BETA/SE; LOWER=BETA-1.96*SE; UPPER=BETA+1.96*SE; CHISQ=ZVALUE##2; PVALUE=2*PROBNORM(-ABS(ZVALUE)); END; FINAL=BETA||SE||LOWER||UPPER||CHISQ||PVALUE; PRINT FINAL (|colname={ESTIMATE SE LOWER UPPER CHISQUARE PVALUE} rowname={intercept &xvar} FORMAT=12.4|); PRINT ITER ; PRINT DEV (| FORMAT=12.4 |) LL (| FORMAT=12.4 |) LL0 (| FORMAT=12.4 |); %MEND; %POISSON(KKM,CASES,PYRS,CITY LAGE); PROC GENMOD; MODEL CASES=CITY LAGE/D=POISSON OFFSET=LPYRS ITPRINT; RUN;