用 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.