我正在尝试使用随机森林构建时间序列模型。但是,每次运行代码时都会遇到同样的错误:
[.data.frame
中的错误(data ,, all.vars(Terms),drop = FALSE):
选择了未定义的列
我非常了解随机森林背后的大部分理论,但是使用它并没有真正运行很多代码。
这是我的代码:
library(randomForest)
library(caret)
fitControl <- trainControl(
method = "repeatedcv",
number = 10,
repeats = 1,
classProbs = FALSE,
verboseIter = TRUE,
preProcOptions=list(thresh=0.95,na.remove=TRUE,verbose=TRUE))
set.seed(1234)
rf_grid <- expand.grid(mtry = c(1:6))
fit <- train(df.ts[,1]~.,
data=df.ts[,2:6],
method="rf",
preProcess=c("center","scale"),
tuneGrid = rf_grid,
trControl=fitControl,
ntree = 200,
metric="RMSE")
对于可重现的示例,您可以在以下数据集上运行代码:
df.ts <- structure(list(ts.t = c(315246, 219908, 193014, 231970, 248246,
+ 247112, 268218, 263637, 264306, 245730, 256548, 227525, 304468,
+ 229614, 202985), ts1 = c(233913, 315246, 219908, 193014, 231970,
+ 248246, 247112, 268218, 263637, 264306, 245730, 256548, 227525,
+ 304468, 229614), ts2 = c(253534, 233913, 315246, 219908, 193014,
+ 231970, 248246, 247112, 268218, 263637, 264306, 245730, 256548,
+ 227525, 304468), ts3 = c(226650, 253534, 233913, 315246, 219908,
+ 193014, 231970, 248246, 247112, 268218, 263637, 264306, 245730,
+ 256548, 227525), ts6 = c(213268, 242558, 250554, 226650, 253534,
+ 233913, 315246, 219908, 193014, 231970, 248246, 247112, 268218,
+ 263637, 264306), ts12 = c(333842, 210279, 193051, 174262, 216712,
+ 144327, 213268, 242558, 250554, 226650, 253534, 233913, 315246,
+ 219908, 193014)), .Names = c("ts.t", "ts1", "ts2", "ts3", "ts6", "ts12"), row.names = 13:27, class = "data.frame")
我希望有人能发现我的错误
谢谢,
答案 0 :(得分:2)
公式应与data
中变量的名称相对应。例如。 y ~ .
使用y
中的所有其他变量预测data
。或者,您可以使用y = df.ts[,1], x = df.ts[, -1]
代替formula
和data
。
因此正确的语法是:
fit <- train(ts.t ~ .,
data=df.ts,
method="rf",
preProcess=c("center","scale"),
tuneGrid = rf_grid,
trControl=fitControl,
ntree = 200,
metric="RMSE")
答案 1 :(得分:0)
library(randomForest)
library(caret)
fitControl <- trainControl(
method = "repeatedcv",
number = 10,
repeats = 1,
classProbs = FALSE,
verboseIter = TRUE,
preProcOptions=list(thresh=0.95,na.remove=TRUE,verbose=TRUE))
set.seed(1234)
rf_grid <- expand.grid(mtry = c(1:6))
fit <- train(ts.t~.,
data=df.ts[,1:6],
method="rf",
preProcess=c("center","scale"),
tuneGrid = rf_grid,
trControl=fitControl,
ntree = 200,
metric="RMSE")
请注意,因变量应该在提供的用于训练模型的数据集中,而不是编写df.ts [,1],正确的表示法是与所有列相关的列名称“ ts.t”提供的数据集,即2到6。 这可以解决您的错误。 干杯!
答案 2 :(得分:0)
只需使用caret::train(var~., Data)
代替train(Data$var~., data=Data)
,那应该可以。
答案 3 :(得分:0)
对我来说,使用classProbs = TRUE
代替classProbs = FALSE
也可以。