### # Application of Generalized Estimating # Equations to predict US presidential # election outcomes based on the age # of the candidate. ### # Load in data, turn days into years, set contrast # for incumbency dat = read.csv("usaElect.csv") dat = cbind( dat, demAgeYear = dat$demAge/365 ) dat = cbind( dat, repAgeYear = dat$repAge/365 ) contrasts( dat$incumb ) <- contr.treatment(n=3,base=2) # Load in package for fitting gee models library(geepack) # First consider elections from 1960 to 2016 ss=4 md1 = geeglm( demWin ~ demAgeYear + repAgeYear + incumb, id=demName, data=dat, family=binomial(), corstr = "exchangeable", subset = ss:18 ); summary(md1) # Then consider elections from 1948 to 2016 ss=1 md2 = geeglm( demWin ~ demAgeYear + repAgeYear + incumb, id=demName, data=dat, family=binomial(), corstr = "exchangeable", subset = ss:18 ); summary(md2) # Plot fitted models prd1 = predict( md1 ) prd1 = 1/(1+exp(-prd1)) prd2 = predict( md2 ) prd2 = 1/(1+exp(-prd2)) plot( dat$demAgeYear[1:18], dat$demWin[1:18], las=1 ) lines( sort(dat$demAgeYear[4:18]),sort(prd1,decreasing = T), col='blue',lwd=2 ) lines( sort(dat$demAgeYear[1:18]),sort(prd2,decreasing = T), col='red',lwd=2 )