eval(expr, envir, enclos) 中的预测错误:R 中找不到对象
Predict Error in eval(expr, envir, enclos) : object not found in R
我尝试使用以前的函数预测多个模型,但我得到 "Error in eval(expr, envir, enclos) : object 'var.1' not found"。这很奇怪,因为 var.1 不在数据框中。代码是:
library(randomForest)
library(ada)
library(class)
library(e1071)
library(rpart)
library(car)
library(nnet)
library(kknn)
Consenso <- function(DF,VAR.DEP){ #entries are a dataframe and a dependent var
N1 <- sample(DF,dim(DF)[1],replace=TRUE)
N2 <- sample(DF,dim(DF)[1],replace=TRUE)
N3 <- sample(DF,dim(DF)[1],replace=TRUE)
N4 <- sample(DF,dim(DF)[1],replace=TRUE)
N5 <- sample(DF,dim(DF)[1],replace=TRUE)
mod.kknn <- train.kknn(VAR.DEP ~.,data=N1,kmax=trunc(sqrt(dim(DF)[1])))
mod.net <- nnet(VAR.DEP ~ ., data = N2, size = 10, rang = 0.1,
decay = 5e-04, maxit = 400, trace = FALSE, MaxNWts = 20000)
mod.tree <- rpart(VAR.DEP ~ ., data = N3)
mod.sv <- svm(VAR.DEP ~ ., data = N4, kernel = "linear")
mod.rf <-randomForest(VAR.DEP ~.,data= N5,ntree=400)
lista.mod <- list("Modelo.kknn"=mod.kknn,"Modelo.Redes"=mod.net,"Modelo.Arboles"=mod.tree,"Modelo.SV"=mod.sv,"Modelo.RF"=mod.rf)
return(lista.mod)
}
#Using the function
pbiris <- Consenso(iris,iris$Species)
#Make a prediction
predict(pbiris$Modelo.kknn,iris)
#Error in eval(expr, envir, enclos) : object 'Sepal.Width.1' not found
#Var Sepal.Width.1 is not in the dataframe.
我做错了什么?
有什么建议吗?
谢谢
鉴于您的代码并非完全可重现,因此很难确定,但几乎可以肯定问题来自:
sample(DF, dim(DF)[1], rep=T)
问题是您对数据框的列而不是行进行采样。考虑:
DF <- data.frame(a=1:4, b=5:8)
sample(DF, dim(DF)[1], rep=T)
产生:
b b.1 b.2 a
1 5 5 5 1
2 6 6 6 2
3 7 7 7 3
4 8 8 8 4
由于我们的数据框的列数少于行数,如果您尝试对列进行采样的次数与行数相同,它将对相同的列重新采样多次。在我们的测试中,我们对列 b
重新采样了三次,因此我们得到 b
、b.1
和 b.2
。当然,您的原始数据框没有额外的列,因此您的 predict
调用失败。
请记住,data.frame
对象是列表,因此您只是对列表的元素进行了采样。采样行:
DF[sample(nrow(DF)), ]
我尝试使用以前的函数预测多个模型,但我得到 "Error in eval(expr, envir, enclos) : object 'var.1' not found"。这很奇怪,因为 var.1 不在数据框中。代码是:
library(randomForest)
library(ada)
library(class)
library(e1071)
library(rpart)
library(car)
library(nnet)
library(kknn)
Consenso <- function(DF,VAR.DEP){ #entries are a dataframe and a dependent var
N1 <- sample(DF,dim(DF)[1],replace=TRUE)
N2 <- sample(DF,dim(DF)[1],replace=TRUE)
N3 <- sample(DF,dim(DF)[1],replace=TRUE)
N4 <- sample(DF,dim(DF)[1],replace=TRUE)
N5 <- sample(DF,dim(DF)[1],replace=TRUE)
mod.kknn <- train.kknn(VAR.DEP ~.,data=N1,kmax=trunc(sqrt(dim(DF)[1])))
mod.net <- nnet(VAR.DEP ~ ., data = N2, size = 10, rang = 0.1,
decay = 5e-04, maxit = 400, trace = FALSE, MaxNWts = 20000)
mod.tree <- rpart(VAR.DEP ~ ., data = N3)
mod.sv <- svm(VAR.DEP ~ ., data = N4, kernel = "linear")
mod.rf <-randomForest(VAR.DEP ~.,data= N5,ntree=400)
lista.mod <- list("Modelo.kknn"=mod.kknn,"Modelo.Redes"=mod.net,"Modelo.Arboles"=mod.tree,"Modelo.SV"=mod.sv,"Modelo.RF"=mod.rf)
return(lista.mod)
}
#Using the function
pbiris <- Consenso(iris,iris$Species)
#Make a prediction
predict(pbiris$Modelo.kknn,iris)
#Error in eval(expr, envir, enclos) : object 'Sepal.Width.1' not found
#Var Sepal.Width.1 is not in the dataframe.
我做错了什么?
有什么建议吗? 谢谢
鉴于您的代码并非完全可重现,因此很难确定,但几乎可以肯定问题来自:
sample(DF, dim(DF)[1], rep=T)
问题是您对数据框的列而不是行进行采样。考虑:
DF <- data.frame(a=1:4, b=5:8)
sample(DF, dim(DF)[1], rep=T)
产生:
b b.1 b.2 a
1 5 5 5 1
2 6 6 6 2
3 7 7 7 3
4 8 8 8 4
由于我们的数据框的列数少于行数,如果您尝试对列进行采样的次数与行数相同,它将对相同的列重新采样多次。在我们的测试中,我们对列 b
重新采样了三次,因此我们得到 b
、b.1
和 b.2
。当然,您的原始数据框没有额外的列,因此您的 predict
调用失败。
请记住,data.frame
对象是列表,因此您只是对列表的元素进行了采样。采样行:
DF[sample(nrow(DF)), ]