【问题标题】:Performing linear regressions using columns of two matrices in R使用 R 中的两个矩阵的列执行线性回归
【发布时间】:2019-01-22 05:19:45
【问题描述】:

我有两个尺寸相同的大矩阵,例如:

#dummy matrices
A <- matrix(c(1:3288),nrow=12) 
B <- matrix(c(3289:6576),nrow=12)

对于每一列,我想在两个矩阵(A 和 B)之间进行线性回归,如果可能的话,我想将 lm 的输出放入数据框,例如对于每一列的回归,我想知道 lm 的 r^2、斜率、截距等。

任何帮助表示赞赏。

【问题讨论】:

  • lm_list &lt;- lapply(seq_len(ncol(A)), function(i) lm(A[, i] ~ B[, i])) 开始,然后执行coef_list &lt;- lapply(lm_list, coef)smry_list &lt;- lapply(lm_list, summary)。从后者很容易得到

标签: r matrix lm


【解决方案1】:

假设您将拟合任意两个列组合之间的回归,这可能是一个解决方案。请记住,根据您最终想要的结果 data.frame 中的内容,代码会发生变化。

A <- matrix(c(1:3288),nrow=12) 
B <- matrix(c(3289:6576),nrow=12)


library(broom)
library(dplyr)

results <- NULL

for (i in 1:ncol(A)){
  for (j in 1:ncol(B)){
    model_<-lm(A[,i]~B[,j])

    results<-bind_rows(results,
                       bind_cols(columnx = i, 
                                 columny = j,
                                 glance(model_),
                                 intercept=model_$coefficients[1],
                                 slope=model_$coefficients[2]
                       )
    )
  }
}

如果您只需要 A 中的第 1 列与 B 中的第 1 列、2 与 2 等形式的成对回归,则可以使用 purr 包中的 map 编写更优雅的解决方案。希望这会有所帮助。

编辑:仅在 A 中拟合 1,在 B a 中拟合 1,依此类推

library(purrr)
library(dplyr)
library(broom)


A<-data.frame(A)
B<-data.frame(B)

results <- map2_df(.x = A,
     .y = B, ~ {

       model_<-lm(.y ~ .x)
       bind_cols(glance(model_),
                 intercept=model_$coefficients[1],
                 slope=model_$coefficients[2]
       )
     })

这是咕噜声documentation。很清楚地解释了 map2_df 的工作原理。它基本上同时循环两个列表,执行一个函数并返回一个data.frame。

【讨论】:

  • 嗨@Phill - 我只需要第 1 列 A 到 B 列和第 2 列与 2 的成对回归等等......所以这真的很棒! - 感谢您的快速回复!
  • 我刚刚编辑了答案以包含该场景。请记住,两个矩阵中的列数必须相同。如果矩阵之间的列数不一致,则“for”方法可能更灵活但效率更低:)
  • 啊,我的数据集有一个问题,Na 的 .... 有没有办法为此添加 na.omit=T 方面?也许在 model_
  • 在这种情况下,让您处理 NA 的 lm 中的参数是 na.action,您可以在此处查看它:rdocumentation.org/packages/stats/versions/3.5.2/topics/lm 和此处stats.idre.ucla.edu/r/faq/how-does-r-handle-missing-values。根据您的评论,您可能希望在 lm 调用中使用 na.action=na.omit
  • 不客气 :) 你考虑过某种输入吗?还是将观察结果汇总到每周数据?此外,您可以在运行任何估计之前使用 complete.cases 来查看 NA 问题有多大
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 2020-03-28
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多