如何在融化的数据框中分别计算线性模型

时间:2020-10-01 21:06:35

标签: r linear-regression


我目前遇到一个问题,即我有一个类似于下面称为“测试”的数据框。 我想做的是针对每个站点针对时间和组拟合线性模型,因此一个模型适用于A,一个模型适用于B,一个模型适用于C。
例如:网站A分为两个组: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)

2 个答案:

答案 0 :(得分:2)

使用group_split的{​​{1}},然后使用Site的{​​{1}}:

map

输出:

lm()

在对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 或您想要的其他任何后拟合过程:

%>% summary()

答案 1 :(得分:1)

可以使用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