首页 > 解决方案 > “评估错误:对象'。' 未找到。” 将函数应用于列表列中的模型时

问题描述

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

标签: rdplyr

解决方案


一个选项是在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   

推荐阅读