首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复操作多次,并存储每个试用版的输出

重复操作多次,并存储每个试用版的输出
EN

Stack Overflow用户
提问于 2022-02-16 21:12:10
回答 1查看 146关注 0票数 0

数据集(简化)

代码语言:javascript
复制
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值。

代码语言:javascript
复制
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值,而是返回完整的代码?

我应该如何调整我的代码以多次重复整个过程?提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-17 12:26:20

一个解决方案是使用应用函数之一,比如lapply。通过这种方式,您还可以跟踪运行该函数的次数,并在最终结果中查看是哪个运行给出了哪个输出。

代码语言:javascript
复制
myfun <- function(i) {
  message("Randomforest run ", i)
  # do whatever you need to calculate 'auc' here
  return(auc)
}

res <- lapply(1:500, myfun)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71149321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档