* MACRO PROGRAMS TO COMPUTE TOTAL R2, PSEUDO R2 AND LIKELIHOOD RATIO TESTS USING MIXED; *******************************************************************************************; * To use TotalR2 macro; * DV = Case-sensitive name of dependent variable; * PredFewer = Name of OUTPM= data file of predicted outcomes for nested model; * PredMore = Name of OUTPM= data file of predicted outcomes for comparison model; %MACRO TotalR2(DV, PredFewer, PredMore); PROC CORR NOPRINT NOSIMPLE DATA=&PredFewer. OUTP=CorrFewer; VAR pred &DV.; RUN; PROC CORR NOPRINT NOSIMPLE DATA=&PredMore. OUTP=CorrMore; VAR pred &DV.; RUN; DATA CorrFewer; LENGTH Name $30.; SET CorrFewer; Name="&PredFewer."; RUN; DATA CorrMore; LENGTH Name $30.; SET CorrMore; Name="&PredMore."; RUN; DATA CorrCompare; LENGTH Name $30.; SET CorrFewer CorrMore; PredCorr=Pred; TotalR2=PredCorr*PredCorr; IF _NAME_="Pred" OR MISSING(_NAME_)=1 THEN DELETE; DROP Pred; RUN; DATA CorrCompare; SET CorrCompare; TotalR2Diff=TotalR2-LAG1(TotalR2); KEEP Name PredCorr TotalR2 TotalR2Diff; RUN; TITLE2 "Total R2 (% Reduction) for &PredFewer. vs. &PredMore."; PROC PRINT NOOBS DATA=CorrCompare; RUN; TITLE2; %MEND TotalR2; * To use TotalR2multiv macro; * DV = Case-sensitive name of dependent variable; * PredFewer = Name of OUTPM= data file of predicted outcomes for nested model; * PredMore = Name of OUTPM= data file of predicted outcomes for comparison model; %MACRO TotalR2multiv(DV=,PredFewer=,PredMore=); PROC SORT DATA=&PredFewer.; BY DV; RUN; PROC SORT DATA=&PredMore.; BY DV; RUN; PROC CORR NOPRINT NOSIMPLE DATA=&PredFewer. OUTP=CorrFewer; BY DV; VAR pred &DV.; RUN; PROC CORR NOPRINT NOSIMPLE DATA=&PredMore. OUTP=CorrMore; BY DV; VAR pred &DV.; RUN; DATA CorrFewer; LENGTH Name $30.; SET CorrFewer; Name="&PredFewer."; RUN; DATA CorrMore; LENGTH Name $30.; SET CorrMore; Name="&PredMore."; RUN; DATA CorrCompare; LENGTH Name $30.; SET CorrFewer CorrMore; PredCorr=Pred; TotalR2=PredCorr*PredCorr; IF _NAME_="Pred" OR MISSING(_NAME_)=1 THEN DELETE; DROP Pred; RUN; PROC SORT DATA=CorrCompare; BY DV; RUN; DATA CorrCompare; SET CorrCompare; TotalR2Diff=TotalR2-LAG1(TotalR2); IF Name="&PredFewer." THEN TotalR2Diff=.; KEEP Name DV PredCorr TotalR2 TotalR2Diff; RUN; TITLE9 "Total R2 (% Reduction) for &PredFewer. vs. &PredMore."; PROC PRINT NOOBS DATA=CorrCompare; RUN; TITLE9; %MEND TotalR2multiv; * To use PseudoR2 macro; * Ncov = TOTAL # entries in covariance parameter estimates table; * CovFewer = Name of ODS CovParms table for nested model; * CovMore = Name of ODS CovParms table for comparison model; %MACRO PseudoR2(NCov=,CovFewer=,CovMore=); DATA &CovFewer.; LENGTH Name $30.; SET &CovFewer.; Name="&CovFewer."; RUN; DATA &CovMore.; LENGTH Name $30.; SET &CovMore.; Name="&CovMore."; RUN; DATA CovCompare; LENGTH Name $30.; SET &CovFewer. &CovMore.; RUN; DATA CovCompare; SET CovCompare; PseudoR2=(LAG&Ncov.(Estimate)-Estimate)/LAG&Ncov.(Estimate); RUN; DATA CovCompare; SET CovCompare; IF CovParm IN("UN(2,1)","UN(3,1)","UN(3,2)", "UN(4,1)","UN(4,2)","UN(4,3)", "UN(5,1)","UN(5,2)","UN(5,3)","UN(5,4)", "UN(6,1)","UN(6,2)","UN(6,3)","UN(6,4)","UN(6,5)") THEN DELETE; RUN; TITLE9 "PsuedoR2 (% Reduction) for &CovFewer. vs. &CovMore."; PROC PRINT NOOBS DATA=CovCompare; RUN; TITLE9; %MEND PseudoR2; * To use FitTest macro; * FitFewer = name of infocrit table for nested model; * FitMore = name of infocrit table for comparison model; %MACRO FitTest(FitFewer, FitMore); DATA &FitFewer.; LENGTH Name $30.; SET &FitFewer.; Name="&FitFewer."; RUN; DATA &FitMore.; LENGTH Name $30.; SET &FitMore.; Name="&FitMore."; RUN; DATA FitCompare; LENGTH Name $30.; SET &FitFewer. &FitMore.; RUN; DATA FitCompare; SET FitCompare; DevDiff=Lag1(Neg2LogLike)-Neg2LogLike; DFdiff=Parms-LAG1(Parms); Pvalue=1-PROBCHI(DevDiff,DFdiff); DROP AICC HQIC CAIC; RUN; TITLE2 "Likelihood Ratio Test for &FitFewer. vs. &FitMore."; PROC PRINT NOOBS DATA=FitCompare; RUN; TITLE2; %MEND FitTest; *******************************************************************************************; * MACRO PROGRAMS TO COMPUTE TOTAL R2, PSEUDO R2 AND LIKELIHOOD RATIO TESTS USING GLIMMIX; *******************************************************************************************; * To use PseudoR2G macro; * Ncov = TOTAL # entries in covariance parameters output table; * CovFewer = name of covparms table for nested model; * CovMore = name of covparms table for comparison modell; %MACRO PseudoR2G(NCov, CovFewer, CovMore); DATA &CovFewer.; LENGTH Name $30.; SET &CovFewer.; Name="&CovFewer."; RUN; DATA &CovMore.; LENGTH Name $30.; SET &CovMore.; Name="&CovMore."; RUN; DATA CovCompare; LENGTH Name $30.; SET &CovFewer. &CovMore.; RUN; DATA CovCompare; SET CovCompare; PseudoR2=(LAG&Ncov.(Estimate)-Estimate)/LAG&Ncov.(Estimate); RUN; DATA CovCompare; SET CovCompare; IF CovParm IN("UN(2,1)","UN(3,1)","UN(4,1)","UN(3,2)","UN(4,2)","UN(4,3)") THEN DELETE; RUN; TITLE2 "PsuedoR2 (% Reduction) for &CovFewer. vs. &CovMore."; PROC PRINT NOOBS DATA=CovCompare; RUN; TITLE2; %MEND PseudoR2G; * To use FitTestG macro; * FitFewer = name of infocrit table for nested model; * FitMore = name of infocrit table for comparison model; %MACRO FitTestG(FitFewer, InfoFewer, FitMore, InfoMore); DATA &InfoFewer.2; SET &InfoFewer.; IF _N_=1 OR _N_>2 THEN DELETE; &FitFewer.=Value*1; DROP Value; RUN; DATA &InfoMore.2; SET &InfoMore.; IF _N_=1 OR _N_>2 THEN DELETE; &FitMore.= Value*1; DROP Value; RUN; DATA &FitFewer.2; SET &InfoFewer.2 &FitFewer.; IF _N_>1 THEN &FitFewer.=Value; DROP Value; RUN; DATA &FitMore.2; SET &InfoMore.2 &FitMore.; IF _N_>1 THEN &FitMore.= Value; DROP Value; RUN; DATA FitCompare; MERGE &FitFewer.2 &FitMore.2; IF _N_=1 THEN Diff=&FitMore.-&FitFewer.; ELSE Diff=&FitFewer.-&FitMore.; RUN; DATA FitCompare; SET FitCompare; Pvalue=1-PROBCHI(Diff,LAG1(Diff)); IF _N_=1 OR _N_>2 THEN Pvalue=.; RUN; TITLE2 "Likelihood Ratio Test for &FitFewer. vs. &FitMore."; PROC PRINT NOOBS DATA=FitCompare; RUN; TITLE2; %MEND FitTestG; *******************************************************************************************;