#include "ranlib.h" #include #include extern float covar(float *x,float *y,long n); extern void prcomp(long p,float *mean,float *xcovar,float *answer); extern void setcov(long p,float *var,float corr,float *covar); extern void statist(float *x,long *n,float *av,float *var, float *xmin,float *xmax); float covar(float *x,float *y,long n) { static long i; static float covar,avx,avy,varx,vary,xmax,xmin; statist(x,&n,&avx,&varx,&xmin,&xmax); statist(y,&n,&avy,&vary,&xmin,&xmax); covar = 0.0; for(i=0; i0; D3--,j+=D2) { printf(" I = %12ld J = %12ld\n",i,j); *(rcovar+i-1+(j-1)*10) = covar((answer+(i-1)*1000L),(answer+(j-1)* 1000L),maxobs); printf(" Covariance %16.6g Generated %16.6g\n",*(xcovar+i-1+(j-1)*p) ,*(rcovar+i-1+(j-1)*10)); } } #undef maxp #undef maxobs } void setcov(long p,float *var,float corr,float *covar) /* Set covariance matrix from variance and common correlation */ { static long i,j,D1,D2; for(i=1,D1=1,D2=(p-i+D1)/D1; D2>0; D2--,i+=D1) { for(j=1; j<=p; j++) { if(!(i == j)) goto S10; *(covar+i-1+(j-1)*p) = *(var+i-1); goto S20; S10: *(covar+i-1+(j-1)*p) = corr*sqrt(*(var+i-1)**(var+j-1)); S20: continue; } } } void statist(float *x,long *n,float *av,float *var,float *xmin,float *xmax) { static long i; static float sum; *xmin = *xmax = *x; sum = 0.0; for(i=0; i<*n; i++) { sum += *(x+i); if(*(x+i) < *xmin) *xmin = *(x+i); if(*(x+i) > *xmax) *xmax = *(x+i); } *av = sum/(float)*n; sum = 0.0; for(i=0; i<*n; i++) sum += pow(*(x+i)-*av,2.0); *var = sum/(float)(*n-1); } void main(long argc,char *argv[]) { #define maxp 10L #define maxobs 1000L #define p2 100L static long i,iobs,is1,is2,j,p; static float corr,answer[10000],ccovar[100],covar[100],mean[10],param[500], temp[10],var[10],work[10]; static char phrase[100]; puts(" Tests Multivariate Normal Generator for Up to 10 Variables"); puts(" User inputs means, variances, one correlation that is applied"); puts(" to all pairs of variables"); puts(" 1000 multivariate normal deviates are generated"); puts(" Means, variances and covariances are calculated for these"); S10: puts("Enter number of variables for normal generator"); scanf("%d",&p); printf("Enter mean vector of length %12ld\n",p); for(i=0; i