proc iml;
/*-------------------------------------------------------------*/
/* The MULTINOM Module */
/* */
/* This module constructs large-sample confidence limits for */
/* various linear combinations of the K multinomial */
/* proportions. */
/* */
/* Input: */
/* 1) NVEC, a 1xK vector containing the cell sizes. */
/* 2) TYPE, a character string that specifies whether you */
/* want the confidence limits to control individual or */
/* overall error rate. The choices are "i" */
/* (for individual) or "s" (for simultaneous). */
/* 3) ALPHA, the type I error rate. */
/* 4) CONT, a MxK matrix containing the M linear */
/* combinations of interest. If CONT is set to missing, */
/* MULTINOM automatically constructs confidence */
/* intervals for all K(K-1)/2 pairwise differences */
/*-------------------------------------------------------------*/
start multinom(nvec,type,alpha,cont);
reset noname fw=2;
type=upcase(type);
if min(nvec)<0 | sum(abs(round(nvec,1)-nvec))>1e-4 then do;
print "ERROR: Cell Sizes Must Be Nonnegative Integers";
return;
end;
if type^='I' & type^='S' then do;
print "ERROR: TYPE Parameter Must Be 'I' or 'S'";
return;
end;
if alpha<0 | alpha>1 then do;
print "ERROR: ALPHA Must be in [0,1]";
return;
end;
k=ncol(nvec);
if cont^=. & ncol(cont)^=k then do;
print "ERROR: Number of Columns in CONT Must Equal K";
return;
end;
n=sum(nvec);
pvec=nvec/n;
varcov=(diag(pvec)-pvec`*pvec)/n;
cl=(1-alpha)#100;
c2="Estimate" "LCL" "UCL";
if type='I' then label='Individual';
if type='S' then label='Simultaneous';
if cont=. then do;
c1="I" "J";
print "All Pairwise Differences";
print cl "%" label "Large-Sample Confidence Limits For Pi-Pj";
c=round(k#(k-1)/2,1);
contr=j(c,k,0);
i=1; j=2;
do row = 1 to c;
index=index//(i||j);
contr[row,i]=1;
contr[row,j]=-1;
j=j+1;
if j>k then do;
i=i+1;
j=i+1;
end;
end;
end;
else do;
c1="Ci";
print "User-Defined Linear Combinations";
print cl "%" label "Large-Sample Confidence Limits";
contr=cont;
c=nrow(contr);
index=cont;
end;
if type='I' then z=probit(1-alpha/2);
if type='S' then z=probit(1-alpha/(2#c));
do i = 1 to c;
ci=contr[i,];
mean=ci*pvec`;
var=ci*varcov*ci`;
inc=z#sqrt(var);
lcl=mean-inc;
ucl=mean+inc;
table=table//(mean||lcl||ucl);
end;
print index[colname=c1 format=2.0] table[colname=c2 format=6.4];
finish multinom;
/*-------------------------------------------------------------*/
/* The MULTIBIN Module */
/* */
/* This module constructs large-sample conservative & */
/* optimistic confidence intervals for the pairwise */
/* differences between K binomial proportions when individual */
/* cell sizes are unknown. Based on the two intervals, the */
/* the proportion differences are labeled as "significant", */
/* "non-significant", or "inconclusive". */
/* */
/* Input: */
/* 1) N, the common sample size. */
/* 2) NVEC, a 1xK vector containing the number of */
/* "successes" for each binomial response */
/* 3) TYPE, a character string that specifies if you want */
/* individual or simultaneous confidence inferences */
/* Choices are "i" or "s". Only the "conservative */
/* intervals are adjusted to be simultaneous. */
/* 4) ALPHA, the type I error rate. */
/*-------------------------------------------------------------*/
start multibin(n,nvec,type,alpha);
reset noname;
type=upcase(type);
if n<=0 | abs(round(n,1)-n)>1e-4 then do;
print "ERROR: N Must Be A Positive Noninteger";
return;
end;
if min(nvec)<0 | max(nvec)>n |
sum(abs(round(nvec,1)-nvec))>1e-4 then do;
print "ERROR: NVEC Values Must be Integers & in [0,N]";
return;
end;
if type^="I" & type^="S" then do;
print "ERROR: TYPE Parameter Must Be 'I' or 'S'";
return;
end;
if alpha<0 | alpha>1 then do;
print "ERROR: ALPHA Must be in [0,1]";
return;
end;
k=ncol(nvec);
pvec=nvec/n;
qvec=1-pvec;
c=round((k#(k-1)/2),1);
cl=100#(1-alpha);
zo=probit(1-alpha/2);
if type='I' then do;
zc=zo;
label='Individual';
end;
if type='S' then do;
zc=probit(1-alpha/(2#c));
label='Simultaneous';
end;
do i = 1 to k-1;
pi=pvec[1,i];
qi=qvec[1,i];
do j = i+1 to k;
result=" ?";
pj=pvec[1,j];
qj=qvec[1,j];
mean=pi-pj;
cvar=(1/n)#(min(pi+pj,qi+qj)-(pi-pj)##2);
cinc=zc#sqrt(cvar);
clcl=mean-cinc;
cucl=mean+cinc;
if clcl>0 | cucl<0 then result=" S";
diff=abs(pi-pj);
ovar=(1/n)#diff#(1-diff);
oinc=zo#sqrt(ovar);
olcl=mean-oinc;
oucl=mean+oinc;
if olcl<=0 & oucl>=0 then result=" N";
index=index//(i||j);
table=table//(mean||clcl||cucl||olcl||oucl);
rvec=rvec//result;
end;
end;
ch1="I" "J";
ch2="Estimate" "C LCL" "C UCL" "O LCL" "O UCL";
ch3="Result";
print cl "%" label "Large-Sample Confidence Limits For Pi-Pj";
print index[colname=ch1 format=2.0]
table[colname=ch2 format=6.4] rvec[colname=ch3];
finish multibin;