数据集(简化)
data <- data.frame()
data[1,1] <- "NO CB"
data[1,2] <- 1.13
data[1,3] <- 4.56
data[2,1] <- "NO CB"
data[2,2] <- 2.45
data[2,3] <- 7.54
data[3,1] <- "NO CB"
data[3,2] <- 3.56
data[3,3] <- 9.56
data[4,1] <- "NO CB"
data[4,2] <- 3.67
data[4,3] <- 7.89
data[5,1] <- "CB"
data[5,2] <- 1.18
data[5,3] <- 5.85
data[6,1] <- "CB"
data[6,2] <- 2.67
data[6,3] <- 7.86
colnames(data)[1] <- "Group"
colnames(data)[2] <- "Region.1"
colnames(data)[3] <- "Region.2"在这个数据集中,“无CB”组与“CB”组之间的行数不平衡。我想用我的代码实现的是,从'NO CB‘组中随机选择2行,并使用所选2行的数据+来自'CB’组的数据来训练我的随机森林模型,并进行预测(我知道总共有4行做了一个糟糕的预测模型,在我的实际数据集中,我有数百行,但这里只有少数行是简单的)。
我在下面写了一个函数,希望能重复整个过程500次:从'NO CB‘组随机选择2行500次,每次重复随机林分类的过程,从测试中提取auc值,并为每次运行存储auc值。
myfun <- function(){
wocb.ROI <- subset(data,data$Group=="NO CB")
wcb.ROI <- subset(data,data$Group=="CB")
wocb.ROI <- wocb.ROI[sample(nrow(wocb.ROI),2),] # randomly sample 2 from the no cb group
same.ROI <- rbind(wocb.ROI,wcb.ROI)
same.ROI <- as.data.frame(same.ROI)
same.ROI$Group <- as.factor(same.ROI$Group)
trains.same.ROI <- createDataPartition(
y = same.ROI$Group,
p = 0.5, #traindata proportion
list=F
)
traindata.same.ROI <- same.ROI[trains.same.ROI,]
testdata.same.ROI <- same.ROI[-trains.same.ROI,]
form_cls.same.ROI <- as.formula(
paste0(
"Group~",
paste(colnames(traindata.same.ROI)[2:3],collapse="+")
)
)
fit.rf.cls.same.ROI <- randomForest(
form_cls.same.ROI,
data = traindata.same.ROI,
ntree=50, #number of decision tree
mtry =6,
importance=T
)
trainpredprob.same.ROI <- predict(fit.rf.cls.same.ROI,newdata=traindata.same.ROI,type="prob")
trainroc.same.ROI <- roc(response=traindata.same.ROI$Group,
predictor=trainpredprob.same.ROI[,2])
bestp.same.ROI <- trainroc.same.ROI$thresholds[
which.max(trainroc.same.ROI$sensitivities + trainroc.same.ROI$specificities -1)]
trainpredlab.same.ROI <- as.factor(
ifelse(trainpredprob.same.ROI[,2] >bestp.same.ROI, "No CB","CB")
)
testpredprob.same.ROI <- predict(fit.rf.cls.same.ROI,newdata=testdata.same.ROI,type="prob")
testpredlab.same.ROI <- as.factor(
ifelse(testpredprob.same.ROI[,2] >bestp.same.ROI,"No CB","CB")
)
testroc.same.ROI <- roc(response=testdata.same.ROI$Group,
predictor = testpredprob.same.ROI[,2])
auc <- testroc.same.ROI$auc
return(auc)
}然后我尝试了result <- replicate(500, myfun),但是我得到的只是我的代码,而不是包含auc值的dataframe。
我也尝试过编写循环,但对于如何调整代码以使其运行,我有点不知所措。
我曾经查看过类似的帖子,实际上,重复这个功能500次是受到类似帖子的启发,但我的问题仍然无法解决。我可以问为什么我的result不返回auc值,而是返回完整的代码?
我应该如何调整我的代码以多次重复整个过程?提前感谢您的帮助!
发布于 2022-02-17 12:26:20
一个解决方案是使用应用函数之一,比如lapply。通过这种方式,您还可以跟踪运行该函数的次数,并在最终结果中查看是哪个运行给出了哪个输出。
myfun <- function(i) {
message("Randomforest run ", i)
# do whatever you need to calculate 'auc' here
return(auc)
}
res <- lapply(1:500, myfun)https://stackoverflow.com/questions/71149321
复制相似问题