【问题标题】:Compute cross-validation for GLMs with negative binomial response计算具有负二项式响应的 GLM 的交叉验证
【发布时间】:2016-11-11 08:19:33
【问题描述】:

我有兴趣使用交叉验证(留一法或 K 折叠)来测试我创建的几种不同的负二项式 GLM。我正在使用MASS 中的glm.nb() 函数来运行负二项式回归。

我的问题是我是否可以使用来自bootcv.glm() 来测试这个模型。我倾向于不,但想知道是否有人知道可以让我执行 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)

[我不确定这个问题是属于这里还是属于 Cross Validated...]

【问题讨论】:

    标签: r regression glm cross-validation


    【解决方案1】:

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

    为什么它对任何glm 对象都有效?它怎么知道它应该适合什么模型?好吧,您可以通过传入您的拟合模型m1 来告诉它。看看:

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

    cv.glm 丢弃数据并重新调整模型以减少数据集时,它使用这样的调用。所以你肯定每次都在拟合一个负二项式模型。


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

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

    cost = function(y, yhat) mean((y - yhat)^2
    

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

    【讨论】:

    • 作为后续:我正在尝试解释 cv.glm() 输出的结果。在Wikipedia 和这个有用的r-tutorial 之间看起来好像 cv.glm$delta 是 MSE 或 RMSE,单位与预测变量相同。在上面的例子中,模型被预测为“缺课天数”,而 cv.glm$delta 的输出为 ~42.1 我是否将其解释为“平均而言,该模型的预测误差为 42 天”?跨度>
    猜你喜欢
    • 2014-02-18
    • 2016-09-07
    • 2021-06-09
    • 2021-11-03
    • 2014-02-22
    • 1970-01-01
    • 2020-01-15
    • 2019-04-24
    • 2020-11-22
    相关资源
    最近更新 更多