计算具有负二项式响应的GLM的交叉验证

Kod*_*lds 6 regression r glm cross-validation

我有兴趣使用交叉验证(leave-one-out或K-folds)来测试我创建的几个不同的负二项式GLM.我正在使用glm.nb()函数MASS来运行负二项式回归.

我的问题是我是否可以使用cv.glm()from boot来测试这个模型.我倾向于不,但想知道是否有人知道一个功能,让我进行K-folds验证(或留下一个).或者,也许cv.glm()对负二项式完全有效.

以下是一些来自在线示例的数据.我原以为交叉验证结果($delta)应该在0到1之间,但下面的情况并非如此(可能表明出现了问题) http://www.ats.ucla.edu/stat/r/ DAE/nbreg.htm

我发现了一些关于解释输出的问题cv.glm(),但没有具体说明如何用R中的负二项模型进行交叉验证

require(foreign)
require(ggplot2)
require(MASS)
require(boot)

dat <- read.dta("http://www.ats.ucla.edu/stat/stata/dae/nb_data.dta")
dat <- within(dat, {
 prog <- factor(prog, levels = 1:3, labels = c("General", "Academic","Vocational"))
  id <- factor(id)
})


summary(m1 <- glm.nb(daysabs ~ math + prog, data = dat))

#This code will run, but is it valid for negative binomial GLM models?
cv.glm(dat,m1,K=10)
Run Code Online (Sandbox Code Playgroud)

[我不确定这个问题是属于这里还是交叉验证...]

李哲源*_*李哲源 5

使用cv.glm()对任何对象都有效glm。它不使用任何更新公式来计算交叉验证分数,而是简单地删除一个组,拟合缩减数据集的模型,并计算预测误差。如此进行多次以获得最终平均值。这样,leave-1-out交叉验证(默认)比K折交叉验证的成本要高得多。

为什么它对任何glm对象都有效?它如何知道它应该适合什么模型?好吧,你通过传递你的拟合模型来告诉它m1。看一下:

m1$call
#glm.nb(formula = daysabs ~ math + prog, data = dat, init.theta = 1.032713156, 
#    link = log)
Run Code Online (Sandbox Code Playgroud)

cv.glm删除数据并重新调整模型以减少数据集时,它会使用此类调用。所以你每次肯定都在拟合负二项式模型。


我正在尝试解释 的结果cv.glm()$delta。在上面的示例中,模型预测“缺课天数”,输出$delta约为 42.1。我是否会将其解释为“平均而言,该模型的预测误差为 42 天”?

默认情况下,cv.glm()返回 MSE,由参数定义cost

cost = function(y, yhat) mean((y - yhat)^2
Run Code Online (Sandbox Code Playgroud)

所以 42.1 确实是预测方差。您需要 RMSE,即sqrt(42.1) = 6.5来表示预测误差/标准差。它与您的响应变量具有相同的单位。