Predict the result of French elections

Sorry but this is a very rough draft written for myself.

See Forecasting elections in multiparty systems: a Bayesian approach combining polls and fundamentals

TODO Link Gaussian process to stochastic processes

TODO Make the gaussian process work with a non-diagonal covariance matrix



  • Elections \(e = 1, \dots, E\)
  • Parties \(p = 1, \dots, P\)
  • Pollsters \(h=1, \dots, H\)
  • Time \(t = t_0-N, \dots, t_0\)

Latent variables:

  • Intercept with polls \(\iota\)
  • Latent party \(p\) popularity at day \(t\) with polls: \(\mu_{p, t}\)
  • House effect for model with polls \(\alpha_k\) where \(k=1, \dots, n_{pollsters}\)
  • Intercept with results and fundamentals \(\tilde{\iota}\)
  • House effect for model with results and fundamentals \(\tilde{\alpha}_k\)
  • Poll biais (what is this?)
  • Latent party \(m\) popularity at day \(t\) with fundamentals: \(\tilde{\mu}_{m, t}\)

We integrate two different models:

  • A model that aggregates polls and tries to infer the "true" intentions
  • A model that uses fundamental data to predict the results on election days
  • Both models are integrated as we relate the results to the "true" intention at time \(T\) of the election, which is connected to the intentions at previous time steps.

We use Gaussian processes to model the time evolution of the different parameters. However:

  • We use 1D gaussian processes, one for each party where we could use a multidimensional GP with a dense covariance matrix instead (and thus model the 'transfers');
  • We use the Squared exponential kernel but the Ornstein-Uhlenbeck kernel should be more adaptated as a stochastic process. We could also try a non-stationary kernel as the Wiener kernel (I don't see why the distribution should be stationary here)
  • The value of the parameter is the sum of three parameters modeled by GPs with different timescales. Can we do better than this?


\begin{align*} \sigma_{\iota} &\sim \operatorname{HalfNormal}(0.5)\\ \iota_{e,p} &\sim \operatorname{ZeroSumNormal}(0, \sigma_{\iota}) \end{align*} \begin{align*} \sigma_{\tilde{\iota}} &\sim \operatorname{HalfNormal}(0.5)\\ \tilde{\iota}_{p} &\sim \operatorname{ZeroSumNormal}(0, \sigma_{\tilde{\iota}}) \end{align*}

House effect

The systemic poll biais shared by every pollster for each political party:

\begin{equation} \zeta_{p} \sim \operatorname{ZeroSumNormal}(0, 0.15) \end{equation}

The house effet per party

\begin{equation} \epsilon_{h,p} \sim \operatorname{ZeroSumNormal}(0, 0.15) \end{equation}

And the house effect per (election, party)

\begin{align*} \sigma_{\tilde{\epsilon}, h, p} &\sim \operatorname{HalfNormal}(0.15)\\ \tilde{\epsilon}_{h, p, e} &= \sigma_{\tilde{\epsilon}, h, p} \;\operatorname{ZeroSumNormal}(0, 1) \end{align*}

Fundamental data

Idea that elections are simple to predict using fundamental data. Here we model the unemployment effect \(\nu_u\):

\begin{equation} \nu_u \sim \operatorname{ZeroSumNormal}(0, 0.15) \end{equation}

Time evolution

We model the time evolution of parties' latent popularity with 3 gaussian processes with different length scales to catch the different time scales of the process.

Combine the factors

Poll aggregator

\begin{equation} \lambda_{h, t, e, p} = \tilde{\iota}_{p} + \iota_{e,p} + \mu_{t,p} + \tilde{\mu}_{t,e,p} + \zeta_{u} \; U_{t} + \zeta_{p} + \epsilon_{h,p} + \tilde{\epsilon}_{h,p,e} \end{equation}

We then note the vector \(\mathbf{p}_{h, t, e} = \left(p_{h,t,e,Green}, \dots, p_{h,t,e,Left}\right)\) and write

\begin{equation} \mathbf{p}_{h, t, e} = \operatorname{Softmax}(\lambda_{h, t, e}) \end{equation}

The latent popularity is given by removing the house effects & poll biases:

\begin{equation} \mathbf{p}^{latent}_{h,t,e} = \operatorname{Softmax}\left(\tilde{\iota}_{p} + \iota_{e,p} + \mu_{tp} + \tilde{\mu}_{t,e,p} + \nu_{u} \; U_{t}\right) \end{equation}

Fundamentals model

\begin{equation} \tilde{p}_{h, t, e, p} = \operatorname{Softmax}\left(\tilde{\iota}_{p} + \iota_{e,p} + \mu_{t_0,p} + \tilde{\mu}_{t_0,e,p} + \nu_{u} \; U_{t_0}\right) \end{equation}

Connect to poll results and election results

The concentration parametrer:

\begin{equation} \alpha \sim \operatorname{InverseGamma}(1000, 100) \end{equation}

We note \(n_{h, p, t, e}\) the result of a poll at time \(t\) for party \(p\), and \(N_{t}\) the number of respondents:

\begin{equation} n_{h, p,t, e} \sim \operatorname{DirichletMultinomial}(\alpha\,p_{hpte}, N_{t}) \end{equation}

We note \(r_{pe}\) the result for party \(p\) at election \(e\), \(R_e\) the number of voters and we write

\begin{equation} r_{pe} \sim \operatorname{DirichletMultinomial}\left(\alpha\;\tilde{p}_{pe}, R_{e}\right) \end{equation}

Q: What if there are several polls in one day?

Links to this note