我不确定这是否是正确的做法,我很乐意予以纠正。
我在R环境中使用插入符号包装了一个gbm模型,为了一个例子,我将在没有任何参数调整和使用 iris 数据集的情况下进行:< / p>
library(caret)
data(iris)
gbmFit <- train(Species ~ ., data = iris, method = "gbm")
如果我在虹膜数据集中进行了4次测量,这可以让我对花属于哪种物种进行分类。
我有兴趣使用predict
中的type = "prob"
函数的结果来运行模拟。
由于这只是一个例子,我没有新的数据,所以我将使用相同的数据,就像它是新的一样,我使用预测函数来获得每种花是一种物种的概率:
PROBS <- predict(gbmFit4, iris[,1:4], type="prob")
这是结果的例子
head(PROBS)
setosa versicolor virginica
1 0.9999989 1.087268e-06 1.679813e-10
2 0.9999998 1.689137e-07 1.404242e-09
3 0.9999995 5.381312e-07 3.131823e-10
4 0.9999996 4.335414e-07 3.912857e-10
5 0.9999989 1.087268e-06 1.679813e-10
6 0.9999987 1.278968e-06 1.679813e-10
我知道如何对一朵花进行模拟,在那里我使用PROB数据帧给出每个物种的花的概率,然后使用样本来模拟分类,因为它的概率是说1000000分类,我使用第107行,因为它不太确定:
set.seed(123)
summary(as.factor(sample(c("setosa", "versicolor", "virginica"), size = 100000, replace = TRUE, prob = PROBS[107,])))
导致
versicolor virginica
14731 85269
我的目标是使用新数据运行这样的模拟并得到以下结果:平均每个模拟中每个物种分类的花数(av_class_species);每个物种的最小值和最大值是什么(min_class_species,max_class_species),作为一个例子我制作了这个假数据帧(数据集中有150朵花):
av_class_setosa max_class_setosa min_class_setosa av_class_versicolor...
24.4 35 12 30.2
任何帮助将不胜感激
答案 0 :(得分:1)
找到我自己的答案,虽然如果有人找到更有效的方法我会很高兴,这是为了运行100次模拟:
SIMUL <- list()
for(i in 1:100){
species <- list()
for(j in 1:nrow(PROBS)){
species[[j]] <- sample(c("setosa", "versicolor", "virginica"), size = 1, replace = TRUE, prob = PROBS[j,])
}
SIMUL[[i]] <- as.data.frame(table(unlist(species)))
}
SIMUL <- do.call("rbind", SIMUL)
SIMUL <- dplyr::group_by(SIMUL, Var1)
SIMUL <- dplyr::summarise(SIMUL, MEAN_class = mean(Freq), MIN_Class = min(Freq), MAX_Class = max(Freq))
这将导致:
SIMUL
Source: local data frame [3 x 4]
Var1 MEAN_class MIN_Class MAX_Class
(fctr) (dbl) (int) (int)
1 setosa 50.0 50 50
2 versicolor 49.7 47 53
3 virginica 50.3 47 53