我使用dplyr::do
和glm
将模型按组拟合到示例数据。我想添加具有置信区间上限和下限的列:如何避免两次调用confint
?通常,有没有办法使用dplyr::mutate
?
df <- data.frame(
x = rep(c("a", "b"), each=10),
y = c(rpois(10, 0.5), rpois(10, 2.2)))
sdf <- df %>%
group_by(x) %>%
do(fit=glm(y ~ 1, poisson, data=.))
mutate(sdf,
est=coef(fit),
cil=confint(fit)[1],
ciu=confint(fit)[2])
简而言之,我希望这一点能够发挥作用:
mutate(sdf, ci=confint(fit)) %>%
mutate(cil=ci[1], ciu=ci[2])
如果我再次使用do
,我会丢失拟合的模型x
。
解决方案
我实际使用的内容(从接受的答案中学习):
sdf <- df %>%
group_by(x) %>%
do({
fit <- glm(y ~ 1, poisson, data=.)
ci <- confint(fit)
data.frame(
est=coef(fit),
cil=ci[1],
ciu=ci[2])
})
答案 0 :(得分:2)
正如评论中所述,这是一种使用dplyr
,purrr
,tidyr
和broom
的方法。
library(purrr)
library(tidyr)
library(dplyr)
library(broom)
sdf <- df %>%
nest(y) %>%
mutate(model = map(data, ~glm(y ~ 1, poisson, data = .))) %>%
unnest(map(model, tidy))
Source: local data frame [2 x 8]
x data model term estimate std.error statistic p.value
(fctr) (chr) (chr) (chr) (dbl) (dbl) (dbl) (dbl)
1 a <tbl_df [10,1]> <S3:glm, lm> (Intercept) -0.5108256 0.4082458 -1.251270 2.108361e-01
2 b <tbl_df [10,1]> <S3:glm, lm> (Intercept) 1.0296194 0.1889795 5.448311 5.085025e-08
我会通过Google阅读更多关于purrr
,tidyr
和broom
的信息,以及包装内容网页。 RStudio Blog about tidyverse packages上还有很多有用的信息。
答案 1 :(得分:1)
所有上述评论都是很好的新软件包,可以帮助解决您的问题(我强烈推荐purrr
),但如果您想坚持使用do
,您可以像这样重新格式化,这样您就可以了每组调用一次confint
:
sdf <- df %>%
group_by(x) %>%
do({fit <- glm(y ~ 1, poisson, data=.);
data.frame(confint(fit), coef(fit))})
输出需要一些工作才能进入可绘制的格式:
sdf %>% mutate(ci = rep(c("low", "high"), legnth.out = nrow(.))) %>% spread(ci, confint.fit.)