我有数据集(HEART
)。我将它拆分成块。我想用他的(M=3
)之前的模型预测每个块。在这种情况下,我想预测10号块 - 模型7,8,9。大块9 - 模型6,7,8 ...大块4 - 模型1,2,3。这是我的代码:
library(caret)
dat1 <- read.csv(url("http://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"), header = FALSE,sep = ",")
colnames(dat1) <- c(LETTERS[1:(ncol (dat1)-1)],"CLA")
dat1$CLA<-as.factor (dat1$CLA)
chunk <- 30
n <- nrow(dat1)
r <- rep(1:floor(n/chunk),each=chunk)[1:n]
d <- split(dat1,r)
N<-floor(n/chunk)
cart.models <- list()
for(i in 1:N){cart.models[[i]]<-rpart(CLA~ ., data = d[[i]]) }
for (i in (1+M):N) { k=0
for (j in (i-M):(i-1)) {
k=k+1
d[[i]][,(ncol(d[[i]])+k)]<-(predict(cart.models[[j]], d[[i]][,c(-14)], type = "class") )
}
}
我收到以下错误:
Error in `[<-.data.frame`(`*tmp*`, , (ncol(d[[i]]) + k), value = c(1L, :
new columns would leave holes after existing columns
你的问题有点令人费解,你加载caret
而不使用它的任何功能。目标似乎是一个时间序列分析,但不是建立在一个块上并预测后面的那个,你有一个更复杂的愿望,所以来自createTimeSlices
的caret
将无法做到这一点。您可以使用index
中的indexOut
和trainControl
参数在插入符号中创建自定义折叠,但这最终会导致创建比所呈现目标所需的更多模型(确切地说是21)(9)。所以我相信循环是一种合适的方式:
创建模型:
library(rpart)
N <- 9
cart.models <- list()
for(i in 1:N){
cart.models[[i]] <- rpart(CLA~ ., data = d[[i]])
}
N
可以是9
,因为10
以后不会被使用。
创建一个矩阵来存储值:
cart.predictions <- matrix(nrow = chunk, ncol = length(4:10)*3)
它应该具有与每个块中的预测相同的行数(所以30),并且它应该有尽可能多的列有预测(三个模型用于4:10块)。
k <- 0 #as a counter
for (j in 4:10) { #prediction on chunks 4:10
p <- j-3
pred <- list()
for(i in p : (p+2)) { #using models (chink - 3) : (chunk - 1)
k = k + 1
predi <- predict(cart.models[[i]], d[[j]], type = "class")
cart.predictions[,k] <- predi
}
}
这为预测创建了一个数字矩阵。默认情况下,当R将因子转换为数字时,它会给出数字:1表示第一级,2表示第二级等 - 所以要获得级别(0:4),您可以:
cart.predictions <- as.data.frame(cart.predictions - 1)
创建列名称:
names <- expand.grid(3:1, 4:10)
names$Var1 <- with(names, Var2 - Var1)
colnames(cart.predictions) <- make.names(paste0(names$Var1,"_", names$Var2))
让我们检查一下是否正确:
从模型5
预测大块6
转换为数字
as.numeric(as.character(predict(cart.models[[5]], d[[6]], type = "class")))
应该等于
cart.predictions[["X5_6"]] #that's how the names were designed
all.equal(as.numeric(as.character(predict(cart.models[[5]], d[[6]], type = "class"))),
cart.predictions[["X5_6"]])
#output
TRUE
或者你可以在第一时间创建一个字符矩阵:
cart.predictions <- matrix(data = NA_character_, nrow = chunk, ncol = length(4:10)*3)
k <- 0 #as a counter
for (j in 4:10) {
p <- j-3
pred <- list()
for(i in p : (p+2)) {
k = k + 1
predi <- predict(cart.models[[i]], d[[j]], type = "class")
cart.predictions[,k] <- predi
}
}
cart.predictions <- as.data.frame(cart.predictions)
如果类是某些“名称”,这应该是首选方法。