R - 使用不同设计矩阵运行多个线性模型的更快方法

时间:2015-03-30 10:18:56

标签: r performance vectorization linear-regression

我有一个数据矩阵,其中每列对应于一些测量的物质浓度,我需要将每种物质回归到其他所有物质,并使用一些固定的校正协变量。 由于设计矩阵一直在变化,fastLm()包中的RcppArmadillo等函数实际上并没有用(我之前查看了this)。

非常幼稚且不可取的想法是制作一个for循环,比如

Ncol <- ncol(mat)
mat1 <- mat2 <- matrix(ncol=Ncol, nrow=Ncol) ## matrices where I'll save what I need

for(i in seq(Ncol)) {
  for(j in seq(Ncol)[-i]) {
    mylm <- lm(mat[,i] ~ mat[,j] + covariates)
    mat1[i,j] <- summary(mylm)$something
    mat2[i,j] <- summary(mylm)$something.else
  }
}

我实际上正在运行,因为我没有更好的想法。我不熟悉矢量化算法,但我很确定它会加快速度。

有人对如何加快计算有任何建议吗?我必须对4个数据集进行分析,每个数据集大约有300,650,800,2000列......

1 个答案:

答案 0 :(得分:0)

这几乎是我的包MatrixEQTL所做的。 这是一个用于在数据上运行它的代码。 (没有你的数据就无法测试它,所以如果出现问题,请告诉我。)

library(MatrixEQTL)
data = SlicedData$new(t(mat))
cvrt = SlicedData$new(t(covariates))
me = Matrix_eQTL_engine(
   snps = data,
   gene = data,
   cvrt = cvrt,
   output_file_name = NULL,
   pvOutputThreshold = 1,
   useModel = modelLINEAR, 
   errorCovariance = numeric(), 
   verbose = TRUE,
   pvalue.hist = FALSE,
   min.pv.by.genesnp = FALSE,
   noFDRsaveMemory = FALSE);

t统计数据和p值将位于me$all$eqtls