在R中使用相同的设计矩阵拟合许多线性模型

时间:2013-01-28 19:58:30

标签: r parallel-processing regression mlm

对于神经影像应用,我试图通过R中的最小二乘拟合许多线性模型(标准调用lm)。想象一下,我有一个设计矩阵X.这个设计矩阵在所有模型中都是相同的。正在拟合的数据(Y)将发生变化,因此所有拟合参数(例如,beta,p值,残差等)都会发生变化。

目前,我只是将它放在for循环中,所以它正在对lm进行数十万次调用。似乎必须有更好的方式。

我认为计算成本最高的部分是矩阵求逆。看起来这可以通过lm.fit中的Fortran调用来处理。

如果我手动进行这种回归,我会进行矩阵求逆,然后将其乘以各种数据集。事实上,当我有一个表现良好的设计矩阵(例如所有连续值的协变量)时,我编写了一个函数来做到这一点。但是,我非常喜欢lm所做的所有工作,比如适当地重新编码我的因素等等,lm的输出也非常好。

反正有蛋糕也吃了吗?也就是说,为了获得lm的友好性,但是使用这种能力来计算有效地拟合具有相同设计矩阵的许多模型?

3 个答案:

答案 0 :(得分:11)

是的,还有更好的方法。我们一直在编写示例替换函数fastLm(),它基于在RcppArmadillo,RcppGSL和RcppEigen包中使用Armadillo,GSL和Eigen的外部C / C ++代码。

到目前为止,花费最多的时间来设置模型矩阵并去除公式。您可以在lm()中阅读fastLm()或我们的来源,并了解如何只进行一次解析。保持右侧,然后遍历不同的y向量。您使用哪种拟合功能更少。我喜欢RcppArmadillo的fastLm(),但是嘿,我也写过:)

答案 1 :(得分:8)

来自lm的帮助页面:

  

如果'响应'是矩阵,则线性模型分别拟合   矩阵每列的最小二乘法。

因此,似乎一种简单的方法是将所有不同的y向量组合成一个矩阵,并将其作为响应传递给lm的单个调用。例如:

(fit <- lm( cbind(Sepal.Width,Sepal.Length) ~ Petal.Width+Petal.Length+Species, data=iris))
summary(fit)
summary(fit)[2]
coef(summary(fit)[2])
coef(summary(fit))[2]
sapply( summary(fit), function(x) x$r.squared )

答案 2 :(得分:5)

我不知道使用lm的更好方法;但您可能需要考虑使用函数lsfit。尽管语法lsfit(X,y)更简单且花边更少,但y允许lsfit不仅是具有响应变量值的向量,而且还是矩阵。然后,对y的一次调用适合X的所有列 通过在相同的设计矩阵{{1}}上回归它们。相当快速和方便。