首页 > 解决方案 > effects::effect 无法识别 purrr::map 中的数据

问题描述

考虑这样的数据集:

library(lme4)
data(sleepstudy)
head(sleepstudy, 10)

   Reaction Days Subject
1  249.5600    0     308
2  258.7047    1     308
3  250.8006    2     308
4  321.4398    3     308
5  356.8519    4     308
6  414.6901    5     308
7  382.2038    6     308
8  290.1486    7     308
9  430.5853    8     308
10 466.3535    9     308

在基于分组变量进行分层时,我正在尝试运行一些混合效应线性模型。我可以:

library(dplyr)
libary(tidyr)
library(purrr)

sleepstudy %>%
 group_by(grp = gl(2, n()/2)) %>%
 nest() %>%
 mutate(fit = map(data, ~ lmer(Reaction ~ Days + (Days | Subject), data = .)))

获得:

  grp             data fit       
  <fct> <list<df[,3]>> <list>    
1 1           [90 × 3] <lmrMdLmT>
2 2           [90 × 3] <lmrMdLmT>

现在我想使用库中的effect()函数effects

library(effects)

sleepstudy %>%
 group_by(grp = gl(2, n()/2)) %>%
 nest() %>%
 mutate(fit = map(data, ~ effect(term = "Days",
                                 mod = lmer(Reaction ~ Days + (Days | Subject), data = .))))

但是,我总是遇到错误:

Error in is.data.frame(data) : object '.' not found

tidyverse当我在上下文之外使用它时:

sleepstudy2 <- sleepstudy %>%
 mutate(grp = gl(2, n()/2))

effect(term = "Days", mod = lmer(Reaction ~ Days + (Days | Subject), 
                                 data = sleepstudy2,
                                 subset = grp == 1))

然后它可以正常工作:

 Days effect
Days
       0        2        4        7        9 
252.2916 267.0686 281.8455 304.0110 318.7880 

知道如何解决这个问题并使用整洁的方法来解决吗?

标签: rtidyversepurrr

解决方案


因此,effects()当您使用的数据不在全局环境中时,该功能似乎存在真正的问题。?effects它在帮助页面的“警告和限制”部分中引用。他们指出了包装中的“嵌入”小插图,以car寻求可能的解决方法。他们建议的解决方法是在全球环境中制作数据数据的副本。它并不优雅,但这有效

poo <- sleepstudy %>%
  group_by(grp = gl(2, n()/2)) %>%
  nest() %>%
  mutate(fit = map(data, function(x) {
    assign(".dta", x, env=.GlobalEnv)
    eff <- effect(term="Days", mod=lmer(Reaction ~ Days + (Days | Subject), data=.dta))
    remove(".dta", envir=.GlobalEnv) 
    eff
  }))

推荐阅读