Tuesday, April 30, 2013

Weekly aggregation: 44.3 to 55.7

This week we have two fresh polls ready for Bayesian aggregation:

  • The Morgan poll moved 2.5 percentage points in the Coalition's favour (56.5 to 43.5)
  • The Essential poll was unmoved on the previous independent fortnight (54 to 46), but it is a percentage point in the Coalition's favour on last week.

The raw and LOESS charts follow.

The two-party preferred (TPP) vote share aggregation yields a result of 44.3 to 55.7. However, the movement in the aggregation over the final week is driven by a single polling house; the new Morgan multi-mode poll. As I look at the aggregation, I am not sure whether to discount last week's jump or this week's decline for the Government. As both the jump and the decline appear to be (at least in part) driven by movements in the Morgan poll, it could be argued they cancel each other out.

I remain vexed by the new Morgan poll. Morgan has not released a lot of information on their polling methodology, which makes it difficult to assess. One of my issues is the new Morgan series is looking a little bouncy (perhaps over-dispersed) for its sample size. Something to ponder.

The longer running narrative for 2013 has been a sizable collapse of support for the government between January and late March. While this fall in voter support has been arrested, the recovery needs to pick up from its currently glacial pace for Labor to be well placed come September 14.

Turning to the aggregated primary votes:

Sunday, April 28, 2013

The Sawford Formula

The Sawford formula is a shorthand way of saying, "it's the economy stupid". It is a rule of thumb based on the notion that the state of the economy is a good predictor of election outcomes. According to the formula, if two or more of the inflation rate, the unemployment rate and interest rates rise over a full, three-year electoral cycle, the government will lose. So let's have a look.

On the unemployment rate, at this stage it is up (albeit only marginally) over the life of the latest electoral cycle (in dark pink on the right hand side of the chart).

 On inflation, at this stage it is down (again only marginally) over the life of the latest electoral cycle.

On interest rates, we are currently 150 basis points better off than we were at the commencement of the latest election cycle.

If the Sawford formula is to believed (and the current trends continue), we will see a return of the Labor government come September 14. While such a result is against the current wisdom of crowds; some would argue that the Sawford formula predicted the return of the Keating Government in 1993 against the wisdom of the punditry at the time.

Thursday, April 25, 2013

Towards a more integrated primary vote share model

A few weeks ago I said that I had developed a Bayesian model for primary vote shares. At the time, I was seeking (but had not attained) an integrated solution that ensured the primary votes shares across the four party groups (Coalition, Labor, Green and Other) summed to one (or one hundred per cent). My original model typically summed in the range 99.5 to 100.5 per cent.

I have now have a more integrated model working. This new model typically sums in the range 99.95 to 100.05 per cent (an order of magnitude improvement on the unintegrated model). The model is as follows.

model {
    #### -- observational model 
    for(poll in 1:NUMPOLLS) { # for each poll result - rows
        for(party in 1:PARTIES) { # for each party - columns
            yhat[poll, party] <- houseEffect[house[poll], party] + 
                walk[pollDay[poll], party] 
            primaryVotes[poll, party] ~ dnorm(yhat[poll, party], precision[poll, party])
    #### -- temporal model (a daily walk where today is much like yesterday)
    for(day in 2:PERIOD) { # rows
        for (party in 1:PARTIES) { # columns
            tmp[day, party] ~ dnorm(walk[day-1, party], walkPrecision[party])

    ## -- impose a sum-to-one constraint ... total of all parties sums to one every day
    for(day in 1:PERIOD) { # rows
        walk[day, 1:PARTIES] <- tmp[day, 1:PARTIES] / sum(tmp[day, 1:PARTIES ])

    ## -- constrained priors for the day-to-day variance of the temporal model
    for(party in 1:PARTIES) { # for each party
        sigmaWalk[party] ~ dunif(0, 0.005)  ## uniform prior on std. dev.  
        walkPrecision[party] <- pow(sigmaWalk[party], -2)   

    ## -- uninformative priors for first day in the temporal model
    for (party in 1:PARTIES) { # for each party
        tmp[1, party] ~ dunif(0.0001, 0.9999) # fairly uninformative

    #### -- sum-to-zero constraint on house effects (ignoring Morgan F2F)
    for (party in 1:PARTIES) { # for each party, house effects across houses sum to zero 
        houseEffect[1, party] <- 0 - sum( houseEffect[2:HOUSECOUNT, party] ) + 
            houseEffect[MORGANF2F, party]
    for(house in 2:HOUSECOUNT) { # for each house, house effects across the parties sum to zero
        houseEffect[house, 1] <- 0 - sum( houseEffect[house, 2:PARTIES] ) 
    # but note, we do not apply a double constraint to houseEffect[1, 1] [NEWSPOLL, LABOR]
    ## -- vague normal priors for house effects - centred on zero
    for (party in 2:PARTIES) { # for each party (cols)
        for(house in 2:HOUSECOUNT) { #  (rows)
            houseEffect[house, party] ~ dnorm(0, pow(0.1, -2))

The results from the model (with a 100,000 iteration run) are as follows ... noting this model took an hour of computing time.

While I have a working model, I remain concerned that it is inelegant. If you are feeling particularly wonkish, you can help me improve the model.

Tuesday, April 23, 2013

Weekly aggregation: 55-45

This week we have three new polls:

  • Newspoll's two-party preferred (TPP) estimate is unchanged on a fortnight ago (at 55/45 in the Coalition's favour). Its estimate of the Coalition's primary vote dropped two percentage points (from 48 to 46). Labor's primary vote estimate is unchanged on last fortnight (32).
  • Morgan's TPP estimate moved two percentage points in Labor's favour (54/46), and the Coalition's primary vote dropped 3.5 points (from 47.5 to 44). Labor's primary vote estimate is up half a point on last week (from 32 to 32.5).
  • Essential's TPP estimate is unchanged on last week (55/45), but down a percentage point on a fortnight ago for the Coalition. The Coalition's primary vote is unchanged on last week, but down a point on a fortnight ago (from 49 to 48). Labor's primary vote estimate is up two points on a fortnight ago (from 32 to 34).

The raw TPP chart and 90 day TPP LOESS follow:

The Bayesian aggregation yields a TPP estimate of 55 to 45 in the Coalition's favour, which would see the Coalition win around 95 seats and Labor around 52 seats in a Federal election.The  aggregation has moved 0.8 percentage points in Labor's favour on last week.

My (albeit more speculative) Bayesian aggregations of the primary vote shares follow. We can see the (so-far, unexplained) movement of primary vote share from the Coalition to other, which was evident in the latest polling results.

Monday, April 15, 2013

Weekly aggregation: 44.2 to 55.8

We have had a few polls since last week's aggregation, demonstrating a small movement to the government (in the order of 0.2 percentage points).

  • A Galaxy poll yesterday moved a point in the government's favour with 54 to 46
  • This morning's Nielsen moved a point away from the government with 57 to 43
  • Today's Essential moved a point to the government on the previous independent poll of a fortnight ago with 55 to 45
  • Today's Morgan multi-mode poll is unchanged on a week ago at 44 to 56.

In terms of the primary vote ... the key aggregations follow: