/*Reading full data in SAS*/
PROC IMPORT DATAFILE="C:\sim.csv" OUT=sim DBMS=csv replace;
GETNAMES=yes;
RUN;

/*Reading partial data in SAS (for complete case analysis)*/
PROC IMPORT DATAFILE="C:\simc.csv" OUT=simc DBMS=csv replace;
GETNAMES=yes;
RUN;

/*Reading data containing missing outcome (missing outcome treated as an additional category)*/
PROC IMPORT DATAFILE="C:\simr.csv" OUT=simr DBMS=csv replace;
GETNAMES=yes;
RUN;


/*Full data modeling, unclustered*/
PROC LOGISTIC DATA = sim ;
MODEL Y (REF='1') = X1 X2 X3 X4 / LINK=glogit;
RUN;

/*Full data modeling, clustered*/
PROC NLMIXED DATA = sim ; 
PARMS b20= -2.0392  b21= 0.9974 b22= 0.5398  b23= 1.2443  b24= 0.4745
      b30= -2.7223  b31= 1.4998 b32= 0.6635  b33= 1.3032  b34= 1.1259       /*Result of PROC LOGISTIC*/
      logsu2= 0.5 logsu3= 0.5 z23= 1;
eta1 = 0;
eta2 = b20 + b21*X1 + b22*X2 + b23*X3 + b24*X4 + u2;
eta3 = b30 + b31*X1 + b32*X2 + b33*X3 + b34*X4 + u3;
ARRAY p_Y{3};
p_Y1 = exp(eta1) /  (exp(eta1) + exp(eta2) + exp(eta3));
p_Y2 = exp(eta2) /  (exp(eta1) + exp(eta2) + exp(eta3));
p_Y3 = exp(eta3) /  (exp(eta1) + exp(eta2) + exp(eta3));
like = p_Y{Y};
ll = log(like);
su2 = exp(logsu2);
su3 = exp(logsu3);
rho23 = (exp(2*z23)-1) / (exp(2*z23)+1);
cov23 = rho23*su2*su3;
MODEL Y ~ GENERAL(ll);
RANDOM u2 u3 ~ NORMAL([0,0],[su2*su2,cov23,su3*su3])  SUBJECT= i ;
ESTIMATE 'Var2' exp(2*logsu2);
ESTIMATE 'Var3' exp(2*logsu3);
ESTIMATE 'cov23' su2*su3*(exp(2*z23)-1) / (exp(2*z23)+1);
PREDICT exp(eta1) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=one ;
PREDICT exp(eta2) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=two ;
PREDICT exp(eta3) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=three ; RUN;

PROC MEANS DATA= one; VAR  Pred; 
PROC MEANS DATA= two; VAR  Pred; 
PROC MEANS DATA= three; VAR  Pred; RUN;


/*Complete case analysis, unclustered*/
PROC LOGISTIC DATA = simc;
MODEL Y (REF='1') = X1 X2 X3 X4 / LINK=glogit;
RUN;

/*Complete case analysis, clustered*/
PROC NLMIXED DATA = simc; 
PARMS b20= -1.0524  b21= 1.1165 b22= 0.6385  b23= 1.3642  b24= 0.6895
      b30= -1.7355  b31= 1.6186 b32= 0.7622  b33= 1.4231  b34= 1.3408       /*Result of PROC LOGISTIC*/
      logsu2= 0.5 logsu3= 0.5 z23= 1;
eta1 = 0;
eta2 = b20 + b21*X1 + b22*X2 + b23*X3 + b24*X4 + u2;
eta3 = b30 + b31*X1 + b32*X2 + b33*X3 + b34*X4 + u3;
ARRAY p_Y{3};
p_Y1 = exp(eta1) /  (exp(eta1) + exp(eta2) + exp(eta3));
p_Y2 = exp(eta2) /  (exp(eta1) + exp(eta2) + exp(eta3));
p_Y3 = exp(eta3) /  (exp(eta1) + exp(eta2) + exp(eta3));
like = p_Y{Y};
ll = log(like);
su2 = exp(logsu2);
su3 = exp(logsu3);
rho23 = (exp(2*z23)-1) / (exp(2*z23)+1);
cov23 = rho23*su2*su3;
MODEL Y ~ GENERAL(ll);
RANDOM u2 u3 ~ NORMAL([0,0],[su2*su2,cov23,su3*su3])  SUBJECT= i ;
ESTIMATE 'Var2' exp(2*logsu2);
ESTIMATE 'Var3' exp(2*logsu3);
ESTIMATE 'cov23' su2*su3*(exp(2*z23)-1) / (exp(2*z23)+1);
PREDICT exp(eta1) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=one2 ;
PREDICT exp(eta2) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=two2 ;
PREDICT exp(eta3) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=three2 ; RUN;

PROC MEANS DATA= one2; VAR  Pred; 
PROC MEANS DATA= two2; VAR  Pred; 
PROC MEANS DATA= three2; VAR  Pred; RUN;


/*Proposed method 1: Selection model*/
PROC NLMIXED DATA = simr ; 
PARMS b20= -1.0524  b21= 1.1165 b22= 0.6385  b23= 1.3642  b24= 0.6895
      b30= -1.7355  b31= 1.6186 b32= 0.7622  b33= 1.4231  b34= 1.3408
      logsu2= 0.5 logsu3= 0.5 z23= 1
      a0= 1 a1= 1 a2= 1 a3=1  a4= 1 a5= 1 a6= 1;
eta1 = 0;
eta2 = b20 + b21*X1 + b22*X2 + b23*X3 + b24*X4 + u2;
eta3 = b30 + b31*X1 + b32*X2 + b33*X3 + b34*X4 + u3;
phi1 = a0 + a1*X1 + a2*X2 + a3*X3 + a4*X4;
phi2 = a0 + a1*X1 + a2*X2 + a3*X3 + a4*X4 + a5;
phi3 = a0 + a1*X1 + a2*X2 + a3*X3 + a4*X4 + a6;
ARRAY p_Y{4};
p_Y1 = (exp(eta1) /  (exp(eta1) + exp(eta2) + exp(eta3)))/(1+exp(phi1));
p_Y2 = (exp(eta2) /  (exp(eta1) + exp(eta2) + exp(eta3)))/(1+exp(phi2));
p_Y3 = (exp(eta3) /  (exp(eta1) + exp(eta2) + exp(eta3)))/(1+exp(phi3));
p_Y4 = (exp(eta1) /  (exp(eta1) + exp(eta2) + exp(eta3)))*(exp(phi1)/(1+exp(phi1))) + 
       (exp(eta2) /  (exp(eta1) + exp(eta2) + exp(eta3)))*(exp(phi2)/(1+exp(phi2))) +
       (exp(eta3) /  (exp(eta1) + exp(eta2) + exp(eta3)))*(exp(phi3)/(1+exp(phi3)));
like = p_Y{Y};
ll = log(like); 
su2 = exp(logsu2); 
su3 = exp(logsu3);
rho23 = (exp(2*z23)-1) / (exp(2*z23)+1);
cov23 = rho23*su2*su3;
MODEL Y ~ GENERAL(ll);
RANDOM u2 u3 ~ NORMAL([0,0],[su2*su2,cov23,su3*su3])  SUBJECT= i ;
ESTIMATE 'Var2' exp(2*logsu2);
ESTIMATE 'Var3' exp(2*logsu3);
ESTIMATE 'cov23' su2*su3*(exp(2*z23)-1) / (exp(2*z23)+1);
PREDICT exp(eta1) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=one1 ;
PREDICT exp(eta2) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=two1 ;
PREDICT exp(eta3) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=three1 ; RUN;

PROC MEANS DATA= one1; VAR  Pred; 
PROC MEANS DATA= two1; VAR  Pred; 
PROC MEANS DATA= three1; VAR  Pred; RUN;


/*Proposed method 2: Simple likelihood*/ 
PROC NLMIXED DATA = simr;
PARMS b20= -1.0524  b21= 1.1165 b22= 0.6385  b23= 1.3642  b24= 0.6895
      b30= -1.7355  b31= 1.6186 b32= 0.7622  b33= 1.4231  b34= 1.3408
      logsu2= 0.5 logsu3= 0.5 z23= 1
      d1=1 d2=1 d3=1 ;
eta1 = 0;
eta2 = b20 + b21*X1 + b22*X2 + b23*X3 + b24*X4 + u2;
eta3 = b30 + b31*X1 + b32*X2 + b33*X3 + b34*X4 + u3;
c1 = d1*d1 ; c2 = d2*d2 ; c3 = d3*d3 ;
ARRAY PY{4};
PY1 = exp(eta1) / ((1+c1)*(exp(eta1) + exp(eta2) + exp(eta3)));
PY2 = exp(eta2) / ((1+c2)*(exp(eta1) + exp(eta2) + exp(eta3)));
PY3 = exp(eta3) / ((1+c3)*(exp(eta1) + exp(eta2) + exp(eta3)));
PY4 = (c1*exp(eta1) / (1+c1) + c2*exp(eta2) / (1+c2) + c3*exp(eta3) / (1+c3))/ (exp(eta1) + exp(eta2) + exp(eta3)) ;
like = PY{Y};
ll = log(like);
su2 = exp(logsu2);
su3 = exp(logsu3);
rho23 = (exp(2*z23)-1) / (exp(2*z23)+1);
cov23 = rho23*su2*su3;
MODEL Y ~ GENERAL(ll);
RANDOM u2 u3 ~ NORMAL([0,0],[su2*su2,cov23,su3*su3])  SUBJECT= i ;
ESTIMATE 'Var2' exp(2*logsu2);
ESTIMATE 'Var3' exp(2*logsu3);
ESTIMATE 'cov23' su2*su3*(exp(2*z23)-1) / (exp(2*z23)+1);
ESTIMATE 'c1' d1*d1;
ESTIMATE 'c2' d2*d2;
ESTIMATE 'c3' d3*d3;
PREDICT exp(eta1) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=one3 ;
PREDICT exp(eta2) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=two3 ;
PREDICT exp(eta3) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=three3 ; RUN;

PROC MEANS DATA= one3; VAR  Pred; 
PROC MEANS DATA= two3; VAR  Pred; 
PROC MEANS DATA= three3; VAR  Pred; RUN;


/*Model assuming MAR*/ 
PROC NLMIXED DATA = simr; 
PARMS b20= -1.0524  b21= 1.1165 b22= 0.6385  b23= 1.3642  b24= 0.6895
      b30= -1.7355  b31= 1.6186 b32= 0.7622  b33= 1.4231  b34= 1.3408
      logsu2= 0.5 logsu3= 0.5 z23= 1
      d=1;
eta1 = 0;
eta2 = b20 + b21*X1 + b22*X2 + b23*X3 + b24*X4 + u2;
eta3 = b30 + b31*X1 + b32*X2 + b33*X3 + b34*X4 + u3;
c = d*d ;
ARRAY PY{4};
PY1 = exp(eta1) / ((1+c)*(exp(eta1) + exp(eta2) + exp(eta3)));
PY2 = exp(eta2) / ((1+c)*(exp(eta1) + exp(eta2) + exp(eta3)));
PY3 = exp(eta3) / ((1+c)*(exp(eta1) + exp(eta2) + exp(eta3)));
PY4 = (c*exp(eta1) / (1+c) + c*exp(eta2) / (1+c) + c*exp(eta3) / (1+c))/ (exp(eta1) + exp(eta2) + exp(eta3)) ;
like = PY{Y};
ll = log(like);
su2 = exp(logsu2);
su3 = exp(logsu3);
rho23 = (exp(2*z23)-1) / (exp(2*z23)+1);
cov23 = rho23*su2*su3;
MODEL Y ~ GENERAL(ll);
RANDOM u2 u3 ~ NORMAL([0,0],[su2*su2,cov23,su3*su3])  SUBJECT= i ;
ESTIMATE 'Var2' exp(2*logsu2);
ESTIMATE 'Var3' exp(2*logsu3);
ESTIMATE 'cov23' su2*su3*(exp(2*z23)-1) / (exp(2*z23)+1);
ESTIMATE 'c' d*d;
PREDICT exp(eta1) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=one4 ;
PREDICT exp(eta2) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=two4 ;
PREDICT exp(eta3) / (exp(eta1) + exp(eta2) + exp(eta3))   OUT=three4 ; RUN;

PROC MEANS DATA= one4; VAR  Pred; 
PROC MEANS DATA= two4; VAR  Pred; 
PROC MEANS DATA= three4; VAR  Pred; RUN;