我想运行 lm 模型并保存模型比较结果并提取 p 值。我想将所有信息保存在数据框中。以钻石数据集为例:
diamonds %>%
group_by(cut) %>%
do(model1 = lm(price~carat, data=.),
model2 = lm(price~carat+depth, data=.)) %>%
mutate(anova = anova(model2,model1)) %>%
mutate(pval= anova$'Pr(>F'[2])
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Error in mutate_impl(.data, dots) :
Column `anova` must be length 1 (the group size), not 6
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我的真实数据比这更复杂。只需使用菱形和线性模型来说明这个想法。非常感谢。
这是该tidyr::nest()函数与purrr和结合的一个非常好的应用broom。你要做的是: - 对数据框进行分组 - 应用模型mutate(mod = map(data, model)
- 总结模型broom::tidy()
- 提取相关统计数据。
有关更多信息,请参阅 Hadley 就该主题发表的精彩演讲:https : //www.youtube.com/watch?v=rz3_FDVt9eg
在您的情况下,我认为您可以执行以下操作:
library(tidyverse)
library(broom)
diamonds %>%
group_by(cut) %>%
nest() %>%
mutate(
model1 = map(data, ~lm(price~carat, data=.)),
model2 = map(data, ~lm(price~carat+depth, data=.))
) %>%
mutate(anova = map2(model1, model2, ~anova(.x,.y))) %>%
mutate(tidy_anova = map(anova, broom::tidy)) %>%
mutate(p_val = map_dbl(tidy_anova, ~.$p.value[2])) %>%
select(p_val)
Run Code Online (Sandbox Code Playgroud)