Political Ideology & Front-line House Democrats

Briefly

A quick look at the voting behavior of the 30 House Democrats that represent congressional districts carried by Trump in 2016. Using Rvoteview. For a more in-depth account of the characteristics of front-line House Democrats in the 116th Congress, see this post.

Front-line House Democrats

I have been going on about the House of Representatives quite a bit lately, especially Democratic members representing Trump districts. These guys were instrumental in Democrats recapturing the House majority in 2018. Over two-thirds of these front-liners are freshman members, and as a group they are super vulnerable heading into November 2020.

I have posted a list of the 30 front-liners as a simple csv, cached as a part of the uspoliticalextras data package. It is available at the link below.

library(tidyverse)
url1 <- 'https://raw.githubusercontent.com/jaytimm/uspoliticalextras/master/clean-data-sets/thirty-one-house-democrats.csv'
fl <- read.csv(url(url1)) 

Ideologies in the 116th

So, using the Rvoteview (!) package, we obtain DW-Nominate scores for all members in the 116th House. This session is still in progress, so these numbers will change depending on when they are accessed.

x116 <- Rvoteview::member_search (chamber = 'House', 
                                  congress = 116) %>%
  
  mutate(label = gsub(', .*$', '', bioname),
         party_code = ifelse(bioname %in% fl$house_rep, 
                             'xx', party_code),
         party_name = ifelse(bioname %in% fl$house_rep, 
                             'Frontline Dems', 'Other Dems'))

The plot below summarizes voting behaviors as approximated by DW-Nominate scores in two dimensions. Here, our focus is on the first dimension (ie, the x-axis). The 30 front-liners are marked in orange. In the aggregate, then, they vote more moderately than their non-front-line Democrat peers.

p <- x116 %>%
  ggplot(aes(x=nominate.dim1, 
             y=nominate.dim2,
             label = label
             )) +
          annotate("path",
               x=cos(seq(0,2*pi,length.out=300)),
               y=sin(seq(0,2*pi,length.out=300)),
               color='gray',
               size = .25) +
  geom_point(aes(color = as.factor(party_code)), 
             size= 2.5, 
             shape= 17) +
  theme_bw() +
  ggthemes::scale_color_stata() +
  theme(legend.position = 'none') +
  labs(title="DW-Nominate ideology scores for the 116th US House",
       subtitle = '30 front-line House Democrats in orange')

p
## Warning: Removed 2 rows containing missing values (geom_point).

Focusing on Democrats

Next, we home in a bit on House Democrats. To add some context to the above plot, we calculate quartiles for DW-Nominate scores among Democrats. These are summarized in table below, ranging from progressive to moderate.

dems <- x116 %>%
  filter(party_code %in% c('xx', '100')) 


qq <- data.frame(x = quantile(dems$nominate.dim1, probs = seq(0, 1, 0.25)),
                 stringsAsFactors = FALSE)

qq %>% knitr::kable()
x
0% -0.76100
25% -0.44525
50% -0.37800
75% -0.28575
100% -0.06900

We add these quartiles to the plot below, and label front-line House Democrats. Again, front-liners cluster as a group in terms of roll call voting behavior. The most notable exception to this pattern is Lauren Underhood (IL-14). She won her district by five points in 2018, and Trump won the district by 4 points in 2016. It would appear, then, that her voting behavior and the political ideology of her constituents do not especially rhyme. In other words, she represents a Trump district and votes like a progressive.

p1 <- p +
  xlim(-1, 0) +
  geom_vline(xintercept = qq$x, linetype = 2, color = 'gray') +
  ggrepel::geom_text_repel(
   data  = filter(x116, 
                  bioname %in% fl$house_rep),
   nudge_y =  -0.005,
   direction = "y",
   hjust = 0, 
   size = 2.5)

p1

The table below summarizes counts of Democrats by front-line status & ideology quartile. So, roughly 3/4 of front-liners vote in the most moderate Democratic quartile in the House. And all but Underwood are in top 50%.

dems1 <- dems %>%
  mutate(qt = ntile(nominate.dim1, 4))

dems1 %>% 
  group_by(party_name, qt) %>%
  count() %>%
  group_by(party_name) %>%
  mutate(per = round(n/sum(n)*100, 1)) %>%
  knitr::kable(booktabs = T, format = "html") %>%
  kableExtra::kable_styling() %>%
  kableExtra::row_spec(3,  
                       background = "#e4eef4")
party_name qt n per
Frontline Dems 1 1 3.3
Frontline Dems 3 6 20.0
Frontline Dems 4 23 76.7
Other Dems 1 58 28.2
Other Dems 2 59 28.6
Other Dems 3 53 25.7
Other Dems 4 36 17.5
Share