不能在地图中使用 emmeans
can't use emmeans inside map
这个有效:
testmodel=glm(breaks~wool,data=warpbreaks)
emmeans::emmeans(testmodel,"wool")
这个有效:
warpbreaks %>%
group_by(tension) %>%
do(models=glm(breaks~wool,data=.)) %>%
ungroup() %>%
mutate(means=map(models,~emmeans::emmeans(.x,"wool")))
这不是:
warpbreaks %>%
group_by(tension) %>% nest() %>%
mutate(models=map(data,~glm(breaks~wool,data=.x))) %>%
mutate(means=map(models,~emmeans::emmeans(.x,"wool")))
Error in is.data.frame(data) : object '.x' not found
Error in mutate_impl(.data, dots) :
Evaluation error: Perhaps a 'data' or 'params' argument is needed.
知道是什么原因造成的吗?
我们可以分两步完成
df1 <- warpbreaks %>%
group_by(tension) %>%
nest() %>%
mutate(models = map(data,~glm(breaks~wool,data=.x)))
warpbreaks %>%
split(.$tension) %>%
map( ~glm(breaks ~ wool, data = .x) %>%
emmeans(., "wool")) %>%
mutate(df1, Means = .)
# A tibble: 3 x 4
# tension data models Means
# <fctr> <list> <list> <list>
#1 L <tibble [18 x 2]> <S3: glm> <S4: emmGrid>
#2 M <tibble [18 x 2]> <S3: glm> <S4: emmGrid>
#3 H <tibble [18 x 2]> <S3: glm> <S4: emmGrid>
我明白了。问题在于 emmeans 尝试从 lm/glm 对象恢复数据的方式:它尝试 运行 存储在对象中的调用,如果在与原始 glm( ) 电话:
emmeans:::recover_data.lm
这是一个简单的例子:
wb=warpbreaks
model=glm(breaks~wool,data=wb)
emmeans(model,"wool")
rm(wb)
emmeans(model,"wool")
以下是使 emmeans() 与 map() 一起工作的方法:
warpbreaks %>%
group_by(tension) %>% nest() %>%
mutate(models=map(data,~glm(breaks~wool,data=.x))) %>%
mutate(means=map(models,~emmeans::emmeans(.x,"wool",data=.x$data)))
recover_data() 不只是自动使用 lm/glm 对象的数据属性,而是假定调用将在当前环境中运行,这似乎很奇怪...
这个有效:
testmodel=glm(breaks~wool,data=warpbreaks)
emmeans::emmeans(testmodel,"wool")
这个有效:
warpbreaks %>%
group_by(tension) %>%
do(models=glm(breaks~wool,data=.)) %>%
ungroup() %>%
mutate(means=map(models,~emmeans::emmeans(.x,"wool")))
这不是:
warpbreaks %>%
group_by(tension) %>% nest() %>%
mutate(models=map(data,~glm(breaks~wool,data=.x))) %>%
mutate(means=map(models,~emmeans::emmeans(.x,"wool")))
Error in is.data.frame(data) : object '.x' not found
Error in mutate_impl(.data, dots) :
Evaluation error: Perhaps a 'data' or 'params' argument is needed.
知道是什么原因造成的吗?
我们可以分两步完成
df1 <- warpbreaks %>%
group_by(tension) %>%
nest() %>%
mutate(models = map(data,~glm(breaks~wool,data=.x)))
warpbreaks %>%
split(.$tension) %>%
map( ~glm(breaks ~ wool, data = .x) %>%
emmeans(., "wool")) %>%
mutate(df1, Means = .)
# A tibble: 3 x 4
# tension data models Means
# <fctr> <list> <list> <list>
#1 L <tibble [18 x 2]> <S3: glm> <S4: emmGrid>
#2 M <tibble [18 x 2]> <S3: glm> <S4: emmGrid>
#3 H <tibble [18 x 2]> <S3: glm> <S4: emmGrid>
我明白了。问题在于 emmeans 尝试从 lm/glm 对象恢复数据的方式:它尝试 运行 存储在对象中的调用,如果在与原始 glm( ) 电话:
emmeans:::recover_data.lm
这是一个简单的例子:
wb=warpbreaks
model=glm(breaks~wool,data=wb)
emmeans(model,"wool")
rm(wb)
emmeans(model,"wool")
以下是使 emmeans() 与 map() 一起工作的方法:
warpbreaks %>%
group_by(tension) %>% nest() %>%
mutate(models=map(data,~glm(breaks~wool,data=.x))) %>%
mutate(means=map(models,~emmeans::emmeans(.x,"wool",data=.x$data)))
recover_data() 不只是自动使用 lm/glm 对象的数据属性,而是假定调用将在当前环境中运行,这似乎很奇怪...