Crossvalidation of polynomial lm in R - error: lengths differ
Crossvalidation of polynomial lm in R - error: lengths differ
我发现了有关此主题的其他问题,例如 ,但是我一直收到错误消息
Error in xy.coords(x, y, xlabel, ylabel, log) : 'x' and 'y' lengths
differ
下面是我使用的代码:
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
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
我发现了有关此主题的其他问题,例如
Error in xy.coords(x, y, xlabel, ylabel, log) : 'x' and 'y' lengths differ
下面是我使用的代码:
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
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