【问题标题】:How to calculate linear models individually in melted Dataframe [duplicate]如何在融化的数据框中单独计算线性模型[重复]
【发布时间】:2021-01-17 15:18:27
【问题描述】:


我目前有一个问题,我有一个类似于下面我称之为“测试”的数据框。 我想做的是针对时间和组为每个站点拟合一个线性模型,因此一个模型用于 A,一个用于 B,一个用于 C。
例如:站点 A 存在于 2 个组中:G1 和 G2。在 5 个时间点测量。所以我确实有 5 个值应该建模为依赖于时间(值 ~ 时间),并且因为它是在 2 个条件(组)中完成的,所以应该整合:(值 ~ 时间 * 组)。

我怎样才能最有效地实现这一点,然后从摘要中提取信息以将它们存储在向量或列表中?

感谢您的宝贵时间,我真的很感激。

test <- data.frame(Site= rep(c( rep("A", 5),
                                rep("B", 5),
                                rep("C", 5)),2),
                   
                    value= c(rnorm(1, n=15), rnorm(1, n=15)),
                    Time= rep(rep((1:5), 3), 2),
                    Group= c(rep("G1", 15), rep("G2", 15))
                    )

# Loop ?
linReg <- lm(value ~ Time * Group, data= test)

【问题讨论】:

  • got 是重复的...lme4::lmList(value~Time*Group|Site, data=test)
  • 感谢您为我提供我可能错过的原始解决方案

标签: r linear-regression


【解决方案1】:

group_splitSite 一起使用,然后将maplm() 一起使用:

library(tidyverse)

test %>%
  group_split(Site) %>%
  map(~lm(value ~ Time * Group, data = .))

输出:

[[1]]

Call:
lm(formula = value ~ Time * Group, data = .)

Coefficients:
 (Intercept)          Time       GroupG2  Time:GroupG2  
     -0.6393        0.5201        3.6533       -1.2188  


[[2]]

Call:
lm(formula = value ~ Time * Group, data = .)

Coefficients:
 (Intercept)          Time       GroupG2  Time:GroupG2  
    -0.38982       0.24745       0.58777      -0.08554  


[[3]]

Call:
lm(formula = value ~ Time * Group, data = .)

Coefficients:
 (Intercept)          Time       GroupG2  Time:GroupG2  
     0.17921       0.02528       2.13208      -0.34299  

在对map() 的调用中添加%&gt;% summary() 或您想要的任何其他后拟合过程:

map(~lm(value ~ Time * Group, data = .) %>% summary())

【讨论】:

    【解决方案2】:

    可以使用split()lapply() 实现基本 R 解决方案,如下所示:

    test <- data.frame(Site= rep(c( rep("A", 5),
                                    rep("B", 5),
                                    rep("C", 5)),2),
                       
                       value= c(rnorm(1, n=15), rnorm(1, n=15)),
                       Time= rep(rep((1:5), 3), 2),
                       Group= c(rep("G1", 15), rep("G2", 15))
    )
    
    models <- lapply(split(test,test$Site),function(x){
         lm(value ~ Time * Group, data = x)
    })
    
    models
    

    ...和输出:

    $A
    
    Call:
    lm(formula = value ~ Time * Group, data = x)
    
    Coefficients:
     (Intercept)          Time       GroupG2  Time:GroupG2  
          2.6466       -0.2999       -3.0912        0.7022  
    
    
    $B
    
    Call:
    lm(formula = value ~ Time * Group, data = x)
    
    Coefficients:
     (Intercept)          Time       GroupG2  Time:GroupG2  
          1.4547       -0.2859       -0.8216        0.5031  
    
    
    $C
    
    Call:
    lm(formula = value ~ Time * Group, data = x)
    
    Coefficients:
     (Intercept)          Time       GroupG2  Time:GroupG2  
         1.50226      -0.12825      -0.91705      -0.01143  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2023-04-03
      • 2014-07-26
      • 2022-11-10
      • 2020-08-17
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多