Assignment: 2016 US Senate Montana election: Tester/Rosendale

The Senate election may be an even better test of these two hypotheses, because the election was even closer to 50-50, but this time Tester the Democrat won.

Run through the senate election as we did above with the house election. You can get the data from the same spreadsheet, but it’s on sheet = 1.

house_counties <- read_xlsx("Statewide Results.xlsx", sheet = 1, range = "B7:E63")
glimpse(house_counties)
Observations: 56
Variables: 4
$ County                             <chr> "Beaverhead", "Big…
$ `JON TESTER\r\nDemocrat`           <dbl> 1876, 3027, 1961, …
$ `MATT ROSENDALE\r\nRepublican`     <dbl> 2866, 1558, 982, 2…
$ `RICK BRECKENRIDGE\r\nLibertarian` <dbl> 155, 91, 76, 104, …
house_counties <- house_counties %>% 
  rename(Republican = "JON TESTER\r\nDemocrat") %>% 
  rename(Democrat = "MATT ROSENDALE\r\nRepublican") %>% 
  rename(Libertarian = "RICK BRECKENRIDGE\r\nLibertarian") 
glimpse(house_counties)
Observations: 56
Variables: 4
$ County      <chr> "Beaverhead", "Big Horn", "Blaine", "Broa…
$ Republican  <dbl> 1876, 3027, 1961, 1071, 2680, 128, 17435,…
$ Democrat    <dbl> 2866, 1558, 982, 2086, 3209, 602, 15566, …
$ Libertarian <dbl> 155, 91, 76, 104, 178, 22, 1008, 70, 179,…
house_counties <- house_counties %>% 
  mutate(total_votes = Republican + Democrat + Libertarian) %>% 
  mutate(Repub_advantage = Republican/total_votes - Democrat/total_votes) %>% 
  mutate(Repub_advantage = round(Repub_advantage*100, 1))

house_counties %>% 
  arrange(-Repub_advantage)
mt_counties <- get_acs(geography = "county",
                       variables = "B01003_001",
                       state = "MT",
                       geometry = TRUE) 
Getting data from the 2014-2018 5-year ACS
Downloading feature geometry from the Census website.  To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
Using FIPS code '30' for state 'MT'
house_counties[25, "County"] <- "Lewis and Clark"              # Changes  "&" "and"

mt_counties <- mt_counties %>% 
  mutate(County = gsub(" County, Montana", "", NAME)) %>%      # Removes unnecessary words
  rename(Population = estimate)                                # Renames the 'estimate' to 'Population'
house_election <- mt_counties %>% 
  full_join(house_counties)
Joining, by = "County"
house_election %>%
  as_tibble() %>% 
  select(County, Population, Democrat, Republican, Libertarian, total_votes, Repub_advantage) %>% 
  datatable()
vote_colors <- colorNumeric(palette = "viridis", domain = house_election$Repub_advantage)

house_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1,
              fillColor = ~vote_colors(Repub_advantage), 
              label = ~paste0(County, ", Republican advantage = ", Repub_advantage),
              highlight = highlightOptions(weight = 2)) %>% 
  setView(-110, 47, zoom = 6) %>% 
  addLegend(pal = vote_colors, values = ~Repub_advantage)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'
house_election %>%
  plot_ly(x = ~Population, y = ~Repub_advantage) %>% 
  add_markers()
house_election %>%
  plot_ly(x = ~Population, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", 
                        County, "<br>", 
                        "Population: ", Population, "<br>", 
                        "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(marker = list(opacity = 0.7)) %>%
  layout(title = "Predicting Republican Vote Advantage from Population, by County",
         xaxis = list(title = "County population"),
         yaxis = list(title = "Republican vote advantage")) 
pop_model <- lm(Repub_advantage ~ Population, data = house_election)
summary(pop_model)

Call:
lm(formula = Repub_advantage ~ Population, data = house_election)

Residuals:
    Min      1Q  Median      3Q     Max 
-47.948 -15.782  -3.247  12.013  71.228 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -2.428e+01  4.084e+00  -5.946 2.08e-07 ***
Population   3.761e-04  1.100e-04   3.418  0.00121 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.44 on 54 degrees of freedom
Multiple R-squared:  0.1779,    Adjusted R-squared:  0.1626 
F-statistic: 11.68 on 1 and 54 DF,  p-value: 0.001207
tidy(pop_model)
glance(pop_model)
NA
house_election %>%
  plot_ly(x = ~Population, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", 
                        County, "<br>", 
                        "Population: ", Population, "<br>", 
                        "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(showlegend= F, marker = list(opacity = 0.7)) %>%
  layout(title = "Predicting Republican Vote Advantage from Population, by County",
         xaxis = list(title = "County population"),
         yaxis = list(title = "Republican vote advantage")) %>%
add_lines(y = ~fitted(pop_model)) 
house_election <- house_election %>% 
  mutate(Longitude = as_tibble(st_coordinates(st_centroid(house_election$geometry)))$X) %>% 
  mutate(Latitude = as_tibble(st_coordinates(st_centroid(house_election$geometry)))$Y)
st_centroid does not give correct centroids for longitude/latitude datast_centroid does not give correct centroids for longitude/latitude data
house_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1) %>% 
  setView(-110, 47, zoom = 6) %>% 
addCircleMarkers(~Longitude, ~Latitude)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'
house_election %>%
  plot_ly(x = ~Longitude, y = ~Repub_advantage) %>% 
  add_markers()
longitude_lm <- lm(Repub_advantage ~ Longitude, data = house_election)
tidy(longitude_lm)
glance(longitude_lm)
house_election %>% 
  plot_ly(x = ~Longitude, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", County, "<br>", "Longitude: ", Longitude, "<br>", "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(marker = list(opacity = 0.7), showlegend = F) %>%
  layout(title = "Predicting Republican Vote Advantage from Longitude, by County",
         xaxis = list(title = "County longitude"),
         yaxis = list(title = "Republican vote advantage")) %>% 
  add_lines(y = ~fitted(longitude_lm))
multiple_lm <- lm(Repub_advantage ~ Population + Longitude, data = house_election)
tidy(multiple_lm)
glance(multiple_lm)
house_election %>% 
  plot_ly(x = ~Longitude, y = ~Population, z = ~Repub_advantage, 
          text = ~County, hoverinfo = "text") %>% 
  add_markers(opacity = .7, showlegend = F)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKQXNzaWdubWVudDogMjAxNiBVUyBTZW5hdGUgTW9udGFuYSBlbGVjdGlvbjogVGVzdGVyL1Jvc2VuZGFsZQoKVGhlIFNlbmF0ZSBlbGVjdGlvbiBtYXkgYmUgYW4gZXZlbiBiZXR0ZXIgdGVzdCBvZiB0aGVzZSB0d28gaHlwb3RoZXNlcywgYmVjYXVzZSB0aGUgZWxlY3Rpb24gd2FzIGV2ZW4gY2xvc2VyIHRvIDUwLTUwLCBidXQgdGhpcyB0aW1lIFRlc3RlciB0aGUgRGVtb2NyYXQgd29uLgoKUnVuIHRocm91Z2ggdGhlIHNlbmF0ZSBlbGVjdGlvbiBhcyB3ZSBkaWQgYWJvdmUgd2l0aCB0aGUgaG91c2UgZWxlY3Rpb24uIFlvdSBjYW4gZ2V0IHRoZSBkYXRhIGZyb20gdGhlIHNhbWUgc3ByZWFkc2hlZXQsIGJ1dCBpdCdzIG9uIHNoZWV0ID0gMS4KCmBgYHtyfQpob3VzZV9jb3VudGllcyA8LSByZWFkX3hsc3goIlN0YXRld2lkZSBSZXN1bHRzLnhsc3giLCBzaGVldCA9IDEsIHJhbmdlID0gIkI3OkU2MyIpCmBgYAoKYGBge3J9CmdsaW1wc2UoaG91c2VfY291bnRpZXMpCmBgYAoKYGBge3J9CmhvdXNlX2NvdW50aWVzIDwtIGhvdXNlX2NvdW50aWVzICU+JSAKICByZW5hbWUoUmVwdWJsaWNhbiA9ICJKT04gVEVTVEVSXHJcbkRlbW9jcmF0IikgJT4lIAogIHJlbmFtZShEZW1vY3JhdCA9ICJNQVRUIFJPU0VOREFMRVxyXG5SZXB1YmxpY2FuIikgJT4lIAogIHJlbmFtZShMaWJlcnRhcmlhbiA9ICJSSUNLIEJSRUNLRU5SSURHRVxyXG5MaWJlcnRhcmlhbiIpIApgYGAKCgoKYGBge3J9CmdsaW1wc2UoaG91c2VfY291bnRpZXMpCmBgYAoKYGBge3J9CmhvdXNlX2NvdW50aWVzIDwtIGhvdXNlX2NvdW50aWVzICU+JSAKICBtdXRhdGUodG90YWxfdm90ZXMgPSBSZXB1YmxpY2FuICsgRGVtb2NyYXQgKyBMaWJlcnRhcmlhbikgJT4lIAogIG11dGF0ZShSZXB1Yl9hZHZhbnRhZ2UgPSBSZXB1YmxpY2FuL3RvdGFsX3ZvdGVzIC0gRGVtb2NyYXQvdG90YWxfdm90ZXMpICU+JSAKICBtdXRhdGUoUmVwdWJfYWR2YW50YWdlID0gcm91bmQoUmVwdWJfYWR2YW50YWdlKjEwMCwgMSkpCgpob3VzZV9jb3VudGllcyAlPiUgCiAgYXJyYW5nZSgtUmVwdWJfYWR2YW50YWdlKQpgYGAKCmBgYHtyfQptdF9jb3VudGllcyA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLAogICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9ICJCMDEwMDNfMDAxIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBUUlVFKSAKYGBgCgpgYGB7cn0KaG91c2VfY291bnRpZXNbMjUsICJDb3VudHkiXSA8LSAiTGV3aXMgYW5kIENsYXJrIiAgICAgICAgICAgICAgIyBDaGFuZ2VzICAiJiIgImFuZCIKCm10X2NvdW50aWVzIDwtIG10X2NvdW50aWVzICU+JSAKICBtdXRhdGUoQ291bnR5ID0gZ3N1YigiIENvdW50eSwgTW9udGFuYSIsICIiLCBOQU1FKSkgJT4lICAgICAgIyBSZW1vdmVzIHVubmVjZXNzYXJ5IHdvcmRzCiAgcmVuYW1lKFBvcHVsYXRpb24gPSBlc3RpbWF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUmVuYW1lcyB0aGUgJ2VzdGltYXRlJyB0byAnUG9wdWxhdGlvbicKYGBgCgpgYGB7cn0KaG91c2VfZWxlY3Rpb24gPC0gbXRfY291bnRpZXMgJT4lIAogIGZ1bGxfam9pbihob3VzZV9jb3VudGllcykKYGBgCmBgYHtyfQpob3VzZV9lbGVjdGlvbiAlPiUKICBhc190aWJibGUoKSAlPiUgCiAgc2VsZWN0KENvdW50eSwgUG9wdWxhdGlvbiwgRGVtb2NyYXQsIFJlcHVibGljYW4sIExpYmVydGFyaWFuLCB0b3RhbF92b3RlcywgUmVwdWJfYWR2YW50YWdlKSAlPiUgCiAgZGF0YXRhYmxlKCkKYGBgCgoKYGBge3J9CnZvdGVfY29sb3JzIDwtIGNvbG9yTnVtZXJpYyhwYWxldHRlID0gInZpcmlkaXMiLCBkb21haW4gPSBob3VzZV9lbGVjdGlvbiRSZXB1Yl9hZHZhbnRhZ2UpCgpob3VzZV9lbGVjdGlvbiAlPiUKICBsZWFmbGV0KCkgJT4lIAogIGFkZFRpbGVzKCkgJT4lCiAgYWRkUG9seWdvbnMod2VpZ2h0ID0gMSwKICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+dm90ZV9jb2xvcnMoUmVwdWJfYWR2YW50YWdlKSwgCiAgICAgICAgICAgICAgbGFiZWwgPSB+cGFzdGUwKENvdW50eSwgIiwgUmVwdWJsaWNhbiBhZHZhbnRhZ2UgPSAiLCBSZXB1Yl9hZHZhbnRhZ2UpLAogICAgICAgICAgICAgIGhpZ2hsaWdodCA9IGhpZ2hsaWdodE9wdGlvbnMod2VpZ2h0ID0gMikpICU+JSAKICBzZXRWaWV3KC0xMTAsIDQ3LCB6b29tID0gNikgJT4lIAogIGFkZExlZ2VuZChwYWwgPSB2b3RlX2NvbG9ycywgdmFsdWVzID0gflJlcHViX2FkdmFudGFnZSkKCmBgYAoKCgpgYGB7cn0KaG91c2VfZWxlY3Rpb24gJT4lCiAgcGxvdF9seSh4ID0gflBvcHVsYXRpb24sIHkgPSB+UmVwdWJfYWR2YW50YWdlKSAlPiUgCiAgYWRkX21hcmtlcnMoKQpgYGAKCgoKCmBgYHtyfQpob3VzZV9lbGVjdGlvbiAlPiUKICBwbG90X2x5KHggPSB+UG9wdWxhdGlvbiwgCiAgICAgICAgICB5ID0gflJlcHViX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50eSwgIjxicj4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb246ICIsIFBvcHVsYXRpb24sICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJSZXB1YmxpY2FuIGFkdmFudGFnZTogIiwgUmVwdWJfYWR2YW50YWdlKSkgJT4lIAogIGFkZF9tYXJrZXJzKG1hcmtlciA9IGxpc3Qob3BhY2l0eSA9IDAuNykpICU+JQogIGxheW91dCh0aXRsZSA9ICJQcmVkaWN0aW5nIFJlcHVibGljYW4gVm90ZSBBZHZhbnRhZ2UgZnJvbSBQb3B1bGF0aW9uLCBieSBDb3VudHkiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnR5IHBvcHVsYXRpb24iKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlcHVibGljYW4gdm90ZSBhZHZhbnRhZ2UiKSkgCmBgYAoKCgpgYGB7cn0KcG9wX21vZGVsIDwtIGxtKFJlcHViX2FkdmFudGFnZSB+IFBvcHVsYXRpb24sIGRhdGEgPSBob3VzZV9lbGVjdGlvbikKYGBgCgoKYGBge3J9CnN1bW1hcnkocG9wX21vZGVsKQpgYGAKCmBgYHtyfQp0aWR5KHBvcF9tb2RlbCkKZ2xhbmNlKHBvcF9tb2RlbCkKCmBgYAoKCmBgYHtyfQpob3VzZV9lbGVjdGlvbiAlPiUKICBwbG90X2x5KHggPSB+UG9wdWxhdGlvbiwgCiAgICAgICAgICB5ID0gflJlcHViX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50eSwgIjxicj4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb246ICIsIFBvcHVsYXRpb24sICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJSZXB1YmxpY2FuIGFkdmFudGFnZTogIiwgUmVwdWJfYWR2YW50YWdlKSkgJT4lIAogIGFkZF9tYXJrZXJzKHNob3dsZWdlbmQ9IEYsIG1hcmtlciA9IGxpc3Qob3BhY2l0eSA9IDAuNykpICU+JQogIGxheW91dCh0aXRsZSA9ICJQcmVkaWN0aW5nIFJlcHVibGljYW4gVm90ZSBBZHZhbnRhZ2UgZnJvbSBQb3B1bGF0aW9uLCBieSBDb3VudHkiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnR5IHBvcHVsYXRpb24iKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlcHVibGljYW4gdm90ZSBhZHZhbnRhZ2UiKSkgJT4lCmFkZF9saW5lcyh5ID0gfmZpdHRlZChwb3BfbW9kZWwpKSAKYGBgCgoKCmBgYHtyfQpob3VzZV9lbGVjdGlvbiA8LSBob3VzZV9lbGVjdGlvbiAlPiUgCiAgbXV0YXRlKExvbmdpdHVkZSA9IGFzX3RpYmJsZShzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZChob3VzZV9lbGVjdGlvbiRnZW9tZXRyeSkpKSRYKSAlPiUgCiAgbXV0YXRlKExhdGl0dWRlID0gYXNfdGliYmxlKHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKGhvdXNlX2VsZWN0aW9uJGdlb21ldHJ5KSkpJFkpCmBgYAoKYGBge3J9CmhvdXNlX2VsZWN0aW9uICU+JQogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyh3ZWlnaHQgPSAxKSAlPiUgCiAgc2V0VmlldygtMTEwLCA0Nywgem9vbSA9IDYpICU+JSAKYWRkQ2lyY2xlTWFya2Vycyh+TG9uZ2l0dWRlLCB+TGF0aXR1ZGUpCmBgYAoKCmBgYHtyfQpob3VzZV9lbGVjdGlvbiAlPiUKICBwbG90X2x5KHggPSB+TG9uZ2l0dWRlLCB5ID0gflJlcHViX2FkdmFudGFnZSkgJT4lIAogIGFkZF9tYXJrZXJzKCkKYGBgCgoKCmBgYHtyfQpsb25naXR1ZGVfbG0gPC0gbG0oUmVwdWJfYWR2YW50YWdlIH4gTG9uZ2l0dWRlLCBkYXRhID0gaG91c2VfZWxlY3Rpb24pCnRpZHkobG9uZ2l0dWRlX2xtKQpnbGFuY2UobG9uZ2l0dWRlX2xtKQpgYGAKCgoKYGBge3J9CmhvdXNlX2VsZWN0aW9uICU+JSAKICBwbG90X2x5KHggPSB+TG9uZ2l0dWRlLCAKICAgICAgICAgIHkgPSB+UmVwdWJfYWR2YW50YWdlLAogICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLCAKICAgICAgICAgIHRleHQgPSB+cGFzdGUoIkNvdW50eToiLCBDb3VudHksICI8YnI+IiwgIkxvbmdpdHVkZTogIiwgTG9uZ2l0dWRlLCAiPGJyPiIsICJSZXB1YmxpY2FuIGFkdmFudGFnZTogIiwgUmVwdWJfYWR2YW50YWdlKSkgJT4lIAogIGFkZF9tYXJrZXJzKG1hcmtlciA9IGxpc3Qob3BhY2l0eSA9IDAuNyksIHNob3dsZWdlbmQgPSBGKSAlPiUKICBsYXlvdXQodGl0bGUgPSAiUHJlZGljdGluZyBSZXB1YmxpY2FuIFZvdGUgQWR2YW50YWdlIGZyb20gTG9uZ2l0dWRlLCBieSBDb3VudHkiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnR5IGxvbmdpdHVkZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUmVwdWJsaWNhbiB2b3RlIGFkdmFudGFnZSIpKSAlPiUgCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKGxvbmdpdHVkZV9sbSkpCmBgYAoKCgpgYGB7cn0KbXVsdGlwbGVfbG0gPC0gbG0oUmVwdWJfYWR2YW50YWdlIH4gUG9wdWxhdGlvbiArIExvbmdpdHVkZSwgZGF0YSA9IGhvdXNlX2VsZWN0aW9uKQp0aWR5KG11bHRpcGxlX2xtKQpnbGFuY2UobXVsdGlwbGVfbG0pCmBgYAoKCgpgYGB7cn0KaG91c2VfZWxlY3Rpb24gJT4lIAogIHBsb3RfbHkoeCA9IH5Mb25naXR1ZGUsIHkgPSB+UG9wdWxhdGlvbiwgeiA9IH5SZXB1Yl9hZHZhbnRhZ2UsIAogICAgICAgICAgdGV4dCA9IH5Db3VudHksIGhvdmVyaW5mbyA9ICJ0ZXh0IikgJT4lIAogIGFkZF9tYXJrZXJzKG9wYWNpdHkgPSAuNywgc2hvd2xlZ2VuZCA9IEYpCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK