R中多项式lm的交叉验证 - 长度不同

时间:2016-12-02 07:41:12

标签: r regression cross-validation

我发现了有关此主题的其他问题,例如this,但我一直收到错误消息

  

xy.coords(x,y,xlabel,ylabel,log)中的错误:'x'和'y'长度   不同

以下是我正在使用的代码:

library(DAAG)
attach(ultrasonic)

g.poly = lm(UR ~ poly(MD, 3), data = ultrasonic)
cv.poly <- cv.lm(ultrasonic, g.poly ,m=3, plotit=TRUE, printit=TRUE, dots=FALSE, seed=29) 

当然,长度是一样的:

> length(UR)
[1] 214
> length(MD)
[1] 214

请注意,在同一个脚本中,我执行另一个带有交叉验证的线性回归,它可以正常工作。

library(DAAG)
g.lin = lm(log(UR) ~ MD, data = ultrasonic)
cv.lin <- cv.lm(ultrasonic, g.lin ,m=3, plotit=TRUE, printit=TRUE, dots=FALSE, seed=29)

任何想法为什么多项式回归交叉验证不起作用?

修改

获取数据:

install.packages('nlsmsn')
library('nlsmsn')
data(Ultrasonic)

#names differ, i am using copy in local machine with lower case u(ultrasonic) and different column names, but data are identical.
#UR = y
#MD = x

1 个答案:

答案 0 :(得分:2)

DAAG:::cv.lm显然不支持您使用lm可以执行的所有操作,例如,它不支持公式中的函数。你需要采取一个中间步骤。

mf <- as.data.frame(model.matrix(y ~ poly(x), data = Ultrasonic))
mf$y <- Ultrasonic$y
mf$`(Intercept)` <- NULL

#sanitize names
names(mf) <- make.names(names(mf))
#[1] "poly.x." "y"  
g.poly.san <- lm(y ~ ., data = mf)

cv.poly <- cv.lm(mf, g.poly.san, m=3, plotit=TRUE, printit=TRUE, dots=FALSE, seed=29) 
#works