【问题标题】:K-fold cross-validation using cv.lm()使用 cv.lm() 进行 K 折交叉验证
【发布时间】:2013-12-23 22:57:52
【问题描述】:

我是 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?

谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复。当我们在 cv.lm() 中使用头文件时它可以工作。有没有办法我可以在 cv.lm() 中使用 y.1 和 x.1,因为大多数时候我会操纵标头来执行 cv.lm()。已更新我的原始文章以对此进行解释。
    猜你喜欢
    • 2020-02-06
    • 2017-05-04
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2016-01-15
    • 2020-07-08
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多