【问题标题】:Cross Validating step functions in RR中的交叉验证步骤函数
【发布时间】:2017-02-12 16:45:48
【问题描述】:

我试图从阶跃函数中获取错误,但我得到了一个错误:

library(boot)
library(ISLR)
attach(Wage)
set.seed(5082)
cv.error <- rep (0,12)
for (i in 2:13){
    step.fit = glm(wage~cut(age,i), data = Wage)
    cv.error[i] <- cv.glm(Wage ,step.fit, K= 10)$delta [1]
}

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
cut(age, i) has new levels (17.9,43.5], (43.5,69.1]

如果我使用特定中断而不是自动生成 cut() 索引,我可以从 cv.glm()$delta [1] 得到错误:

fit <- glm(wage~cut(age,breaks=c(17.9,33.5,49,64.5,80.1)), data = Wage)
cv.error <- cv.glm(Wage ,step.fit, K= 10)$delta [1]'

即使这些是 cut(age,4) 所做的完全相同的休息。

谁能解释发生了什么或如何修复错误。

我的目标是尝试从 12 种不同的步进模型中找出错误,并根据 cv.glm()$delta 错误选择最佳的。

【问题讨论】:

    标签: r regression linear-regression polynomial-approximations


    【解决方案1】:

    问题在于cut(age, i) 仅作为您的glm() 中的内联创建存在,而不是您用于验证的Wage 数据集的一部分。我们可以这样解决:

    library(boot)
    library(ISLR)
    data(Wage) # using attach is a bad practice
    set.seed(5082)
    cv.error <- rep (0,12)
    for (i in 2:13){
      Wage$tmp <- cut(Wage$age,i)
      step.fit = glm(wage~tmp, data = Wage)
      cv.error[i] <- cv.glm(Wage ,step.fit, K= 10)$delta [1]
    }
    
    cv.error
    

    [1] 0.000 1733.815 1682.731 1637.200 1631.049 1623.069 1613.099 1600.413 1613.127 1603.581 1603.601 1604.730 1602.462

    请注意,第一个值为 0 只是因为 i 的值从 2 开始,因此没有任何内容写入第一个元素。

    【讨论】:

      【解决方案2】:

      我研究了如何从cut 输出中获取标签,并在文档末尾找到了有用的注释 (??cut)

      ## one way to extract the breakpoints
      labs <- levels(cut(aaa, 3))
      cbind(lower = as.numeric( sub("\\((.+),.*", "\\1", labs) ),
            upper = as.numeric( sub("[^,]*,([^]]*)\\]", "\\1", labs) ))
      

      所以使用它:

      library(boot)
      library(ISLR)
      data(Wage)
      set.seed(5082)
      cv.error <- rep (0,12)
      for (i in 2:13){
        labs <- levels(cut(age, i))
        breaks <- unique(c(as.numeric(sub("\\((.+),.*", "\\1", labs)),
                          as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", labs))))
        step.fit <- glm(wage~cut(age,unique(breaks)), data = Wage)
        cv.error[i] <- cv.glm(Wage ,step.fit, K=10)$delta[1]
      }
      
      cv.error
       [1]    0.000 1733.815 1682.731 1637.200 1631.049 1623.069 1613.099 1600.413 1613.127 1603.581 1603.601
      [12] 1604.730 1602.462
      

      【讨论】:

        猜你喜欢
        • 2012-01-13
        • 2017-01-25
        • 2017-02-10
        • 2013-12-22
        • 2018-08-29
        • 2018-04-10
        • 1970-01-01
        • 2016-11-15
        • 2017-12-27
        相关资源
        最近更新 更多