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

标签 r

我是 R 新手,并尝试使用 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"

进一步检查上述数据集表明一个数据集是整数,另一个是数字。但即使将数据集从数字转换为整数或将整数转换为数字,屏幕中也会弹出相同的错误,表明数据长度存在问题。

你能指导我我应该怎么做来纠正错误吗?

自 2 天前以来,我未能成功处理此问题。我使用互联网的研究没有得到任何好的指导。

其他相关查询:

如果我们在属性中使用数据集的标题,我会看到适合的作品,
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 ?

谢谢。

最佳答案

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

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

由于错误消失了,这可能是一个足够的答案。

enter image description here

UPD : 报错的原因是sampledata中不存在y.1和x.1,作为cv.lm的df参数提供,所以在cv.lm中公式y.1~x.1没有意义环境。

关于r - 使用 cv.lm() 进行 K 折交叉验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20744224/

相关文章:

r - 如何在不同颜色的啤酒调色板中获得与散点图中的点不同的回归线?

R:为什么 kable 不在 for 循环内打印?

R ggplot : facet_grid with different geom_rects for each facet trouble

r - 如何通过 R 中绘图的相似坐标对数据框进行子集化?

r - 由于依赖关系无法升级 R

r - R中的混合合并 - 下标解决方案?

滚动平均成对相关性 - 代码无法按预期工作

r - 如何计算矩阵第一行与 R 中其他行之间的余弦相似度?

r - 如何在 ggplot 中找到 geom_line 控制点

R:tuneRF 函数的行为不明确(randomForest 包)