记得刚刚在COS论坛上提问,欲将加加减减的活儿交给底层C语言处理。一个简单的测试为:求出每一列数据中对应于每一个因子的数据和的评分。比如,第一列为:1,1,2,1,15,3,18,9……,对应的数据为:1.2,0.7,-0.3,-0.6,0.4,0.17,0.03,0.06……。就是计算第一列全部为"1"的数据的和的平方,第一列全部为2的数据的和的平方,随后把所有的因子的结果求和。分别用R和R调用C写了一个函数,但是,结果相差非常大,我比较相信是我的C里面出了问题,但是具体是什么问题,我还是无解,先把代码放上。
#fomula:7.85,page(377),chapter 7.3 Logistic regression with random intercept<br />
#score=sum of hidden states group(sum(residuals in each group)^2)<br />
sumsq<-function(x){<br />
s<-sum(x)^2<br />
s<br />
}<br />
score<-function(HS,phe){<br />
result<-apply(HS,2,phe=phe,function(HS1,phe)sum(aggregate(phe,by=list(HS1),sumsq)))<br />
result<br />
}</p>
<p>## "hand" calculation in C calling Rmath.h<br />
writeLines("#include <Rmath.h><br />
void calc_svalue(int *hs, double *phe, int *ngroup, int *nmk, int *nrec,double *sumsq)<br />
{<br />
double eachs[*ngroup];<br />
int i,j,k;<br />
for (i = 0; i < *nmk; i++) {<br />
for (j = 0; j < *nrec; j++) {<br />
eachs[hs[i * *nrec +j]] = eachs[hs[i * *nrec +j]]+phe[j];<br />
}<br />
for (k = 0; k < (*ngroup+1); k++) {<br />
sumsq[i]= sumsq[i]+ eachs[k] * eachs[k];<br />
eachs[k]=0;<br />
}<br />
}<br />
}", "calc_svalue.c")<br />
system("R CMD SHLIB calc_svalue.c")<br />
dyn.load(sprintf("calc_svalue%s", .Platform$dynlib.ext))</p>
<p>set.seed(12)<br />
hs<-matrix(sample(1:20,200,replace=T),100)<br />
phe<-runif(100)<br />
ngroup<-20<br />
score1<-score(hs,phe)<br />
score2<-.C("calc_svalue", as.integer(hs), as.double(phe), as.integer(ngroup),ncol(hs),nrow(hs),double(ncol(hs)))[[6]]
怎么可能会有这么大的差异呢??
</p>