代码之家  ›  专栏  ›  技术社区  ›  Lmm

使用R中两个矩阵的列执行线性回归

  •  0
  • Lmm  · 技术社区  · 6 年前

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

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

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

    感谢您的帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Phill    6 年前

    假设您将在任意两个列组合之间拟合回归,这可能是一个解决方案。请记住,根据最终需要的结果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中安装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的同时循环两个列表。