/********************************************************************************* SAS Script for Regression Models for Categorical Dependent Variables Written by Hun Myoung Park Statistical Software Analyst and Programmer UITS Center for Statistical and Mathematical Computing, Indiana University 535 West Michigan Street IT417 Indianapolis, IN 46202 317-274-0573 kucc625@indiana.edu http://www.masil.org University Information Technology Services, Indiana University Center for Statistical and Mathematical Computing http://www.indiana.edu/~statmath First created on 08/28/2009 Last modified on 09/25/2009 *********************************************************************************/ LIBNAME masil 'c:\temp\sas'; PROC CONTENTS DATA=masil.gss_cdvm; RUN; /* Binary logit model */ PROC LOGISTIC DESCENDING DATA = masil.gss_cdvm; MODEL trust = educate income age male www; RUN; PROC LOGISTIC DESCENDING DATA = masil.gss_cdvm; MODEL trust = educate income age male www /EXPB; RUN; PROC LOGISTIC DATA = masil.gss_cdvm; MODEL trust(EVENT=LAST) = educate income age male www; RUN; PROC LOGISTIC DATA = masil.gss_cdvm; MODEL trust(EVENT='1') = educate income age male www; UNITS educate=SD income=SD age=SD; RUN; PROC PROBIT DATA = masil.gss_cdvm; CLASS trust; MODEL trust = educate income age male www /DIST=LOGISTIC; RUN; PROC PROBIT DATA = masil.gss_cdvm; MODEL trust = educate income age male www /DIST=LOGISTIC; RUN; PROC GENMOD DATA = masil.gss_cdvm DESC; CLASS trust; MODEL trust = educate income age male www /DIST=BINOMIAL LINK=LOGIT; RUN; PROC GENMOD DATA = masil.gss_cdvm DESC; MODEL trust = educate income age male www /DIST=BINOMIAL LINK=LOGIT; RUN; PROC GENMOD DATA = masil.gss_cdvm DESC; FWDLINK link=LOG(_MEAN_/(1-_MEAN_)); INVLINK invlink=1/(1+EXP(-1*_XBETA_)); MODEL trust = educate income age male www /DIST=BINOMIAL; RUN; PROC QLIM DATA=masil.gss_cdvm; MODEL trust = educate income age male www; ENDOGENOUS trust ~ DISCRETE(DIST=LOGIT); RUN; PROC QLIM DATA=masil.gss_cdvm; MODEL trust = educate income age male www /DISCRETE(DIST=LOGIT); RUN; /* Computing marginal effects */ PROC LOGISTIC DESCENDING DATA = masil.gss_cdvm OUTEST=masil.blm; MODEL trust = educate income age male www; RUN; PROC MEANS MEAN STD DATA = masil.gss_cdvm; VAR educate income age male www; OUTPUT OUT=masil.meanX; RUN; PROC IML; USE masil.blm; /* get a row vector of parameter estimates */ READ ALL VAR{Intercept educate income age male www} INTO bHat; K=NCOL(bHat); /* get the number of regressors */ USE masil.meanX; READ ALL VAR{educate income age male www} INTO X; meanX = {1} || X[4,]; /* a row vector of means of independent variables */ sdX = {0} || X[5,]; /* a row vector of standard deviations of independent variables */ referX = meanX; /* set reference points */ referX[1,2]=16; referX[1,5]=0; referX[1,6]=1; /* education=16, male=0, www=1 */ xb = bHat * T(referX); prob = exp(xb)/(1+exp(xb)); /* compute a predicted probability */ PRINT referX prob; margin = prob * (1-prob) * T(bHat); /* compute marginal effects */ marginSD = prob * (1-prob) * T(bHat # sdX); result = T(bHat) || T(exp(bHat)) || T(exp(bHat # sdX)) || margin || marginSD || T(meanX) || T(sdX); result = result[2:K,]; PRINT result[ROWNAME={"educate", "income", "age", "male", "www"} COLNAME={"b" "exp(b)" "exp(b*sdX)" "MargEffect" "MargEffect(SD)" "Mean of X" "SD of X"}]; QUIT; /* terminate PROC IML */ /* Binary Probit Model */ PROC PROBIT DATA = masil.gss_cdvm; CLASS trust; MODEL trust = educate income age male www; RUN; PROC LOGISTIC DATA = masil.gss_cdvm DESC OUTEST=masil.bpm; MODEL trust = educate income age male www /LINK=PROBIT; RUN; ODS HTML FILE='c:\temp\sas\probit.html'; PROC LOGISTIC DATA = masil.gss_cdvm DESC; MODEL trust(EVENT='1') = educate income age male www /LINK=NORMIT; RUN; ODS HTML CLOSE; PROC GENMOD DATA = masil.gss_cdvm DESC; MODEL trust = educate income age male www /DIST=BINOMIAL LINK=PROBIT; RUN; PROC QLIM DATA=masil.gss_cdvm; MODEL trust = educate income age male www /DISCRETE (DIST=NORMAL); RUN; /* Compute marginal effects in the probit model */ PROC IML; USE masil.bpm; /* get a row vector of parameter estimates */ READ ALL VAR{Intercept educate income age male www} INTO bHat; K=NCOL(bHat); /* get the number of regressors */ USE masil.meanX; READ ALL VAR{educate income age male www} INTO X; meanX = {1} || X[4,]; /* a row vector of means of independent variables */ sdX = {0} || X[5,]; /* a row vector of standard deviations of independent variables */ referX = meanX; /* set reference points */ referX[1,2]=16; referX[1,5]=0; referX[1,6]=1; /* education=16, male=0, www=1 */ xb = bHat * T(referX); *prob = PROBNORM(xb); /* compute a predicted probability */ prob = CDF('NORMAL', xb, 0, 1); /* compute a predicted probability */ PRINT referX prob; margin = PDF('NORMAL', xb, 0, 1) * T(bHat); /* compute marginal effects */ marginSD = PDF('NORMAL', xb, 0, 1) * T(bHat # sdX); result = T(bHat) || margin || marginSD || T(meanX) || T(sdX); result = result[2:K,]; PRINT result[ROWNAME={"educate", "income", "age", "male", "www"} COLNAME={"b" "MargEffect" "MargEffect(SD)" "Mean of X" "SD of X"}]; QUIT; /* terminate PROC IML */ /* Bivariate Probit Model */ PROC QLIM DATA=masil.gss_cdvm; MODEL trust www = educate income age male; ENDOGENOUS trust www ~ DISCRETE(DIST=NORMAL); RUN; /* Recursive Bivariate Probit Model */ PROC QLIM DATA=masil.gss_cdvm; MODEL trust = educate income age male www; MODEL www = educate income age male; ENDOGENOUS trust www ~ DISCRETE(DIST=NORMAL); RUN; /* Ordered Logit Model */ PROC QLIM DATA=masil.gss_cdvm; MODEL belief = educate income age male www /DISCRETE (DIST=LOGISTIC); RUN; PROC LOGISTIC DATA = masil.gss_cdvm DESC; MODEL belief = educate income age male www /LINK=LOGIT; RUN; PROC LOGISTIC DATA = masil.gss_cdvm; MODEL belief = educate income age male www /LINK=LOGIT; RUN; PROC GENMOD DATA = masil.gss_cdvm DESC; CLASS belief; MODEL belief = educate income age male www /DIST=MULTINOMIAL LINK=CLOGIT; RUN; PROC PROBIT DATA = masil.gss_cdvm; CLASS belief; MODEL belief = educate income age male www /DIST=LOGISTIC; RUN; /* Ordered Probit Model */ PROC QLIM DATA=masil.gss_cdvm; MODEL belief = educate income age male www /DISCRETE (DIST=NORMAL); RUN; PROC LOGISTIC DATA = masil.gss_cdvm DESC; MODEL belief = educate income age male www /LINK=PROBIT; RUN; PROC PROBIT DATA = masil.gss_cdvm; CLASS belief; MODEL belief = educate income age male www /DIST=NORMAL; RUN; PROC GENMOD DATA = masil.gss_cdvm DESC; CLASS belief; MODEL belief = educate income age male www /DIST=MULTINOMIAL LINK=CUMPROBIT; RUN; /* Multinomial Logit Model */ PROC LOGISTIC DATA = masil.gss_cdvm DESC; MODEL belief = educate income age male www /LINK=GLOGIT; UNITS educate=SD income=SD age=SD; RUN; PROC LOGISTIC DATA = masil.gss_cdvm DESC REFERENCE=LAST; MODEL belief = educate income age male www /LINK=GLOGIT; RUN; PROC LOGISTIC DATA = masil.gss_cdvm DESC REFERENCE=FIRST; MODEL belief = educate income age male www /LINK=GLOGIT; UNITS age=SD; RUN; PROC LOGISTIC DATA = masil.gss_cdvm DESC REFERENCE='3'; MODEL belief = educate income age male www /LINK=GLOGIT; UNITS age=SD; RUN; /* Opposite sign */ PROC LOGISTIC DATA = masil.gss_cdvm; MODEL belief = educate income age male www /LINK=GLOGIT; RUN; PROC CATMOD DATA = masil.gss_cdvm; DIRECT educate income age male www; RESPONSE LOGITS; MODEL belief = educate income age male www /NOPROFILE; RUN; /* Multinomial Probit model */ PROC MDC DATA=masil.travel; MODEL choice = air train bus cost time air_inc /TYPE=MP CHOICE=(mode); ID subject; RUN; /* Conditional Logit model */ PROC LOGISTIC DATA=masil.travel DESCENDING; MODEL choice = air train bus cost time air_inc; STRATA subject; RUN; PROC MDC DATA=masil.travel; MODEL choice = air train bus cost time air_inc /TYPE=CLOGIT NCHOICE=4; ID subject; RUN; PROC PHREG DATA=masil.travel; STRATA subject; MODEL failure*choice(0) = air train bus cost time air_inc; RUN; PROC PHREG DATA=masil.travel NOSUMMARY; STRATA subject; MODEL failure*choice(0) = air train bus cost time air_inc; RUN; /* Nested Logit Model */ PROC MDC DATA=masil.travel; MODEL choice = air train bus cost time air_inc /TYPE=NLOGIT CHOICE=(mode); ID subject; UTILITY U(1,) = air train bus cost time, U(2, 1 2) = air_inc; NEST LEVEL(1) = (1 @ 1, 2 3 4 @ 2), LEVEL(2) = (1 2 @ 1); RUN;