Friday, June 28, 2013

Adding in ReachTEL

This morning's ReachTEL was the third national poll in this series. Having three polls allows me to drop the ReachTEL series into the Bayesian aggregation with some sense of the bias for the series. (I can drop in single polls which are not part of a series, but this does not give me a sense of the house effect).

The result is an aggregation that suggests the population two-party preferred (TPP) voting intention might be closer to 49.5 per cent for Labor and 50.5 per cent for the Coalition.


All-in-all, this result suggests a close election.


Because the ReachTEL series (with just three polls) appears to have a moderate Coalition bias, I have excluded it from the sum-to-zero constraint on house-effects (just like I previously excluded the Morgan face to face poll because of its Labor bias). I will review this decision when I have seen a few more ReachTEL polls.


Of note: once bias adjusted, the latest ReachTEL poll is pretty much 50-50 in round terms (See the right-most data point in the next chart). 


Adding the ReachTEL poll suggests that the Rudd Resurrection Effect (RRE) might be closer to 5.1 percentage points. Half the RRE samples from the aggregation fell between 4.5 and 5.7 percentage points.


Finally, for the nerds, the updated JAGS code:

    model {
        ## Based on Simon Jackman's model, with an additional element for
        ## the various rounding effects of the different polling houses
        ## and a sum-to-zero constraint on house effects 
        ## Update: also provides for a discontinuity with the Gillard to Rudd transition. 
    
        ## -- observational model
        for(poll in 1:NUMPOLLS) { # for each poll result
            roundingEffect[poll] ~ dunif(-houseRounding[poll], houseRounding[poll])
            yhat[poll] <- houseEffect[house[poll]] + walk[day[poll]] + 
                roundingEffect[poll]
            y[poll] ~ dnorm(yhat[poll], samplePrecision[poll]) # distribution
        }
            
        ## -- temporal model
        for(i in 2:PERIOD) { # for each day under analysis ...
            #walk[i] ~ dnorm(walk[i-1], walkPrecision) # AR(1) 
            day2DayAdj[i] <- ifelse(i==DISCOUNTINUITYDAY, walk[i-1]+discontinuityValue, walk[i-1])
            walk[i] ~ dnorm(day2DayAdj[i], walkPrecision)
        }

        ## -- sum-to-zero constraint on house effects (ignoring Morgan F2F/ReachTEL)
        #houseEffect[1] <- -sum( houseEffect[2:HOUSECOUNT] ) + houseEffect[MORGANF2F]
        #houseEffect[1] <- -sum( houseEffect[2:HOUSECOUNT] )
        houseEffect[1] <- -sum( houseEffect[2:HOUSECOUNT] ) + houseEffect[REACHTEL]

        ## -- priors
        sigmaWalk ~ dunif(0, 0.00250)         ## uniform prior on std. dev.  
        walkPrecision <- pow(sigmaWalk, -2)   ##   for the day-to-day random walk
        walk[1] ~ dunif(0.01, 0.99)           ## initialisation of the daily walk
        discontinuityValue ~ dunif(-0.2, 0.2) ## uninformative prior

        for(i in 2:HOUSECOUNT) { ## vague normal priors for house effects
            houseEffect[i] ~ dnorm(0, pow(0.1, -2))
        }
    }

No comments:

Post a Comment