使用cv.lm()进行K折交叉验证

5
我是一名新手,正在尝试使用cv.lm()进行K折交叉验证。参考链接:http://www.statmethods.net/stats/regression.html 我收到了错误提示,指示我的变量长度不同。实际上,在使用length()进行验证时,我发现它们的大小是相同的。
以下是最小数据集,可用于复制问题:
X   Y
277 5.20
285 5.17
297 4.96
308 5.26
308 5.11
263 5.27
278 5.20
283 5.16
268 5.17
250 5.20
275 5.18
274 5.09
312 5.03
294 5.21
279 5.29
300 5.14
293 5.09
298 5.16
290 4.99
273 5.23
289 5.32
279 5.21
326 5.14
293 5.22
256 5.15
291 5.09
283 5.09
284 5.07
298 5.27
269 5.19

使用以下代码进行交叉验证:
# K-fold cross-validation, with K=10
sampledata <- read.table("H:/sample.txt", header=TRUE)
y.1 <- sampledata$Y
x.1 <- sampledata$X
fit=lm(y.1 ~ x.1)
library(DAAG)
cv.lm(df=sampledata, fit, m=10)

终端显示的错误信息:
Error in model.frame.default(formula = form, data = df[rows.in, ], drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'x.1')

验证,

> length(x.1)
[1] 30
> length(y.1)
[1] 30

以上证实长度是相同的。
> str(x.1)
 int [1:30] 277 285 297 308 308 263 278 283 268 250 ...
> str(y.1)
 num [1:30] 5.2 5.17 4.96 5.26 5.11 5.27 5.2 5.16 5.17 5.2 ...

> is(y.1)
[1] "numeric" "vector" 
> is(x.1)
[1] "integer"             "numeric"             "vector"              "data.frameRowLabels"

进一步检查上述数据集表明,一个数据集是整数类型,另一个数据集是数字类型。但即使将数据集从数字类型转换成整数类型或者从整数类型转换成数字类型,屏幕上仍然会显示相同的错误,指示数据长度存在问题。
您能指导我应该如何纠正这个错误吗?
自两天前以来,我一直无法处理这个问题。在互联网上进行研究后,没有得到任何有用的线索。 额外相关查询: 如果我们在属性中使用数据集的标头,那么适配器似乎可以正常工作。
fit=lm(Y ~ X, data=sampledata)

a) 上述语法与以下语法有何区别

fit1=lm(sampledata$Y ~ sampledata$X)

尽管它们看起来相同,但以下内容略有不同:


#fit 1 works
fit1=lm(Y ~ X, data=sampledata)
cv.lm(df=sampledata, fit1, m=10)

#fit 2 does not work
fit2=lm(sampledata$Y ~ sampledata$X)
cv.lm(df=sampledata, fit2, m=10)

问题出在df=sampledata,因为标题"sampledata$Y"不存在,只有$Y存在。尝试操作cv.lm以解决问题,但未成功。
cv.lm(fit2, m=10)
b) 如果我们希望操纵变量,在 cv.lm() 中如何使用呢?
y.1 <- (sampledata$Y/sampledata$X)
x.1 <- (1/sampledata$X)

#fit 4 problem
fit4=lm(y.1 ~ x.1)
cv.lm(df=sampledata, fit4, m=10)

有没有一种方法可以在函数中引用y.1和x.1,而不是头部的Y〜X?
谢谢。
1个回答

2

我不确定为什么会发生这种情况,但我注意到您没有为lm()指定数据参数,所以这是我的第一个猜测。

fit=lm(Y ~ X, data=sampledata)

自从错误消失后,这可能是一个足够的答案。 enter image description here 更新:错误的原因是在cv.lm提供的df参数中,y.1和x.1不存在于sampledata中,因此在cv.lm环境中公式y.1~x.1没有意义。

感谢您的回复。当我们在cv.lm()中使用header时,它是有效的。是否有一种方法可以在cv.lm()中使用y.1和x.1,因为大多数情况下我会操纵标题来执行cv.lm()。已更新原始写作以解释此问题。 - Saravanan K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接