“评估错误:对象'。未找到。”将功能应用于列表列中的模型时

时间:2019-04-09 16:29:24

标签: r dplyr

我使用dplyr的“ do”功能为多个组运行了glm模型。现在,我想将DescTool包中的PseudoR2()函数应用于结果列表列中的每个模型。但是,我收到“评估错误:对象'。”未找到。”显然是因为PseudoR2()想使用用于生成模型的数据,但是模型的data =。,在环境中不存在。

一般的问题是,如何将需要访问原始数据的函数应用于使用'。'生成的模型?

以下是可重现的示例:

require(dplyr)
require(DescTools)

dta = tibble(id = c(rep("A", 4), rep("B", 4)),
             y = rnorm(8),
             x = rnorm(8))

dta %>% group_by(id) %>%
  do(fit = glm(y ~ x, data = .)) %>% 
  mutate(R2 = PseudoR2(fit))

2 个答案:

答案 0 :(得分:1)

一种选择是在nest之后建立模型

library(tidyverse)
library(DescTools)
dta %>%
   group_by(id) %>% 
   nest %>% 
   mutate(data = map(data, ~ 
       .x %>% 
       mutate(fit = list(glm(y ~ x)), R2 = map(fit, PseudoR2)))) %>% 
  unnest %>%
  unnest(R2)
# A tibble: 8 x 5
#  id         y      x fit              R2
#  <chr>  <dbl>  <dbl> <list>        <dbl>
#1 A     -1.28   0.537 <S3: glm> 0.0000992
#2 A     -0.576 -0.508 <S3: glm> 0.0000992
#3 A     -0.635 -1.28  <S3: glm> 0.0000992
#4 A      0.324  0.272 <S3: glm> 0.0000992
#5 B     -0.329  0.290 <S3: glm> 0.0878   
#6 B     -1.13   0.432 <S3: glm> 0.0878   
#7 B     -1.42  -0.924 <S3: glm> 0.0878   
#8 B      0.551 -1.47  <S3: glm> 0.0878   

答案 1 :(得分:0)

这可以通过直接计算McFadden的R2提供所需的结果,但不能解决“ data =”时应用函数的问题。请注意,PseudoR2()中的问题是要重新拟合模型的update()基本函数。

require(dplyr)
require(DescTools)

dta = tibble(id = c(rep("A", 4), rep("B", 4)),
             y = rnorm(8),
             x = rnorm(8))

dta %>% group_by(id) %>%
  do(fit = glm(y ~ x, data = .),
     fitNULL = glm(y ~ x, data = .)) %>% 
  mutate(PseudoR2 = 1 - logLik(fit)/logLik(fitNULL))