«Ошибка оценки: объект '.' не найдено." при применении функции к моделям в столбце списка - PullRequest
0 голосов
/ 09 апреля 2019

Я запустил модели glm для нескольких групп с помощью функции dplyr "do".Теперь я хочу применить функцию PseudoR2 () из пакета DescTool к каждой модели в результирующем столбце списка.Тем не менее, я получаю «Ошибка оценки: объект».не найдено."очевидно, потому что 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 ]

1 голос
/ 09 апреля 2019

Один из вариантов - построить модель после 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   
0 голосов
/ 10 апреля 2019

Это обеспечивает желаемый результат путем непосредственного вычисления 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...