我有兴趣使用交叉验证(leave-one-out或K-folds)来测试我创建的几个不同的负二项GLM。我使用glm.nb()
中的MASS
函数运行负二项式回归。
我的问题是我是否可以使用cv.glm()
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)
[我不确定这个问题是属于这里还是交叉验证...]
答案 0 :(得分:4)
使用cv.glm()
对任何glm
对象都有效。它不使用任何更新公式来计算交叉验证分数,而只是删除一个组,为减少的数据集拟合模型,并计算预测误差。为了获得最终平均值,这样做了很多次。通过这种方式,留一交叉验证(默认)比K折交叉验证成本高得多。
为什么它对任何glm
对象都有效?它如何知道它应该适合哪种型号?好吧,你通过传递你的拟合模型m1
来告诉它。看看:
m1$call
#glm.nb(formula = daysabs ~ math + prog, data = dat, init.theta = 1.032713156,
# link = log)
当cv.glm
删除数据并为模型减少数据集时,它会使用此类调用。因此,您每次都绝对适合负二项模型。
我试图解释
cv.glm()$delta
的结果。在上面的例子中,该模型预测了#34;学校缺席的日子&#34;,$delta
的输出是~42.1。我会将其解释为&#34;平均而言,此模型的预测误差为42天&#34;?
默认情况下,cv.glm()
返回由cost
参数定义的MSE:
cost = function(y, yhat) mean((y - yhat)^2
所以42.1实际上是预测方差。您需要RMSE,即sqrt(42.1) = 6.5
,用于预测误差/标准偏差。它与您的响应变量具有相同的单位。