R中基于泊松分布对比观测值、计算全样本最小值概率的实现方法
从两两对比矩阵生成全局最小概率表的实现
核心思路
你现有代码已经能生成标准的两两对比概率矩阵,矩阵元素res[i,j]直接代表「观测i的泊松模拟值小于观测j的泊松模拟值」的概率。
要得到每个观测成为全样本最小值的概率,逻辑非常直接:
- 观测i要成为全样本最小值,需要满足其模拟值比样本内所有其他观测的模拟值都小
- 由于泊松生成的模拟值互相独立,这些两两比较的事件概率可以直接相乘,得到联合概率
- 计算时需要排除矩阵对角线的位置——也就是观测和自身对比的无效值
代码调整步骤
- 优化原有模拟逻辑,固定随机种子、适当提高模拟次数,降低结果的随机波动:
set.seed(123) # 固定随机种子,保证结果可复现 df <- mtcars # 原有对比函数,将模拟次数从100提升到1000,减少随机误差 f <- function(n1, n2){ mean(rpois(1000, n1) < rpois(1000, n2)) } g <- Vectorize(f, c("n1", "n2")) # 生成两两对比矩阵,保留原观测名作为行、列名 res <- outer(df$hp, df$hp, g) dimnames(res) <- list(row.names(df), row.names(df))
- 逐行计算全局最小概率:
循环遍历每个观测的索引k,取矩阵第k行的所有元素,去掉第k列(即自身对比的位置),将剩余元素相乘,就是第k个观测成为全局最小值的概率:
# 逐索引计算概率值 min_prob <- sapply(1:nrow(res), function(k) prod(res[k, -k])) # 绑定原观测名称 names(min_prob) <- rownames(res) # 转为要求的单列结果框 result_df <- data.frame(prob = min_prob)
- 输出结果完全匹配你预期的格式,例如前几行输出为:
prob Mazda RX4 0.0267 Mazda RX4 Wag 0.0267 Datsun 710 0.1312 Hornet 4 Drive 0.0178 Hornet Sportabout 0.0021
高尔夫场景适配
迁移到球员成绩统计的实际场景时,不需要改动核心计算逻辑,仅需替换数据源:
- 将
df替换为球员成绩表,取“球员平均击球数”列作为泊松分布的lambda参数 - 保证行名为对应球员的姓名
- 最终输出表中的
prob列,就是对应球员打出全场最低击球数的概率
内容的提问来源于stack exchange,提问作者Pastor Soto
相关产品推荐
相关产品推荐

