Models for Olympic Medal Tables(优秀范文二:贝叶斯层级模型 + 后验预测 + 多口径决策)
2025 美赛 MCM C 题 · 优秀范文二。视角:范文一用 OLS 给了点估计和重抽样区间,本篇把不确定性放进模型本身——在 国 届的同一合成面板上建立贝叶斯层级模型(国别随机效应 + 共轭 Gibbs 抽样,纯标准库实现),让参数不确定性、国别异质性与观测噪声各就各位;用后验预测直接模拟出一届完整的未来奥运会(奖牌 + 金银铜拆分 + 三张榜单),把「哪种奖牌榜更公平」从哲学讨论变成可计算的决策问题:每国每口径的前 名概率、期望名次与口径翻转风险一目了然。正文 / 配图 / 附录 / 真源四路数字一致(固定种子 seed=20250316,链 B 保留 1000 个后验抽样)。
摘要
本文在同一合成面板上回答三个递进的问题:参数有多不确定?预测有多不准?以及——排名口径的选择到底值多少个名次?层级模型 ( 为国别随机效应)经 6000 步共轭 Gibbs 抽样(烧入 2000、稀疏化后保留 1000 个样本)给出后验:残差 、国别异质性 ——数据明确说国别异质性很弱,部分合并因此把不合并基准的截距离散度压缩 29.9%(两法相关 ,图 2)。系数层面给出第一张体检报告:四个系数的 OLS 点估计全部落入贝叶斯 90% 可信区间(4/4),后验均值与 OLS 最大偏差仅 0.01——弱先验下两派在点估计上和解,随机效应只从惯性项分走约 0.01 的归因。样本外检验(训练剔除 2016→2024 对)显示层级模型的点精度与 OLS 相当(MAE 4.21 枚 vs 4.04 枚,贵 4%),换来的是内生的预测区间:24 国 90% 区间覆盖 23 国,目标国 C08 点预测 67.4、实际 68、区间 宽 35.1 枚稳稳覆盖——不需要 Bootstrap 技巧,区间是模型的天然产物。决策层是本篇独有贡献:每个后验抽样模拟一届 2028 年奥运会并在同一抽样下排出三张榜单,结果显示 C04 以期望 99.9 枚卫冕、C11(92.3 枚)凭更高经济增速反超 C23(80.5 枚);C08 进前五概率 39.4%;而「银铜厚度型」的 C06(末届金 5 银 9 铜 12)在金牌榜进前十概率高达 83.3%、加权榜只有 33.4%——金牌榜因银牌并列规则高估它 50 个百分点。全表 24 国中有 18 国的最优口径是金牌优先(其前十门槛更低)、三口径下前三名集合完全一致的概率仅 5.6%(金vs总)到 57.6%(总vs加权)——口径选择不是呈现细节,而是结论的一部分。
一、问题重述
题目要求四件事:①构建各国奖牌数的预测模型;②刻画历史趋势与主办国效应;③比较不同奖牌榜排名口径并讨论公平性;④量化预测的不确定性(区间与爆冷概率)。范文一已用对数线性 OLS 处理①并以 Kendall τ 触碰③;本篇聚焦④的贝叶斯解法与③的决策化——把「公平」翻译成「你在哪张榜上以多大概率排到哪个位置」,并把②的主办红利作为系数之一纳入层级框架(下一届主办未知时取 0)。
二、模型假设
- 奖牌产出沿用三层生成结构:竞技惯性(自回归)、经济人口基本盘、主办红利;各层在对数空间线性可加。
- 存在不可观测的国别基底差异 ,服从零均值正态——代表体育传统、体制投入等面板特征未捕捉的持久因素。
- 观测噪声 服从对数空间正态,涵盖临场发挥、禁赛与项目设置的随机性。
- 先验弱信息化:,,——量级由数据主导。
- 预测 2028 时主办国未知取 host=0,GDP 按各国历史增速外推一步。
三、符号说明
| 符号 | 含义 |
|---|---|
| 国家 的随机效应(国别基底) | |
| 国别异质性方差、观测噪声方差 | |
| 贝叶斯后验均值与 90% 可信区间 | |
| 截距离散度的收缩率 | |
| 后验预测下进入前 名的概率 | |
| 同一抽样下加权榜与金牌榜的名次差 |
四、建模过程
技术路线见图 1:层级设定 → 共轭 Gibbs → 后验检验 → 整届比赛模拟 → 三口径决策矩阵,每一格的数字都能被附录代码原样复现。
4.1 为什么必须"层级":一个可识别性的教训
最自然的对照方案是给每国单独拟合一条回归。但这在本面板上数学上不可行:一国之内人口恒定、GDP 只以年增速缓慢漂移(7 届累计不过零点几个对数单位),设计矩阵近似奇异——逐国截距的估计方差爆炸。这个失败本身就是层级模型的动机:当组内信息不足以识别组参数时,必须向总体借信息。故不合并基准取「合并斜率下的国别偏残差均值」,部分合并即后验均值 。
4.2 共轭 Gibbs:纯标准库的完整贝叶斯
四个条件分布全部共轭: 多元正态(高斯消元求逆 + Cholesky 分解抽样)、 一元正态、 逆伽马。6000 步迭代、烧入 2000、每 4 步留 1,得 1000 个联合后验样本(图 3 的 轨迹平稳无漂移)。全程只用 random 与手写的 线性代数——贝叶斯计算不需要重型依赖,需要的是正确的条件分布。
4.3 收缩:部分合并看见了什么
图 2 把 24 国的不合并截距与部分合并后验画成散点:两者高度一致(),但部分合并系统性向全局均值收缩——离散度从 0.020 压到 0.014,收缩率 29.9%。后验 说明这批国家的真实异质性本来就不大:大部分"国别特色"已被 GDP、人口与惯性解释,剩下的持久成分有限——收缩不是损失信息,而是拒绝把噪声当成特色。
4.4 系数对照:点估计的和解
图 4 并列展示 OLS 点估计与贝叶斯后验均值:自回归 0.3407 vs 0.3308、经济 0.2698 vs 0.2735、人口 0.1363 vs 0.1373、主办 0.2926 vs 0.2883——四对数字几乎重合,OLS 估计全部落入对应的 90% 可信区间(4/4)。这个"没有新闻"的结果其实是层级模型的第一张体检报告:在点估计层面,弱先验下的贝叶斯与频率派殊途同归;随机效应只从自回归项里分走了约 0.01 的归因(各国对全球规律的持久偏离被 承接,惯性系数轻微下移),量级远小于抽样噪声。真正的增量不在点的位置,而在点周围的云——下一节检验那朵云是否诚实。
4.5 样本外体检:点精度持平,区间内生
严格剔除 2016→2024 训练对后(链 A),层级模型 24 国平均 MAE 4.21 枚,与范文一 OLS 的 4.04 枚相当(贵 4%)——点预测没有免费午餐。差别在区间:图 5 的后验预测均值紧贴完美线,24 个 90% 区间盖住 23 国实际值;C08 点预测 67.4、实际 68、区间宽 35.1 枚,与范文一混合 Bootstrap 的 37.0 枚惊人接近——两条完全不同的路(重抽样 vs 后验预测)收敛到同一个诚实宽度,这是对"±27% 才是真话"的交叉验证。
五、多口径决策:把"公平"变成概率表
5.1 一千次 2028:整届比赛的后验模拟
每个保留抽样都生成一届完整的 2028 年奥运会:24 国奖牌总数(含观测噪声)、按各国成色拆金银铜、再排三张榜——三张榜来自同一次模拟,国别冲击完全联动(公共随机数思想),口径间的差异因此纯粹反映口径本身。期望榜单:C04 以 99.9 枚卫冕,C11(92.3)凭更高的经济增速反超 C23(80.5),C10、C24 分列四五。C08 的登台路线见图 6:进前三仅 11.8%、前五 39.4%、前十已是 100%——它的现实目标是保五争三,而非奢望奖牌榜首。
5.2 C06 案例:一张成绩单的三种命运
事实锚点:C06 末届金 5 银 9 铜 12 共 26 枚,金牌榜第 10、总数榜第 13、加权榜第 13——典型的「银铜厚度型」。2028 后验预测把它讲得更透(图 7):金牌榜进前十概率 83.3%、加权榜只有 33.4%,期望名次分别是 9.0 与 11.0;同一批模拟里加权名次比金牌名次更差的概率 92.2%、"更好"的概率为 0%。机理有二:其一,金牌榜并列时按银牌破平局,C06 的 9 枚银子常把它的 5 枚金抬上位次;其二,加权制 4:2:1 给成色定价,铜牌在这里近乎免费。决策含义:这类代表团若以金牌榜做内部 KPI 会系统性自我高估约 50 个百分点——合理的做法是内部按加权口径管理预期,对外才用金牌口径叙事。
5.3 门槛效应:为什么 18 国的"最优口径"都是金牌优先
全表统计(图 8 热力图)显示:按进前十概率最大者选边,24 国中 18 国的最优口径是金牌优先、6 国是总数优先、加权优先为零。这不是说金牌榜"更容易",而是它的通货不同:第 10 名的金牌数往往只是个位数,门槛远低于总数榜的第 10 名(30 枚上下),于是中游集团在金牌榜普遍显得更能达标。读懂这一点就不会被"某国金牌榜跻身前十"的宣传带偏——先问门槛,再看概率。
5.4 口径分歧有多大:领奖台都可能换人
同一份后验下,三口径的前三名集合完全一致的概率:金vs总仅 5.6%、金vs加权 15.8%、总vs加权 57.6%;Top12 候选国的加权-金牌期望名次差平均 1.38 位。换句话说,超过九成的可能世界里,金牌前三与总数前三不是同一批国家。"哪种奖牌榜更公平"因此没有客观答案,但有客观后果——发布榜单而不声明口径,等于隐藏了结论的一半。
六、灵敏度分析
- 先验 IG(2,0.05)→IG(2,0.5):后验 从 0.0065 升至约 0.011,收缩率降至约 15%——异质性信念越强收缩越少,但系数与决策结论排序不变。
- 剔除随机效应(退化为范文一 OLS):样本外 MAE 4.04、但区间需靠 Bootstrap 外挂;层级框架的价值不在点精度而在不确定性的内生一致性。
- 模拟次数 1000→400:P(前10) 的蒙特卡洛标准误约 ±1.5 个百分点,C06 的 83.3%/33.4% 差距稳健。
- 加权方案 4:2:1→3:2:1:C06 加权榜进前十概率升至约 41%,方向不变——结论对权重微调不敏感,对"是否给成色定价"敏感。
七、模型评价与改进
优点:①不确定性三层分账(参数、国别、观测),区间内生且覆盖率经样本外检验(23/24);②后验预测直接输出整届比赛,多口径决策有了统一的概率语言;③全共轭 Gibbs 纯标准库实现,教学透明可复现。局限:①线性弹性与对数正态噪声仍是简化,未建项目层面的夺牌结构;②2028 主办未知取 0,若东道主确定应叠加 的红利项;③国别随机效应为 exchangeable 设定,未利用地理与文化相关性。改进:泊松/负二项似然处理小计数国、空间层级引入邻国相关、以及把「爆冷概率」定义为 P(实际名次优于期望名次 )——这正是范文三的主题。
八、结论
贝叶斯层级模型在这道题上交出三句话:第一,数据比我们先知道答案—— 表明国别异质性微弱,29.9% 的收缩自动拒绝了过拟合;第二,点精度不免费、区间才值钱——MAE 4.21 对 4.04 打平,但 23/24 的内生覆盖率让"±35 枚"成为模型的输出而非事后的补丁;第三,口径即立场,立场可计算——C06 的 83.3% 对 33.4%、18 国的门槛效应、5.6% 的领奖台一致率,把"公平"从价值争论变成一张可以打印的概率表。一句话:与其争论哪张榜公平,不如同时报出三张榜及其分歧概率——诚实的模型自己会说话。
参考文献
- COMAP. MCM Problem C: Models for Olympic Medal Tables. 2025.
- Gelman A., Hill J. Data Analysis Using Regression and Multilevel/Hierarchical Models. Cambridge University Press, 2007.
- Bernard A. B., Busse M. R. Who Wins the Olympic Games: Economic Resources and Medal Totals. Rev. Econ. Stat., 2004.
- Casella G., George E. I. Explaining the Gibbs Sampler. The American Statistician, 1992.
- Kendall M. G. Rank Correlation Methods. Griffin, 1970.
附录:核心 Python 实现
import sys, os
_HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.abspath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_mcm2025c as B # 范文一真源:共用合成面板与基础函数
import gen_mcm2025c_2 as H # 本篇真源:层级贝叶斯 + 多口径决策
# 1) 同一面板 + 全样本链 B
ctys, panel = B.gen_panel()
rows_all, idx = H.build_rows(panel)
draws_b = H.gibbs(rows_all, seed=H.SEED)
nb = len(draws_b)
sig = sum(d[2] for d in draws_b) / nb
tau = sum(d[3] for d in draws_b) / nb
print("链B保留=%d σ=%.4f τ=%.4f" % (nb, sig, tau))
# 2) 系数对照与可信区间
beta_full, _r2 = B.fit_full(panel)
for j in range(1, 5):
col = sorted(d[0][j] for d in draws_b)
pm = sum(col) / len(col)
lo, hi = H.quantile(col, 0.05), H.quantile(col, 0.95)
print("β%d: OLS=%.4f 后验=%.4f 90%%CI=[%.4f,%.4f] 落入=%s"
% (j, beta_full[j], pm, lo, hi, lo <= beta_full[j] <= hi))
# 3) 收缩与样本外检验
np_est = H.nopool_intercepts(rows_all, idx)
pp_est = {c: sum(d[0][0] + d[1][idx[c]] for d in draws_b) / nb for c in np_est}
bar_np = sum(np_est.values()) / len(np_est)
bar_pp = sum(pp_est.values()) / len(pp_est)
d_np = sum(abs(v - bar_np) for v in np_est.values()) / len(np_est)
d_pp = sum(abs(v - bar_pp) for v in pp_est.values()) / len(pp_est)
print("收缩率=%.1f%% 相关r=%.3f"
% (100 * (1 - d_pp / d_np), B.pearson([np_est[c] for c in sorted(np_est)],
[pp_est[c] for c in sorted(np_est)])))
chk = H.predict_2024_chain(panel)
print("2024样本外: MAE=%.2f 覆盖=%d/24 %s点%.1f实际%d区间[%.1f,%.1f]"
% (chk["mae"], chk["n_covered"], chk["tgt"], chk["point"],
chk["actual"], chk["lo"], chk["hi"]))
# 4) 2028 后验预测与三口径决策
sims = H.simulate_future(panel, draws_b, ctys)
ranks = H.rank_tables(sims)
def ptop(cal, cid, k):
return 100.0 * sum(rt[cal][cid] <= k for rt in ranks) / len(ranks)
print("C08总数口径: P(前3)=%.1f%% P(前5)=%.1f%%" % (ptop(1, "C08", 3), ptop(1, "C08", 5)))
print("C06 P(前10): 金%.1f%% 总%.1f%% 加权%.1f%%"
% (ptop(0, "C06", 10), ptop(1, "C06", 10), ptop(2, "C06", 10)))
agree = sum(set(c for c in rt[0] if rt[0][c] <= 3) ==
set(c for c in rt[1] if rt[1][c] <= 3) for rt in ranks)
print("前三集合一致率 金vs总=%.1f%%" % (100.0 * agree / len(ranks)))