在 R 中使用 M 模型预测块

Predicting chunks with M models in R

我有数据集 (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 而没有使用它的任何功能。 objective 看起来像是一个时间序列分析,但不是建立在一个块上并预测其后的块,你有一个更复杂的需求,所以 caret 中的 createTimeSlices 不会'不要耍花招。 您可以在 trainControl 中使用 indexindexOut 参数在插入符号中创建自定义折叠,但这最终会导致创建比所呈现的 objective (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)

如果 类 是确定的 "names",这应该是首选方法。