【问题标题】:using poly( function within training model in caret package resulting in dataframe error在 caret 包的训练模型中使用 poly( 函数导致数据帧错误
【发布时间】:2020-02-16 03:33:43
【问题描述】:

这是我正在运行的代码:

library(caret)
library(ISLR)
data('Auto')
cverror <- c()
for(i in 1:5){
  train_control <- trainControl(method='LOOCV')
  models <- train(mpg~poly(horsepower,i), data = Auto, trControl=train_control, method='glm')
  cverror[i] <- (models$results$RMSE)^2
}

cverror

我想要完成的是使用循环计算不同多项式级别的 MSE(均方误差),因此我不必逐行编写代码。我收到的错误信息是:

 Error in `[.data.frame`(data, , all.vars(Terms), drop = FALSE) : 
  undefined columns selected 

为什么我会收到此错误消息?我的学习伙伴说,这段代码在他们的机器上运行良好,但在我的个人或工作计算机上不起作用。我安装了最新的 RStudio 和 R 版本,所有软件包都是最新的。

以下代码行正常工作:

train(mpg~poly(horsepower,2), data = Auto, trControl=train_control, method='glm')

这与 ISLR 文本第 192/193 页上的教程有关(我正在对其进行扩展)。

【问题讨论】:

    标签: r r-caret


    【解决方案1】:

    如果i &lt;- 2 其值不会代入公式。公式字面意思是mpg ~ poly(horsepower, i)

    试试这个:

    library(caret)
    library(ISLR)
    data('Auto')
    cverror <- numeric(5)
    for(i in 1:5){
      train_control <- trainControl(method='LOOCV')
      f <- bquote(mpg ~ poly(horsepower, .(i)))
      models <- train(as.formula(f), data = Auto, trControl=train_control, method='glm')
      cverror[i] <- (models$results$RMSE)^2
    }
    
    cverror
    #[1] 24.23151 19.24821 19.33498 19.42443 19.03321
    

    PS:更高次的多项式几乎可以保证过度拟合。我不推荐次数高于 2,也许是 3 的多项式。在这种情况下,通常有更好的模型可用。对于“自然”过程,更高次多项式很少见。

    【讨论】:

    • 你能帮我理解“bquote”的功能吗?我以前从未使用过(也没有听说过)这个功能。帮助文档 (?bquote) 不是很有帮助。
    • 它创建一个表达式,但从封闭环境中获取.() 中给出的变量并将其值替换为表达式。
    • 如果您愿意,可以使用sprintf 甚至paste
    • Roland,非常奇怪的是,Nik 的原始代码在我的机器上完美运行,无需使用bquoteas.formula。我知道我们有不同版本的 R 和 RStudio;也许函数的行为会随着版本的变化而变化?
    • @Rahul 我不知道 R 的变化会影响到这一点。
    【解决方案2】:

    我遇到了类似的问题。您是否尝试过使用以下内容?

    models <- train(x = poly(Auto$horsepower,i), y = Auto$mpg, data = Auto, trControl=train_control, method='glm')
    

    (我没有测试过这段特定的代码。)

    【讨论】:

    • 该问题已经有一个可接受的答案,如果它没有在现有答案中添加任何新内容,请避免回答旧问题。
    猜你喜欢
    • 2018-04-13
    • 2013-12-01
    • 2016-07-02
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2018-10-23
    • 2013-11-06
    相关资源
    最近更新 更多