数据框错误:选择了未定义的列

时间:2018-08-10 15:40:57

标签: r r-caret

代码:

library(caret); library(kernlab); data(spam)
inTrain <- createDataPartition(y=spam$type,
p=0.75, list=FALSE)
training <- spam[inTrain,]
testing <- spam[-inTrain,]

M <- abs(cor(training[,-58]))
diag(M) <- 0
which(M > 0.8,arr.ind=T)

preProc <- preProcess(log10(spam[,-58]+1),method="pca",pcaComp=2)
spamPC <- predict(preProc,log10(spam[,-58]+1))

preProc <- preProcess(log10(training[,-58]+1),method="pca",pcaComp=2)
trainPC <- predict(preProc,log10(training[,-58]+1))
modelFit <- train(training$type ~ .,method="glm",preProc = "pca",data=trainPC)

在执行时会出现以下错误:

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

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误。

  1. 您正在对训练数据使用多个pca预处理步骤。首先作为单独的预处理,然后再作为训练功能。这不是必需的。您可以使用preproc选项一次性完成所有操作。在火车上使用它的好处是,如果您开始进行预测,则新数据将得到正确处理。否则,您需要先在模型预测之前通过preproc预测运行测试/新数据。

  2. 您可以将train中的公式指定为training $ type,并将数据部分指定为trainPC。这不起作用,因为您现在要从2个data.frames中获取数据。

以下代码将完成您打算做的事情。如果y是一个因子,则glm方法将指定族参数本身。但是最好自己指定。

inTrain <- createDataPartition(y=spam$type,
                               p=0.75, list=FALSE)
training <- spam[inTrain,]
testing <- spam[-inTrain,]


modelFit <- train(type ~ ., 
                  data = training,
                  method = "glm",
                  preProc = "pca",
                  family = binomial)

您将收到如下警告。但是,只要运行glm,您也会得到这些。

  

glm.fit:发生数字为0或1的拟合概率