Correlated Choice Modeling
/*--------------------------------------------------------------
SAS Sample Library
Name: mdcex03.sas
Description: Example program from SAS/ETS User's Guide,
The MDC Procedure
Title: Correlated Choice Modeling
Product: SAS/ETS Software
Keys: multinomial discrete choice
PROC: MDC
Notes:
--------------------------------------------------------------*/
/*-- generate simulated series --*/
%let ndim = 3;
%let nobs = 1000;
data trichoice;
array error{&ndim} e1-e3;
array vtemp{&ndim} _temporary_;
array lm{6} _temporary_ (1.4142136 0.4242641 1 0 0 1);
retain nseed 345678;
do id = 1 to &nobs;
index = 0;
/* generate independent normal variate */
do i = 1 to &ndim;
/* index of diagonal element */
vtemp{i} = rannor(nseed);
end;
/* get multivariate normal variate */
index = 0;
do i = 1 to &ndim;
error{i} = 0;
do j = 1 to i;
error{i} = error{i} + lm{index+j}*vtemp{j};
end;
index = index + i;
end;
x1 = 1.0 + 2.0 * ranuni(nseed);
x2 = 1.2 + 2.0 * ranuni(nseed);
x3 = 1.5 + 1.2 * ranuni(nseed);
util1 = 2.0 * x1 + e1;
util2 = 2.0 * x2 + e2;
util3 = 2.0 * x3 + e3;
do i = 1 to &ndim;
vtemp{i} = 0;
end;
if ( util1 > util2 & util1 > util3 ) then
vtemp{1} = 1;
else if ( util2 > util1 & util2 > util3 ) then
vtemp{2} = 1;
else if ( util3 > util1 & util3 > util2 ) then
vtemp{3} = 1;
else continue;
/*-- first choice --*/
x = x1;
mode = 1;
decision = vtemp{1};
output;
/*-- second choice --*/
x = x2;
mode = 2;
decision = vtemp{2};
output;
/*-- third choice --*/
x = x3;
mode = 3;
decision = vtemp{3};
output;
end;
run;
/*-- Trinomial Probit --*/
proc mdc data=trichoice randnum=halton nsimul=100;
model decision = x /
type=mprobit
choice=(mode 1 2 3)
covest=op
optmethod=qn;
id id;
run;
/*-- Two-Level Nested Logit --*/
proc mdc data=trichoice;
model decision = x /
type=nlogit
choice=(mode 1 2 3)
covest=op
optmethod=qn;
id id;
utility u(1,) = x;
nest level(1) = (1 2 @ 1, 3 @ 2),
level(2) = (1 2 @ 1);
run;