資料集(簡化)
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"
在此資料集中,“NO CB”組與“CB”組的行數不平衡。我想用我的代碼實作的是從“NO CB”組中隨機選擇 2 行,并使用所選 2 行中的資料 “CB”組中的資料來訓練我的隨機森林模型,并進行預測(我知道 4總共行是一個糟糕的預測模型,在我的實際資料集中,我有數百行,但為了簡單起見,這里只復制了幾行)。
我在下面寫了一個函式,我希望將整個程序重復500次:從'NO CB'組中隨機選擇2行500次,每次重復randomforest分類的程序,從測驗中提取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 值的資料框。
我也嘗試撰寫回圈,但我對如何調整代碼以使其運行有點不知所措。
我查過類似的帖子,其實重復這個功能500次是受了其中一篇類似帖子的啟發,但我的問題還是沒能解決。請問為什么我的result不回傳auc值而是完整的代碼?
我應該如何調整我的代碼以多次重復整個程序?在此先感謝您的幫助!
uj5u.com熱心網友回復:
一種解決方案是使用其中一個應用函式,例如lapply. 這樣,您還可以跟蹤您運行該函式的次數,并在最終結果中查看哪個運行給出了哪個輸出。
myfun <- function(i) {
message("Randomforest run ", i)
# do whatever you need to calculate 'auc' here
return(auc)
}
res <- lapply(1:500, myfun)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/429402.html
上一篇:在保持計數的同時從第一個值中遞回地減去第二個值,然后回傳計數
下一篇:過多的DOM元素貨幣符號
