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

多项式lm在R中的交叉验证-错误:长度不同,r,regression,cross-validation,R,Regression,Cross Validation,我发现了与此主题相关的其他问题,例如,但是我一直收到错误消息 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, d

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

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) 
请注意,在同一个脚本中,我使用交叉验证执行了另一个线性回归,这很有效

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)

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

mf首先,不要
附加
数据框。然后,您的错误是由绘图导致的。如果在
cv.lm
中关闭绘图,是否会出现相同的错误?最后,需要一个可重复的例子来进一步诊断。我很高兴我错了,但在
cv.lm
超声波
not
超声波
btw?@Roland中的if-else语句似乎有错误和格式不正确-在我找到的答案中,他们总是建议附加数据帧。但分离时是一样的。此外,当我关闭绘图时,仍然会出现错误。您可以信任@Roland并烧掉所有为
attach
ing辩护的书籍。
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
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