R中

0

交叉驗證階躍函數我試圖從階躍函數錯誤,但我得到一個錯誤:R中

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()索引i使用特定減免得到錯誤:

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錯誤選擇最佳的錯誤。

回答

0

問題是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

@OPolakunnil你很受歡迎 –

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