用R中的M个模型预测块

问题描述 投票:0回答:1

我有数据集(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 
r loops predict rpart
1个回答
1
投票

你的问题有点令人费解,你加载caret而不使用它的任何功能。目标似乎是一个时间序列分析,但不是建立在一个块上并预测后面的那个,你有一个更复杂的愿望,所以来自createTimeSlicescaret将无法做到这一点。您可以使用index中的indexOuttrainControl参数在插入符号中创建自定义折叠,但这最终会导致创建比所呈现目标所需的更多模型(确切地说是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)

如果类是某些“名称”,这应该是首选方法。

© www.soinside.com 2019 - 2024. All rights reserved.