运行多个回归是一种智能的矢量化方法

时间:2014-04-22 12:35:57

标签: r regression

我写过我认为是半快速ols-回归函数

ols32 <- function (y, x,Ridge=1.1) {
xrd<-crossprod(x)
xry<-crossprod(x, y)
diag(xrd)<-Ridge*diag(xrd)
solve(xrd,xry)
}

现在我想将其应用于以下

(vapply(1:la, function(J) 
ME %*% ols32((nza[,J]),(cbind(nzaf1[,J],nzaf2[,J],nza[,-J],MOMF)))
[(la+2):(2*la+1)],FUN.VALUE=0))

其中nza,nzaf1,nzaf2和MOMF是500x50矩阵,la = 50,ME是长度为50的向量。 所以我实际上做的是回归,但只使用MOMF中的β系数,乘以ME。

nza.mat<-matrix(rnorm(500*200),ncol=200)
nza<-nza.mat[,1:50]
nzaf2<-nza.mat[,101:150]
MOMF<-nza.mat[,151:200]
nzaf1<-nza.mat[,51:100]
ME<-nza.mat[500,151:200]

是否有一种让事情变得更快的方法,或者我是否需要使用像RcppEigen这样的东西? Tks P

所以我通过重写我的ols-function来提出一种稍微快一点的方法来解决这个问题,这样它就可以为整个矩阵计算两次交叉产品。新功能如下所示:

ols.quick <- function (y, x, ME) {
 la<-dim(y)[2]
 XX.cross<-crossprod(x)
 XY.cross<-crossprod(x, y)
 diag(XX.cross)<-Ridge*diag(XX.cross)
 betas<-sapply(1:la, function(J){
 idx<-c((1:la)[-J],la+J,2*la+J,(3*la+1):(4*la)); 
 solve(XX.cross[idx,idx],XY.cross[idx,J])},simplify=T)
 ME%*%betas[(la+2):(2*la+1),]
}

,其中     y = nza(500x50)和x = cbind(nza,nzaf1,nzaf2,MOMF)(500x200) 这解决了问题的速度提高了3.5倍。

microbenchmark(ols.quick(nza,nza.mat,ME),
vapply(1:la, function(J) ME%*%ols32(nza[,J],(cbind(nzaf1[,J],nzaf2[,J],nza[,-J],MOMF)))
[(la+2): (lb+2)],FUN.VALUE=0))


min        lq    median        uq       max neval
66.30495  67.71903  68.57001  70.17742  77.80069   100
251.59395 255.43306 258.35041 262.85742 296.51313   100

我想我可以通过并行程序包中的parLapply获得一些速度但我还没看过它。

0 个答案:

没有答案