The chart below comes by way of the is.R blog and shows the average ideology of the members of the United State House of Representatives within the Republican (red) and Democratic (blue) parties. (Other parties are shown in green.) The chart is shown as a time series, from the first US congress in 1789, to the most recent full congress (the 111th, from 2010). The 80th congress first met in 1947.
Ideology here is measured according to the DW-NOMINATE scale, a score that ranges from -1 (extremely liberal) to +1 (extremely conservative) based on legislative votes, and is designed to be comparable across time. (The source data is available for download at voteview.com.) The width of each band represents the spectrum of all but the 10% most extreme legislators within each party; the dark dot shows the median.
The graph shows that while both parties have always been distinct in their ideology, since about World War 1 there's at least been some slight overlap. All that changed in the early 70's though, as successive Republican congresses became increasingly more conservative in their voting records, while Democratic congresses remained much the same. Today, there's no ideological overlap between members of the two parties.
The chart above was created using the R language, and R programmers should take a look at the source code posted at the is.R blog. It's a great example of using the ddply function (from the plyr package) to aggregate the individual legislator ideology scores into medians and quantiles by party and congress. The ggplot function was used to create the chart itself, by overlaying the interquartile range and median points over a line chart of the 90% range. For more details, check out the full post at the link below.
(Update Nov 6: See another version of this chart based on code from Mike Lawrence in the comments below.)
is.R: The distribution of ideology in the U.S. House (with plyr)
An complimentary approach to visualization would be to fit a generalized additive model to evaluate the trustworthiness of the visual trends. The code below achieves this (restricting the years to those with data for both democrats and republicans, and eliminating the other category for low data counts).
library(ez)
library(foreign)
#get the data
dwNominate <- read.dta("ftp://voteview.com/junkord/HL01111E21_PRES.DTA")
# Make a re-coded party variable
dwNominate$majorParty <- "Other"
dwNominate$majorParty[dwNominate$party == 100] <- "Democrat"
dwNominate$majorParty[dwNominate$party == 200] <- "Republican"
#toss the "Other" data and factorize majorParty with a sum contrast
dwNominate = dwNominate[dwNominate$majorParty!='Other',]
dwNominate$majorParty = factor(dwNominate$majorParty,levels=c('Democrat','Republican'))
contrasts(dwNominate$majorParty) = 'contr.sum'
#narrow data to cong>35
dwNominate = dwNominate[dwNominate$cong>35,]
#fit the gam
fit = gam(
data = dwNominate
, formula = dwnom1 ~ majorParty + s(cong,by=majorParty,k=76,bs='ts')
, weights = I(1/bootse1)
)
#obtain predictions
preds = ezPredict(fit)
#data for each party separate, with a posteriori bootstrapped 95% CIs
ezPlot2(
preds = preds
, x = cong
, split = majorParty
, ribbon = T
)
#data for the party difference, with a posteriori bootstrapped 95% CI
ezPlot2(
preds = preds
, x = cong
, diff = majorParty
, reverse_diff = T
, ribbon = T
)
Posted by: Mike Lawrence | October 18, 2012 at 18:01
While it would require delving into the source data, what we call Democrats today evolved from the Republican Party of Lincoln. The original Democrats evolved into the Tea Party Republicans (or Goldwaterites). If the data relies on just party names, the plot pre-1900 doesn't really map to today.
Posted by: Robert Young | October 18, 2012 at 19:20
I don't think Nominate it's designed to be comparable across time.
The main problem with it is that we're recovering a latent variable and there are known issues with identification. (rotation or translation of the graphic is one of the identification problems). In order to identify the model, it's necessary to impose some constraints, like setting one extreme Rep legislator to +1 and one extreme Dem legislator to -1. This helps to identify the model (in one dimension at least, If I'm not mistaken), but the cost is that one extreme legislator from the 50's doesn't have the same ideology content of an extreme legislator from the 90's.
Another problem is that since Nominate scores are estimated based on actual roll call votes, and pieces of legislation varies along time, we can't be sure whether legislations from the past we're proposed again current legislators would vote different than they voted in the past.
All in all, I don't think we can say that scores are comparable over time.
Posted by: Manoel Galdino | October 21, 2012 at 09:51
Typo: DW-DOMINATE --> DW-NOMINATE.
Posted by: Paul Schreiber | October 23, 2012 at 18:44
@Paul, thanks for the correction. I've updated the post above.
Posted by: David Smith | October 24, 2012 at 09:08
@Mike, thanks for the suggestion! I've included a version of your chart in a new blog post.
Posted by: David Smith | November 06, 2012 at 09:52