r - “评估错误:对象'。' 未找到。” 将函数应用于列表列中的模型时
问题描述
我使用 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))
解决方案
一个选项是在nest
ing之后构建模型
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
推荐阅读
- powershell - 将参数传递给外部命令 - 停止解析
- angularjs - 使用 Jasmine 的带有控制器的单元测试指令
- python - 边界框的分离
- selenium - 由于公司政策,无法从 http://beust.com/eclipse/ 下载 testng。
- css - dist中的Angular 6多个css文件
- python - kwargs.get 只提取第一个字母
- perl - 如何在perl中重新声明同一范围内的变量?
- linux - Shell 脚本中基于菜单的选择
- python - Dask 从二进制文件中读取数据
- c# - 如何在 wpf 中添加 windows 媒体播放器控件?