Не работает пошаговая функция после glm только в процедуре dplyr - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь запустить пошаговую регрессию с использованием dplyr, но это приводит к следующей ошибке:

Error in as.data.frame.default(data) : cannot coerce class ‘c("glm", "lm")’ to a data.frame

glm работает хорошо, но когда код пытается сохранить результат шага в В кадре данных возникает ошибка.

Я проверил, что класс функции glm и шаг функции совпадают с "c (glm, lm)". Но только функция step не работает.

Я пробовал несколько способов исправить эту ошибку, например, оператор do, map2 (передача данных в качестве параметра данных), но ничего не работает.

подробнее ... при запуске этого кода:

...
  group_by(ITEM_CODE) %>%
  nest() %>%
  mutate(model = map(data, ~ glm(formula_full,family=gaussian(),na.action=na.omit,data=.x))
         ) %>%
  ungroup()

результаты выглядят следующим образом ... здесь, glm возвращает c ("glm", "lm")

> M_CODE     data       model 
> 0034019   <tibble>    <S3: glm>       
> 0040726   <tibble>    <S3: glm>           
> 0057446   <tibble>    <S3: glm>

Я пытаюсь добавить результаты 'step' в 4-й столбец этого (следующий столбец модели).

Но когда я пытаюсь запустить следующий код (добавить переменную stepm)

2-й код:

  group_by(ITEM_CODE) %>%
  nest() %>%
  mutate(model = map(data, ~ glm(formula_full,family=gaussian(),na.action=na.omit,data=.x))
        ,stepm = map(model, ~ step(.x, direction = "both", trace = 0)) # <-- Error point!
         ) %>%
  ungroup()

, тогда возникает ошибка, о которой я упоминал сначала.

На самом деле, class (model) = class (stepm) = c ("glm", "lm"), но только stepm не принят и пропущена ошибка ..

Итак, Я очень смущен .. Кто-нибудь знает об этой проблеме ..?

Спасибо заранее

1 Ответ

0 голосов
/ 10 марта 2020

Меня также смущает причина этой ошибки, но я получил подсказку от здесь и попытался обернуть glm в do.call

library(tidyverse)
set.seed(101)
model_df <- tibble(label=c("a", "b", "c"),
model_data = list(tibble(y=rbinom(100,size=1,prob=0.5),
                x1=rnorm(100),
                x2=rnorm(100),
                x3=rnorm(100),
                x4=rnorm(100)),
         tibble(y=rbinom(100,size=1,prob=0.5),
                x1=rnorm(100),
                x2=rnorm(100),
                x3=rnorm(100),
                x4=rnorm(100)),
         tibble(y=rbinom(100,size=1,prob=0.5),
                x1=rnorm(100),
                x2=rnorm(100),
                x3=rnorm(100),
                x4=rnorm(100))))
model_df <- model_df %>%
    mutate(model = map(model_data, ~ do.call("glm", list(y ~ x1 + x2 + x3 + x4,
                       family = gaussian(),
                       na.action=na.omit,
                       data = .x)))) %>%
    mutate(stepm = map(model, ~ step(.x, direction = "both", scope=list(lower=.~1, upper=formula(.x)),
                                     trace = 0)))
model_df$stepm[[1]]
#> 
#> Call:  glm(formula = y ~ 1, family = structure(list(family = "gaussian", 
#>     link = "identity", linkfun = function (mu) 
...
#> 
#> Coefficients:
#> (Intercept)  
#>        0.54  
#> 
#> Degrees of Freedom: 99 Total (i.e. Null);  99 Residual
#> Null Deviance:       24.84 
#> Residual Deviance: 24.84     AIC: 148.5
...