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