【问题标题】:"Evaluation error: object '.' not found." when applying function to models in a list column“评估错误:对象'。'未找到。”将函数应用于列表列中的模型时
【发布时间】:2019-04-10 19:46:52
【问题描述】:

我使用 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))

【问题讨论】:

  • 试试dta %>% group_by(id) %>% nest %>% mutate(data = map(data, ~ .x %>% mutate(R2 = glm(y ~ x) %>% PseudoR2))) %>% unnest

标签: r dplyr


【解决方案1】:

一个选项是在nesting 之后构建模型

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   

【讨论】:

  • 这行得通,但是对于一个简单的操作来说似乎很麻烦。我们能想出一个比 for 循环更简单的解决方案吗?
  • @DocHoliday 如果不想将模型存储为列,那么可以进一步简化
【解决方案2】:

这通过直接计算 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多