代码:
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
答案 0 :(得分:0)
您的代码中存在多个错误。
您正在对训练数据使用多个pca预处理步骤。首先作为单独的预处理,然后再作为训练功能。这不是必需的。您可以使用preproc选项一次性完成所有操作。在火车上使用它的好处是,如果您开始进行预测,则新数据将得到正确处理。否则,您需要先在模型预测之前通过preproc预测运行测试/新数据。
您可以将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的拟合概率