R

时间:2017-02-12 16:45:48

标签: r regression linear-regression polynomial-approximations

我试图从步骤函数中获取错误,但是我收到错误:

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]

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

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错误选择最佳错误。

2 个答案:

答案 0 :(得分: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开始,因此没有任何内容写入第一个元素。

答案 1 :(得分:0)

我研究了如何从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