OPTIONS NOCENTER; TITLE 'Nonlinear least-squares estimation procedure'; data traject;set thing.panel80; if (partyid1 ge 5) then vote1=0;else vote1=1; vote2=vote-1;if (vote2 gt 1) then delete; if ((vote1=1) and (vote2=0)) then poltype=1;else poltype=2; *if (partyid1 ge 5) then context=prepcont; *if (partyid1 le 3) then context=pdemcont; *if (partyid1=4) then delete; if (rfriends=1) then neighbor=-3;else neighbor=.; if (mfriends=1) then neighbor=0; if (dfriends=1) then neighbor=3; RAEsF=1-((prepcont**2)+(pdemcont**2)); convRAE=((prepcont**2)+(pdemcont**2)); context1=(RAEsF-0.40)/(0.81-0.40); context2=((convRAE-0.19)/(0.59-0.19)); **** selecting only mixed friends people; *if mfriends=1; **** context choice; context=pdemcont; **** selecting only carter to reagan switchers; *if poltype=1; ****rescales data; array b reafeel1 reafeel3 carfeel1 carfeel3 dempart1 dempart3; do over b;b=b/100;end; PIDvote=1-((partyid1-1)/6); ***deletes problem data***; prob=1; array a vote1 vote2 reafeel1 reafeel3 carfeel1 carfeel3 partyid1 dempart1 dempart3; do over a;if (a=.) then prob=.;end; if prob=1; **************************; *** variable transforms; changeC=carfeel3-carfeel1; changeR=reafeel3-reafeel1; changeD=dempart3-dempart1; **************************; **** renaming some variables for IML use; l=carfeel1; lnext=carfeel3; r=reafeel1;rnext=reafeel3; c=dempart1;cnext=dempart3; n=0;nnext=0; Proc Standard OUT=traject MEAN=0 STD=1; VAR context; Proc Freq; Tables vote1*vote2; Proc Means Data=traject; *Proc Contents; Proc Reg; model changeC=changeR changeD partyid1; model changeC=changeR changeD; Proc Reg; model carfeel3=carfeel1 changeR changeD partyid1; model carfeel3=carfeel1 changeR changeD; PROC IML; RESET; USE traject; READ ALL; SHOW NAMES; *quit; eligave=(1); eligtot=sum(eligave); pop=1; weight=eligave/eligtot; *totpop=eligtot; totpop=NROW(r); RSQDEV=pop#((rnext-r)##2); RSSDEV=RSQDEV(|+,|); LSQDEV=pop#((lnext-l)##2); LSSDEV=LSQDEV(|+,|); CSQDEV=pop#((cnext-c)##2); CSSDEV=CSQDEV(|+,|); NSQDEV=pop#((NNEXT-N)##2); NSSDEV=NSQDEV(|+,|); ***To remember the initial conditions; R0=R;C0=C;L0=L;N0=N; *quit; * In this program, there are nine state variables; * They are r, rnext, c, cnext, l, lnext, n, nnext; * Also, population and conditioning variables may be needed; *******************************************************; *** THIS COUNTS THE NUMBER OF CASES ****; CASES=NROW(R); PRINT CASES rssdev lssdev cssdev; ****************************************; zing=0;print zing; x1=uniform(zing);print x1; *STOP; *******************************************************; START; *This section sets conditioning variables; DO C44 = 4 TO 4 ; IF C44 = 1 THEN DO; D1 = PROT; END; IF C44 = 2 THEN DO; D1 = CATH; END; IF C44 = 3 THEN DO; D1 = URBAN; END; IF C44 = 4 THEN DO; D1 = context; END; *****************************************************; ****INITIAL PARAMETER GUESSES************************; *****************************************************; mag1=0.50; pp=J(30,1,0); Do m88=1 to 30; pp[m88]=UNIFORM(x1); * pp[m88]=(2#(UNIFORM(x1)))-1; pp[m88]=mag1#pp[m88]; End; *** special cases for select parameters; pp[5]=6; pp[6]=0.5; pp[7]=1; pp[8]=1; pp[9]=0.05; pp[11]=1; pp[12]=0; *** put unconditioned parameter estimates here; * pp[1] = 0.26724; * pp[2] = -0.38401; * pp[3] = 0.19066; * pp[4] = -0.38721; * pp[5] = 5.98186; * pp[6] = 0.83441; * pp[7] = 1.03085; * pp[8] = 0.88157; * pp[9] = 0.41774; * pp[10]= -0.13497; * pp[11]= 1.24597; *print pp; *stop; *****************************************************; * Some necessary and useful numbers; Y99 = 1;GCOUNT=0; I = 0.00001 ; h = 0.1 ; z1=J(30,1, 0.001); p=J(30,1,0); a=J(30,1,0); parmfit=J(30,1,0); csp=J(30,1,0); sim=J(30,1,0); chisq=J(30,1,0); * pnum is the total number of parameters in the model; pnum=12; * parmeq identifies which equation each parameter is in; parmeq={1,1,2,2,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0}; TESTLIST=0; MWISHO = 0; ITCOUNT = 0 ; TE = 0 ; TE2=0; TIMEUP=0; E1 = 0 ; DP1 = 0 ; * Make typedata=1 for proportions and 2 for individuals; typedata=2; D2 = 1 ; D3 = 1 ; **********************************************************; ***** IF D3=1 YOU GET THE UNCONDITIONAL MODEL *******; ***** IF D3=0 YOU GET THE CONDITIONED MODEL *******; IF D3 = 1 THEN DO; D1 = 1 ; D2 = 0 ; p=pp; Do m88=1 to 30; pp[m88]=0; END;END; IF D3=0 THEN DO; *Use the following assignments if you want random conditioned initial guesses; goto norand2; MAG2=0.30; Do m88=1 to 30; * p[m88]=UNIFORM(x1); p[m88]=(2#(UNIFORM(x1)))-1; p[m88]=mag2#p[m88]; End; norand2: END; **********************************************************; GOTO ESTIMATE; **********************************************************; **** THE FOLLOWING SUBROUTINE IS A FOURTH-ORDER **** RUNGE-KUTTA ALGORITHM *****; **********************************************************; MODELFIT: IF DP1=1 THEN DO; PRINT 'MODELFIT BEGINNING'; END; R=R0;C=C0;L=L0;N=N0; DO U1=1 to 10; time=u1; if (u1=1) then do;timeone=1;end; m2=R;m1=C;m3=L; LINK EQS; RK1=h#DRDT;CK1=h#DCDT;LK1=h#DLDT; m2=R+(.5#RK1);m1=C+(.5#CK1);m3=L+(.5#LK1); LINK EQS; RK2=h#DRDT;CK2=h#DCDT;LK2=h#DLDT; m2=R+(.5#RK2);m1=C+(.5#CK2);m3=L+(.5#LK2); LINK EQS; RK3=h#DRDT;CK3=h#DCDT;LK3=h#DLDT; m2=R + RK3;m1=C + CK3;m3=L + LK3; LINK EQS; RK4=h#DRDT;CK4=h#DCDT;LK4=h#DLDT; RNEW=R+((1/6)#(RK1+(2#RK2)+(2#RK3)+RK4)); CNEW=C+((1/6)#(CK1+(2#CK2)+(2#CK3)+CK4)); LNEW=L+((1/6)#(LK1+(2#LK2)+(2#LK3)+LK4)); NNEW=N; R=RNEW;C=CNEW;L=LNEW; N=NNEW; IF E1=1 THEN link printraj; END; if (typedata=1) then link propdata; if (typedata=2) then link indidata; link compile1; link rsq; IF DP1=1 THEN DO; PRINT 'MODELFIT ENDING'; END; RETURN; ******************************************; ***** HERE IS WHERE THE ACTUAL MODEL **; ***** EQUATIONS ARE PLACED. ****; EQS: * THE VARIABLES ARE M1(C), M2(R), and M3(L); link special1; drdt = (pp[1]+(p[1]#D1))+((pp[2]+(p[2]#D1))#m2); dcdt = (pp[3]+(p[3]#D1))+((pp[4]+(p[4]#D1))#m1); dldt = (pp[9]+(p[9]#D1))#((((pp[5]+(p[5]#D1)) #((pp[10]+(p[10]#D1))+w2) #(1-(pp[11]+(p[11]#D1))#w2)#(m3-(pp[6]+(p[6]#D1)))) -((pp[7]+(p[7]#D1)) #((m3-(pp[6]+(p[6]#D1)))##3)) +((pp[8]+(p[8]#D1))#(w1+(pp[12]+(p[12]#D1))))) - m3); RETURN; special1: w1=(1+m1-m2)/2; w2=(m2+m1)/2; return; ******************************************; * Prints the variable trajectories; printraj: PRINT 'TRAJECTORY FOR PREDICTED R, C, AND L'; R1=eligave#R;C1=eligave#C;L1=eligave#L; TRAJECT=R1||(C1||L1); TRAJ=TRAJECT(|+,|); TRAJMEAN=TRAJ/TOTPOP; PRINT TRAJMEAN; Return; *******************************************; *** Computes predicted values for use in chi square routine; propdata: R2=eligave#R;C2=eligave#C;L2=eligave#L;N2=eligave#N; PRED=R2||(C2||(L2||N2)); PREDIC=PRED(|+,|); PREDICT=PREDIC/TOTPOP; IF DP1=1 THEN DO; PRINT 'PREDICTED RIGHTIST, CENTRIST, LEFTIST, AND NONVOTER MEANS'; PRINT PREDICT; END; Return; indidata: number=nrow(R); Rpredvot=J(number,1,0); Lpredvot=J(number,1,0); count=1; do until (count>number); if (L[count] <= R[count]) then Rpredvot[count]=1; else Rpredvot[count]=0; if (L[count] > R[count]) then Lpredvot[count]=1; else Lpredvot[count]=0; count=count+1; end; Rvotes=sum(Rpredvot); Lvotes=sum(Lpredvot); PREDIC=(Rvotes||Lvotes); PREDICT=(Rvotes||Lvotes); IF DP1=1 THEN DO; PRINT 'PREDICTED NUMBER OF RVOTES AND LVOTES'; PRINT PREDICT; END; Return; ******************************************; ****** THE FOLLOWING ARE THE SUBROUTINES ****** FOR THE R-SQUARES AND THE SAVING ****** OF THE BEST PARAMETER ESTIMATES; ******************************************; compile1: if timeone=1 then do; resr=0#pop;resc=0#pop;resl=0#pop;resn=0#pop; timeone=0;end; resr=(pop#((rnext-rnew)##2)); resc=(pop#((cnext-cnew)##2)); resl=(pop#((lnext-lnew)##2)); resn=(pop#((nnext-nnew)##2)); return; RSQ: RESIDR=sum(resr); RESIDL=sum(resl); RESIDC=sum(resc); RESIDN=sum(resn); RRSQUARE=1-(RESIDR/RSSDEV); LRSQUARE=1-(RESIDL/LSSDEV); CRSQUARE=1-(RESIDC/CSSDEV); NRSQUARE=0;*NRSQUARE=1-(RESIDN/NSSDEV); *RSQUARE=(RRSQUARE+LRSQUARE+CRSQUARE+NRSQUARE)/4; RSQUARE=(RRSQUARE+CRSQUARE+LRSQUARE)/3; *RSQUARE=(RRSQUARE+CRSQUARE)/2; IF DP1=1 THEN DO; *PRINT 'SQUARED, SUMMED, AND WEIGHTED RESIDUALS'; *PRINT 'RESIDR RESIDC RESIDL RESIDN'; *SQRESID=RESIDR||(RESIDC||(RESIDL||RESIDN)); *PRINT SQRESID; PRINT 'RRSQUARE CRSQUARE LRSQUARE NRSQUARE RSQUARE'; RSQFITS=RRSQUARE||(CRSQUARE||(LRSQUARE||(NRSQUARE||RSQUARE))); PRINT RSQFITS; END; RETURN; **************************************************************; BESTPAR: bestp=p; BESTRSQ = RSQUARE; BESTRRSQ = RRSQUARE; BESTCRSQ = CRSQUARE; BESTLRSQ = LRSQUARE; PARMS = p; IF DP1 = 1 THEN DO; PRINT , PARMS; END; RETURN; ********************************************************; SURFACE: * DP1 = 0 ; PRINT 'SURFACE' 'BEGINNING'; PRINT 'SURFACE' 'BEGINNING'; Do m88=1 to pnum; p[m88]=p[m88] - I; link modelfit; link putfit; p[m88]=p[m88] + (2#I); link modelfit; If (parmeq[m88]=1) then do;parmfit[m88]=(rrsquare - fit2);end; If (parmeq[m88]=2) then do;parmfit[m88]=(crsquare - fit3);end; If (parmeq[m88]=3) then do;parmfit[m88]=(lrsquare - fit4);end; p[m88]=p[m88]-I; End; PARTIALS = PARMFIT / ( 2 # I ); TEST = SSQ(PARTIALS); TESTLIST=(TESTLIST//TEST); PRINT test, p, PARTIALS; LINK MODELFIT; PRINT 'RRSQUARE' 'CRSQUARE' 'LRSQUARE' 'RSQUARE'; RSQFITS=RRSQUARE||(CRSQUARE||(LRSQUARE||RSQUARE)); PRINT , RSQFITS; PRINT 'SURFACE' 'ENDING'; DP1 = 0 ; RETURN; PUTFIT: FIT1 = RSQUARE; FIT2 = RRSQUARE; FIT3 = CRSQUARE; FIT4 = LRSQUARE; RETURN; PUTPRED: PREDIC1 = PREDIC; PREDS1 = RSQUARE; RETURN; CSFITS: if (typedata=1) then do; PREDIC1=PREDIC1+1;PREDIC=PREDIC+1;end; CHSQALL1 = ((PREDIC - PREDIC1)##2) / abs(PREDIC1); CHSQALL = SUM(CHSQALL1); SIMALL = PREDS1 - RSQUARE; PRINT CHSQALL SIMALL; RETURN; ESTIMATE: DP1 = 1;TE = 1;E1 = 0; print p; LINK MODELFIT;TE = 0;E1 = 0; * STOP; * GOTO CHISQUAR; * GOTO TATA; LINK BESTPAR; DP1 = 0 ; DO Y99 = 1 TO 30; ZCOUNT = 0 ; ITCOUNT = 0 ; LINK SURFACE; * DP1 = 1; Z2 = Z1; * print test, z2; PRINT 'ESTIMATE' 'BEGINNING'; E1 = 0 ; LINK MODELFIT; E1 = 0 ; BEGIN: FIT1 = RSQUARE; NEWPARM = p + ( PARTIALS # Z2 ); p = NEWPARM; LINK MODELFIT; IF RSQUARE > FIT1 THEN DO; LINK BESTPAR; END; ITCOUNT = ITCOUNT + 1 ; IF RSQUARE > FIT1 THEN GOTO BEGIN; IF ZCOUNT<2 THEN DO; PRINT ITCOUNT;END; ITCOUNT = 0 ; ZCOUNT = ZCOUNT + 1 ; * PRINT , ZCOUNT; Z2 = Z2 / 10 ; IF ZCOUNT > 4 THEN GOTO JUMP1; p=bestp; GOTO BEGIN; JUMP1: p=bestp; END; PRINT 'ESTIMATE' 'ENDING'; TE = 1 ;LINK MODELFIT;TE = 0; GOTO CHISQUAR; *********************************************************; CHISQUAR: TE2=1; do m88=1 to pnum; csp[m88] = p[m88];LINK MODELFIT;LINK PUTPRED; p[m88] = 0 ;LINK MODELFIT;LINK CSFITS; CHISQ[m88] = CHSQALL;SIM[m88]=SIMALL;p[m88] = csp[m88]; end; **** NOW THE OVERALL MODEL CHI SQUARE; csp = p;LINK MODELFIT;LINK PUTPRED; do m88=1 to 11; p[m88] = 0 ;end; LINK MODELFIT;LINK CSFITS; CSMODEL = CHSQALL;SIMMODEL=SIMALL;p = csp; *********************************************************; **** PREPARATION FOR OUTPUT ****************************; *********************************************************; DP1 = 1 ; LINK MODELFIT; DP1 = 0 ; ALLFIT1 = ( RRSQUARE || (CRSQUARE||(LRSQUARE||RSQUARE))); SYSPAR = bestp; SYSCHI = chisq; SYSSIM = sim; ALLFITS = SHAPE( ALLFIT1 ,0 , 1 ); SYSCHISQ = SHAPE( SYSCHI ,0 , 1 ); SYSSIMS = SHAPE( SYSSIM ,0 , 1 ); SYSPARMS = SHAPE( SYSPAR ,0 , 1 ); SYSEST = (SYSPARMS||(SYSCHISQ||SYSSIMS)); PRINT , C44 , SYSPARMS , SYSCHISQ , SYSEST , TESTLIST; PRINT CSMODEL, SIMMODEL; DP1=1; MWISHO = 1; LINK MODELFIT; DP1=0; STUFF={PARMS CHISQ SIMON}; ROW = {'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' 'p9' 'p10' 'p11' 'p12' 'p13' 'p14' 'p15' 'p16' 'p17' 'p18' 'p19' 'p20' 'p21' 'p22' 'p23' 'p24' 'p25' 'p26' 'p27' 'p28' 'p29' 'p30'}; CREATE BETAS FROM SYSEST (|COLNAME=STUFF ROWNAME=ROW|); APPEND FROM SYSEST (|ROWNAME=ROW|); CLOSE BETAS; FIT={'FITS'}; ROWW = {'eq1' 'eq2' 'eq3' 'ave'}; CREATE FITS FROM ALLFITS (|COLNAME=FIT ROWNAME=ROWW|); APPEND FROM ALLFITS (|ROWNAME=ROWW|); CLOSE FITS; END; FINISH;RUN; QUIT; PROC PRINT DATA=BETAS;VAR ROW PARMS CHISQ SIMON; PROC PRINT DATA=FITS;VAR ROWW FITS;