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