Ошибка при использовании метлы (augment) и modelr (crossv_kfold) на glm со смещенным членом - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь подогнать модель пуассоновской регрессии к набору данных с перекрестным подтверждением в k-кратном размере, используя crossv_kfold моделира, а затем получить прогнозы, используя функцию увеличения метлы.В данных, которые я моделирую, у меня есть счетчик, который я пытаюсь предсказать, но он должен быть компенсирован переменной экспозиции.Ради воспроизводимости я включил расширенный набор данных для иллюстрации.

library(tidyverse)
library(modelr)
non_breaks = rpois(dim(warpbreaks)[1],20)
warp = warpbreaks %>%
    mutate(total = breaks + non_breaks)

Так что в этом примере я буду моделировать количество разрывов для заданных категориальных переменных и смещение по общей экспозиции.Я обнаружил, что, если я не включаю смещение в мою модель, все прекрасно работает:

library(broom)
warp_no_offset = crossv_kfold(warp, k = 10) %>%
    mutate(model = map(train, ~ glm(breaks~ wool*tension, ., family=poisson))) %>%
    mutate(predicted = map2(model, test, ~ augment(.x, newdata = .y, predict.type= "response")))

Но если я добавлю смещение:

warp_offset = crossv_kfold(warp, k = 10) %>%
    mutate(model = map(train, ~ glm(breaks~ offset(log(total)) + wool*tension, ., family=poisson))) %>%
    mutate(predicted = map2(model, test, ~ augment(.x, newdata = .y, predict.type= "response")))

выдает ошибку:

Error in mutate_impl(.data, dots) : 
    Evaluation error: arguments imply differing number of rows: 5, 49.

1 Ответ

0 голосов
/ 06 июня 2018

Проблема в том, что offset() не оценивается, как и когда вы думаете, что это так.Я вижу, как это было сложно, но решение простое.

Вам просто нужно помнить, чтобы использовать I() для преобразований внутри уравнения.

Например:

warp_offset = crossv_kfold(warp, k = 10) %>%
  mutate(model = map(train, ~ glm(breaks~ I(offset(log(total))) + wool*tension, ., family=poisson))) %>%
  mutate(predicted = map2(model, test, ~ augment(.x, newdata = .y, predict.type= "response")))

не выдаст ошибку и даст желаемые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...