在带有偏移项的 glm 上使用扫帚(增强)和建模器(crossv_kfold)时出错
Error when using broom (augment) and modelr (crossv_kfold) on glm with an offset term
我正在尝试使用建模器 crossv_kfold 在 k 折交叉验证数据集上拟合泊松回归模型,然后使用 broom 的增强函数进行预测。在我正在建模的数据中,我有一个我试图预测的计数,但它需要被一个曝光变量抵消。为了可重复性,我包含了一个增强数据集来说明。
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.
问题是 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")))
不会抛出任何错误并产生所需的结果。
我正在尝试使用建模器 crossv_kfold 在 k 折交叉验证数据集上拟合泊松回归模型,然后使用 broom 的增强函数进行预测。在我正在建模的数据中,我有一个我试图预测的计数,但它需要被一个曝光变量抵消。为了可重复性,我包含了一个增强数据集来说明。
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.
问题是 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")))
不会抛出任何错误并产生所需的结果。