CONFIDENCE INTERVALS AND REGIONS
BIVARIATE NORMAL DISTRIBUTION
**********************************************************************;
* BIVARIATE.SAS -- Bivariate Normal Confidence Regions and Intervals *;
* Barry Moser, Dept. Experimental Statistics, LSU, Baton Rouge. *;
* CREATED: 09/19/92 *;
**********************************************************************;
Options PS=55 LS=78 PageNo=1 NoDate;
GOptions FText=SWISSX HText=1.0 CText=BLACK
HTitle=1.0 FTitle=SWISSX CTitle=BLACK
NoPrompt;
PROC IML WORKSIZE=100;
START CONTOUR(Contour,N,MEAN,COV,C,NPOINTS);
/* find principle axes of ellipses */
CALL EIGEN(V,E,(COV/N));
/* set contour levels */
A=SQRT(C*V[1]); B=SQRT(C*V[2]);
/* parameterize the ellipse by angle */
T=( (1:NPOINTS) - {1})#ATAN(1)#8/(NPOINTS-1);
S=SIN(T); T=COS(T);
S=S`*A; T=T`*B;
/* form contour points */
S =((E*(SHAPE(S,1)//SHAPE(T,1)))+MEAN@J(1,NPOINTS*NCOL(C),1) )`;
Contour=SHAPE( S , NPOINTS ) ;
/* returned as ncol pairs of columns for contours */
FREE A B T S;
FINISH;
Start Interval(IntName,N,Mean,Var,C);
Int=J(2,2,0);
int[,1]=mean-sqrt(var/n)*C; /* lower limit */
int[,2]=mean+sqrt(var/n)*C; /* upper limit */
Print c, int;
intc=RowCat(Char(Int,10,5));
n1=rowcatc(IntName||{"X"});
Call Symput(n1,intc[1]);
n1=rowcatc(IntName||{"Y"});
Call Symput(n1,intc[2]);
Finish;
Reset NoPrint Log;
N=42;
/* CORRECT FOR THE MEAN */
MEAN={2.1905, 10.0476};
COV={1.1823 1.0883, 1.0883 11.3635};
Print Mean COV;
C=(2#(N-1)/(N-2))#FInv(0.95,2,(N-2)); /* F with 2,n-2 d.f. */
Run Contour(Results,N,MEAN,COV,C,100);
ColNames={"X" "Y"};
Create BC From Results[Colname=ColNames];
Append From Results;
Close BC;
Free ColNames;
/* Now Compute Univariate Confidence Intervals */
var=vecdiag(Cov);
/* T2 intervals */
C=sqrt((2#(N-1)/(N-2))#FInv(0.95,2,(N-2))); /* F with 2,n-2 d.f. */
Run Interval({"TSQ"},N,Mean,Var,C);
/* Bonferroni Intervals */
C=TInv(1-0.05/4,(N-1));
Run Interval({"BON"},N,Mean,Var,C);
/* Usual Univariate Intervals */
C=TInv(1-0.05/2,(N-1));
Run Interval({"UNI"},N,Mean,Var,C);
MeanC=Char(Mean,10,5);
Call Symput("MeanX",meanC[1]);
Call Symput("MeanY",meanC[2]);
Quit;
Data Ann;
Drop SX SY;
Length Text $10.;
Size=1.5;
Function="LABEL ";
HSYS="4"; YSYS="2"; XSYS="2";
Position="B";
Color="BLACK ";
Text="T-Square";
SX="&TSQX"; SY="&TSQY";
Link GetXY;
Text="Bonferroni";
SX="&BONX"; SY="&BONY";
Link GetXY;
Text="Univariate";
SX="&UNIX"; SY="&UNIY";
Link GetXY;
X=input(substr("&MeanX",1,10),10.5);
Y=input(substr("&MeanY",1,10),10.5);
Text="m";
Style="GREEK ";
Position="2";
Output;
Text="^";
Style=' ';
Position="2";
Output;
Function="SYMBOL";
Text="DOT";
Style=" ";
Position="5";
Size=1;
Output;
Stop;
GETXY:
X=(input(substr(SX,1,10),10.5)+input(substr(SX,11,10),10.5))/2;
Y=input(substr(SY,11,10),10.5);
Output;
Return;
Run;
Title1 H=1.5 F=SWISSX 'Bivariate Normal 95% Confidence Ellipse';
Title2 H=1.5 F=SWISSX 'With Various 95% Univariate Confidence Intervals';
Proc GPlot Data=BC Annotate=ANN;
Plot Y*X=1 / HRef=&TSQX &BONX &UNIX VREF=&TSQY &BONY &UNIY;
Symbol1 c=Black i=join v=none r=1 h=1.5;
Run; Quit;
Title2 H=1.5 F=SWISSX 'With 95% T-Square Confidence Intervals';
Proc GPlot Data=BC;
Plot Y*X=1 / HRef=&TSQX VREF=&TSQY;
Symbol1 c=Black i=join v=none r=1 h=1.5;
Run; Quit;
Title2 H=1.5 F=SWISSX 'With 95% Bonferroni Confidence Intervals';
Proc GPlot Data=BC;
Plot Y*X=1 / HRef=&BONX VREF=&BONY;
Symbol1 c=Black i=join v=none r=1 h=1.5;
Run; Quit;
Title2 H=1.5 F=SWISSX 'With Usual 95% Univariate Confidence Intervals';
Proc GPlot Data=BC;
Plot Y*X=1 / HRef=&UNIX VREF=&UNIY;
Symbol1 c=Black i=join v=none r=1 h=1.5;
Run; Quit;