Skip to contents

Bayesian alpha-NOMINATE: legislator \(i\) votes yea on roll call \(j\) with probability \(\Phi(u_{ij})\), where $$u_{ij} = Q_{ij} + \alpha (G_{ij} - Q_{ij}),$$ \(Q_{ij} = -\frac{1}{2} \beta w^2 (d^2_{iY} - d^2_{iN})\) is the quadratic and \(G_{ij} = \beta \{\exp(-\frac{1}{2} w^2 d^2_{iY}) - \exp(-\frac{1}{2} w^2 d^2_{iN})\}\) the Gaussian utility difference, and \(d_{iY}\), \(d_{iN}\) are the distances from the ideal point to the yea and nay outcomes. \(\alpha = 1\) is pure Gaussian utility, \(\alpha = 0\) pure quadratic; the posterior of \(\alpha\) is the quantity of interest. As in the reference implementation the weight \(w\) is fixed at 0.5, \(\beta\) has a flat prior on \((0, \infty)\) and \(\alpha\) a flat prior on \([0, 1]\). Ideal points, yea and nay locations carry the reference implementation's hierarchical penalty \(-x' S x / 2\), with \(S\) redrawn each sweep from an inverse Wishart with \(n - 1\) degrees of freedom and scale the cross-product of the current coordinates.

Usage

morie_spatial_voting_alpha_nominate(
  votes,
  n_dims = 1L,
  n_samples = 500L,
  burn_in = 100L,
  seed = 42L,
  thin = 1L,
  lop = 0.025,
  minvotes = 20L,
  polarity = 1L,
  constrain = FALSE
)

Arguments

votes

Legislator-by-roll-call matrix of 1 (yea), 0 (nay) and NA (missing).

n_dims

Number of latent dimensions.

n_samples

Number of retained draws.

burn_in

Sweeps discarded before the first retained draw.

seed

RNG seed.

thin

Keep every thin-th sweep after burn-in.

lop

Minimum minority share for a roll call to be kept.

minvotes

Minimum number of kept roll calls a legislator must have voted on.

polarity

Row index (one per dimension, recycled) of the legislator placed on the positive side.

constrain

If TRUE, fix \(\alpha = 1\) (Gaussian utility, the W-NOMINATE special case).

Value

List: ideal_points and ideal_sd (kept legislators by dimension), yea_locations, nay_locations, alpha (posterior mean), alpha_interval (central 95\ identified draws: arrays X, Y, N with the draw index first, and vectors beta, alpha), legislators_used, votes_used, n_dims, engine.

Details

Every coordinate, \(\beta\) and \(\alpha\) are updated by slice sampling (Neal 2003, stepping out with width 8 and at most 3 steps, then shrinkage). Coordinates that are conditionally independent – all legislators on one dimension, all yea (or nay) locations on one dimension – are sliced together, which gives the same chain law as updating them one at a time. Starting values are uniform on \((-1, 1)\), \(\beta = 10\) and \(\alpha = 0.7\).

The likelihood depends on distances only, so after sampling each draw is centred on its legislators' mean and rotated (orthogonal Procrustes, no dilation) onto the posterior mean configuration; the sign of each dimension makes the polarity legislator positive. Roll calls whose minority side is below lop and legislators with fewer than minvotes votes on the kept roll calls are dropped first, the screens the reference implementation applies through W-NOMINATE.

Checked against the anominate package on a simulated chamber of 40 legislators and 120 roll calls (true \(\alpha = 0.5\)): posterior mean \(\alpha\) 0.314 against 0.325, \(\beta\) 3.50 against 3.48, and the posterior mean ideal points correlate at 0.9998.

References

Carroll, R., Lewis, J. B., Lo, J., Poole, K. T. and Rosenthal, H. (2013). The structure of utility in spatial models of voting. American Journal of Political Science 57(4), 1008-1028.

Neal, R. M. (2003). Slice sampling. Annals of Statistics 31(3), 705-767.

Examples

set.seed(1)
x <- seq(-1, 1, length.out = 20)
mid <- runif(30, -0.7, 0.7)
V <- outer(x, mid, ">") * 1
flip <- sample(length(V), 30)
V[flip] <- 1 - V[flip]
fit <- morie_spatial_voting_alpha_nominate(V, n_dims = 1L,
  n_samples = 40L, burn_in = 20L, minvotes = 10L, polarity = 20L)
fit$alpha
#> [1] 0.9486054
# the ideal points keep the simulated order
cor(fit$ideal_points[, 1], x[fit$legislators_used])
#> [1] 0.9802366