【问题标题】:lm() for regression in R using for looplm() 在 R 中使用 for 循环进行回归
【发布时间】:2014-10-13 13:12:46
【问题描述】:

我正在使用 lm() 使用两个矩阵(一个数据和一个权重)进行线性回归,其中我循环遍历列并一次使用一列进行回归。我的数据 (e) 是一个 102 x 200,000 的矩阵,看起来像:

V1 V2 V3 ...
-0.79 -0.79 -0.79 ...
-0.93 -0.93 -0.93 ...
-0.18 -0.18 -0.18 ...

而且我的权重矩阵(权重)在维度上是相等的。我的设计矩阵 (mod.our) 是 102 x 29,看起来像:

X-intercept GI Hematopoietic Brain ...
1 0 0 1
1 0 0 0
1 0 1 0

我的代码是:

lm.i<-c()
for (i in seq(1,216063,1)){
lm.i<-c(lm.i,lm(formula=e[,i] ~ mod.our, weights=weights[,i]))
}

问题是它已经运行了超过 24 小时。有谁知道如何更快地做到这一点?还是一般来说更好的方法?

【问题讨论】:

  • 线性回归只适合斜率加常数,或 NVAR + 1,或 103 个系数。您需要的最小行数是 206。您可以随机抽样数据行,并从中选择 1000 行,这样可以减少问题的大小并可能加快问题的速度。
  • 不要通过附加来增加结果列表:预先分配它。分布/并行化问题也很容易。
  • 嗨@BenBolker,您的意思是使用一个for循环进行并行化,例如一次1000列(而不是全部216,000列)?
  • 使用lm.wfit 效率更高(如果指定了权重,这是拟合函数lm 调用)。当然,请遵循 Ben Bolker 的建议(最好使用 lapply 或其并行版本之一)。

标签: r regression lm


【解决方案1】:

您需要使用迭代过程来获取系数。我相信最常使用Stochastic Gradient Descent

有人在这里展示了一个带注释的示例:

http://www.r-bloggers.com/regression-via-gradient-descent-in-r/

此外,包 RSofia 包含 R 中的 SGD 实现。或者只是在您最喜欢的 R 包中搜索此类应用程序。

我个人只在 Python 中使用过 SGD(我的一般建议是使用 Python 来解决大型机器学习问题,而不是使用 R 来提高速度)。

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 2021-12-26
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多