用 pymc3 预测以色列选举
- 应用
- 选举预测
- 数据
- 民意调查
- 方法
- 贝叶斯网络
- MCMC 建模
摘要
PyHoshen 是一个基于贝叶斯网络 MCMC 的选举预测框架,基于 PyMC3 实现。PyMC3 被设计为一个“推理键”:只需用 Python 写出贝叶斯网络模型,就能自动使用 MCMC 方法估算参数。估算可能会花些时间,但 PyMC3 用了 C++ 和 GPU 提供额外的计算速度。类似的,PyHoshen 试图成为一个用于选举-民调的“推理键”:只要提供民意调查数据并设置好选举参数,它就能将民意调查转换成 PyMC3 中的统计模型。
概要
作者没有为这个模型发论文,甚至没搜到作者 Yizhak Sapir 的文章,网上仅有该项目的博客,讲解了该模型项目如何安装运行,并不涉及理论。
因此以下内容少量来自博客,主要梳理自该开源项目的代码。
以色列的选举特点
2019 年有超过 12 个党有希望获得议会席位(Knesset),但大多都在“阈值”(3.25%)附近挣扎。如果一个党的得票不能超过这个阈值,它的票数将按一种复杂的算法 Bader-Ofer 分给其它党。
模型
设候选人为 n,并假设在整个选举期间,候选人间支持率的协方差不变,机构效应不变。
支持率 supports
将选举过程逆向视为一个以选举结果为初值的高斯随机行走(维纳过程),即设选举日结果为待估计 n 元变量 votes, 前一日结果相对后一日为均值为 0 的 n 元正态分布
$$ f(x \mid \mu, C) = \frac{1}{(2\pi)^{k/2}|C|^{1/2}} \exp\left{ -\frac{1}{2} (x-\mu)^{\prime} C^{-1} (x-\mu) \right} $$
- $\mu$ 为均值,固定取 n 维 0 向量;
- C 为 n 维协方差矩阵,各步共享。
即
innovation ~ Normal(0, C)
wiener = cumsum(innovation)[::-1]
supports = wiener + votes
机构效应
不同民调机构(设有 m 家)可能对不同的候选人有所偏好,导致民调结果有一定偏差。视特定机构对特定候选人的偏好满足均值为 0 的正态分布。
即
house_effects ~ Normal(0, 0.05)
但这总共并非 m X n 个独立随机变量,作者在这只使用了 (m - 1) X (n - 1) 个独立的满足正态分布的随机变量,余下的随机变量由这些计算得到,使得任一机构对所有候选人的偏好之和为 0,所有机构对同一候选人的偏好之和为 0。
民调结果
视各时期的民调结果为满足自由度为受调查人数的 n 元 t 分布
$$ f(\mathbf{x}| \nu,\mu,C) = \frac {\Gamma\left[(\nu+p)/2\right]} {\Gamma(\nu/2)\nu^{p/2}\pi^{p/2} \left|{C}\right|^{1/2} \left[ 1+\frac{1}{\nu} ({\mathbf x}-{\mu})^T {C}^{-1}({\mathbf x}-{\mu}) \right]^{(\nu+p)/2}} $$
- $\nu$ 为自由度,取受调查人数;
- $\mu$ 为均值,取支持率与机构效应之和,n 维;
- C 为协方差矩阵,取支持率建模中的协方差矩阵,n 维。
即
poll ~ t(受调人数, supports + house_effects, C)
由于民调结果可观测,于是可以从这里开始通过 MCMC 方法(已由 PyMC3 实现)估计模型的参数。
模型特点
优点
- 考虑了机构效应。即机构对不同党的特殊的稳定的偏向;
- 考虑了不能超过“阈值”的党的影响;
- 考虑了党之间的相关性。
缺点
- 滞后。如果在新的民调出来之后出现了影响民意的事件,这个模型就捕捉不到。比如以色列最后选举前有个封锁期,在此期间不能发布民调;
- 这个模型识别不出所有机构的相同的偏向;
- 对于民调中的弃权票没有特殊的考虑。
Page Not Found
Try to search through the entire repo.