请教诸位大侠,如何将下面的SAS程序翻译成R?
data caq;
infile "E:\Modality Properties\caq.dat";
input i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12;
run;
/* Code does not need to be altered until the last two lines. */
OPTIONS NODATE NOSTIMER LS=120 PS=60;
%macro alphaest(DATAset=_last_, vars=, prb=.05, out=parm);
PROC IML;
USE &DATAset;
READ all var {&vars} into data;
prob = &prb;
/*-- Define IML module ---*/
start scalpha(data,prob);
* reset print;
parm = J(1,7,.); /* create return vector: row */
nsub = NROW(data); /* number of subjects */
nvar = NCOL(data); /* number of variables */
nv2 = nvar*(nvar+1)/2;
rsub = 1. / nsub; rs1 = 1. / (nsub - 1.);
vrat = nvar / (nvar-1.);
mean = data[+,] / nsub; /* row vector */
/* for prob=.05: quant should be 1.96 */
quant = probit(1. - .5*prob);
print "Prob and Quant:", prob,quant;
/* Compute COV Matrix cov[nvar,nvar] */
cov = rs1 * (data` * data - nsub * mean` * mean);
print cov [colname= { &vars} ];
vvar = vecdiag(cov); /* variances in diag of cov */
summat = cov[+,+]; /* sum entire cov matrix */
sumvars = vvar[+]; /* sum diagonal of cov matrix */
sumcovs = .5*(summat - sumvars); /* sum off diag of cov matrix */
/* only for normal theory ASE:
get wcv[nvar,nvar], wvv[nvar] */
wcv = cov * cov;
wvv = vecdiag(wcv);
sumvar2 = wvv[+];
summat2 = wcv[+,+];
alpha = vrat * (1. - sumvars/summat);
parm[1] = alpha; /* alpha */
/*--- Compute Normal ASE ----*/
tmp = 2. * vrat*vrat / (summat*summat*summat);
t1 = summat * sumvar2;
t2 = summat * sumvars*sumvars;
t3 = 2.*sumvars * summat2;
nase = tmp*(t1 + t2 - t3);
nase = sqrt(rsub*nase);
parm[2] = nase; /* NT standard error */
parm[3] = alpha - quant * nase; /* NT CI lower */
parm[4] = alpha + quant * nase; /* NT CI upper */
/*--- Compute ADF ASE ----*/
/* set symm matrix jac[nvar,nvar] */
dwrtvar = -2. * vrat * sumcovs / (summat*summat);
dwrtcov = vrat * sumvars / (summat*summat);
jac = J(nvar,nvar,dwrtcov);
/* set diagonal */
do j= 1 to nvar;
jac[j,j] = dwrtvar;
end;
/* run through data[nsub,nvar] */
trac = 0.;
do isub=1 to nsub;
v = data[isub,] - mean; /* row vector */
/* note the off diagonal entries are used
twice, that's why jac[] was changed */
wcv = jac # (v` * v - cov);
tmp = wcv[+,+];
trac = trac + tmp * tmp;
end;
nnase = sqrt(rsub*rs1*trac);
parm[5] = nnase; /* ADF standard error */
parm[6] = alpha - quant * nnase; /* ADF CI lower */
parm[7] = alpha + quant * nnase; /* ADF CI upper */
return(parm);
finish scalpha;
/*--- Call the IML Module ---*/
parm = scalpha(data,prob); /* parm[7] should be row vector */
/*--- Fill output data set ---*/
nams = { Alpha NT_SE NT_LCI NT_UCI ADF_SE ADF_LCI ADF_UCI };
create out from parm[colname=nams];
append from parm;
/* end of the macro alphaest */
%mend;
/* Example */
/* Only code below this point needs to be changed. The dataset name and variable names must be specified. Only bolded text needs to be changed. */
/* Call the macro */
%alphaest(dataset=caq,vars=i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12, prb=.05, out=parm);
/* Print the results */
proc print data=out; run;
多谢!