Skip to content

Instantly share code, notes, and snippets.

@ljwolf
Created November 29, 2016 05:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ljwolf/4fe787c821f954075850edc182c6efe6 to your computer and use it in GitHub Desktop.
Save ljwolf/4fe787c821f954075850edc182c6efe6 to your computer and use it in GitHub Desktop.
This is a short exploration of the potential spatial structure of the 2012-2016 electoral swing. You'll need pandas, numpy, cenpy, pysal, and seaborn installed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One of the components of my dissertation work is to examine whether even *generalized* uniform partisan swing assumptions work for the counterfactual inference engines driving various electoral analysis models. I'm doing this both by looking at empirically-experienced swings, the change in vote share between two elections, as well as looking at how simulations based on uncorrelated partisan swings, like those used in some common gerrymandering analysis routines (like `JudgeIt`), recover observed patterns of swing. \n",
"\n",
"One simple way to do this is to see what the correlation structure looks like for real swings. Here, I'll take a look at the county level. My dissertation focuses almost exclusively on the congressional district level."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we'll grab some packages."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import pandas as pd #pandas, dataframes for python\n",
"import numpy as np #numpy, arrays & numerics\n",
"import pysal as ps #pysal, the spatial analysis library\n",
"import cenpy as cen #cenpy, the python version of ACS.R\n",
"import matplotlib.pyplot as plt #matplotlib for basic plotting\n",
"import seaborn as sns #seaborn for styling\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, I like to run light, so let's grab some data on the fly from the ACS API endpoint using [cenpy](https://github.com/ljwolf/cenpy). Cenpy automatically scrapes the data products made available from the US Census. We can see all of the products we can use in the ACS by looking at the `cenpy.explorer.available()` output:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"{u'2011acs5': u'2011 American Community Survey: 5-Year Estimates',\n",
" u'2012acs1': u'2012 American Community Survey: 1-Year Estimates',\n",
" u'2012acs1profile': u'2012 American Community Survey: 1-Year Profile Tables',\n",
" u'2012acs3': u'2012 American Community Survey: 3-Year Estimates',\n",
" u'2012acs3profile': u'2012 American Community Survey: 3-Year Profile Tables',\n",
" u'2012acs5profile': u'2012 American Community Survey: 5-Year Profile Tables',\n",
" u'ACSCD1132011': u'2011 American Community Survey 1-Year Profiles for the 113th Congressional Districts',\n",
" u'ACSCP1Y2015': u'2015 American Community Survey Comparison Profile',\n",
" u'ACSFlows2009': u'2005-2009 American Community Survey: Migration Flows',\n",
" u'ACSFlows2010': u'2006-2010 American Community Survey: Migration Flows',\n",
" u'ACSFlows2011': u'2007-2011 American Community Survey: Migration Flows',\n",
" u'ACSFlows2012': u'2008-2012 American Community Survey: Migration Flows',\n",
" u'ACSFlows2013': u'2009-2013 American Community Survey: Migration Flows',\n",
" u'ACSFlows2014': u'2010-2014 American Community Survey: Migration Flows',\n",
" u'ACSLANG5Y2013': u'2013 American Community Survey - Table Packages: Detailed Language Spoken in the U.S.',\n",
" u'ACSProfile2013': u'2013 American Community Survey - Data Profiles: 1-Year Data Profile',\n",
" u'ACSProfile2014': u'2014 American Community Survey 1-Year Profiles',\n",
" u'ACSProfile2015': u'2015 American Community Survey 1-Year Profiles',\n",
" u'ACSProfile3Y2013': u'2011-2013 American Community Survey - Data Profiles: 3-Year Data Profile',\n",
" u'ACSProfile5Y2013': u'2009-2013 American Community Survey 5-Year Profiles',\n",
" u'ACSProfile5Y2014': u'2010-2014 American Community Survey 5-Year Profiles',\n",
" u'ACSSE2014': u'2014 American Community Survey Supplemental Estimates',\n",
" u'ACSSE2015': u'2015 American Community Survey Supplemental Estimates',\n",
" u'ACSSF1Y2015': u'2015 American Community Survey 1-Year Estimates',\n",
" u'ACSSF2013': u'2013 American Community Survey - Summarized Data: 1-Year Summary File',\n",
" u'ACSSF2014': u'2014 American Community Survey 1-Year Estimates',\n",
" u'ACSSF3Y2013': u'2011-2013 American Community Survey - Summarized Data: 3-Year Summary File',\n",
" u'ACSSF5Y2009': u'2005-2009 American Community Survey 5-Year Estimates',\n",
" u'ACSSF5Y2010': u'2006-2010 American Community Survey 5-Year Estimates',\n",
" u'ACSSF5Y2012': u'2008-2012 American Community Survey - Summarized Data: 5-Year Summary File',\n",
" u'ACSSF5Y2013': u'2009-2013 American Community Survey 5-Year Estimates',\n",
" u'ACSSF5Y2014': u'2010-2014 American Community Survey 5-Year Estimates',\n",
" u'ACSST1Y2015': u'2015 American Community Survey Subject Tables'}"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"{k:v for k,v in cen.explorer.available(verbose=True).items() if 'acs' in k.lower()}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then, we'll establish a connection. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"cxn = cen.base.Connection('ACSProfile5Y2014')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For reference, this is the base URL of the connection:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"u'http://api.census.gov/data/2014/acs5/profile?'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cxn.cxn"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll grab a few covariates. For this, I'll pull down race, ethnicity, median income, and manufacturing employment. This isn't the richest set of demographics we could use, but for this exploration, it should provide a useful enough set of controls."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>concept</th>\n",
" <th>label</th>\n",
" <th>predicateOnly</th>\n",
" <th>predicateType</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>DP05_0033E</th>\n",
" <td>ACS DEMOGRAPHIC AND HOUSING ESTIMATES</td>\n",
" <td>RACE!!One race!!Black or African American</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DP05_0033M</th>\n",
" <td>ACS DEMOGRAPHIC AND HOUSING ESTIMATES</td>\n",
" <td>RACE!!One race!!Black or African American</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DP05_0033PE</th>\n",
" <td>ACS DEMOGRAPHIC AND HOUSING ESTIMATES</td>\n",
" <td>RACE!!One race!!Black or African American</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DP05_0033PM</th>\n",
" <td>ACS DEMOGRAPHIC AND HOUSING ESTIMATES</td>\n",
" <td>RACE!!One race!!Black or African American</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" concept \\\n",
"DP05_0033E ACS DEMOGRAPHIC AND HOUSING ESTIMATES \n",
"DP05_0033M ACS DEMOGRAPHIC AND HOUSING ESTIMATES \n",
"DP05_0033PE ACS DEMOGRAPHIC AND HOUSING ESTIMATES \n",
"DP05_0033PM ACS DEMOGRAPHIC AND HOUSING ESTIMATES \n",
"\n",
" label predicateOnly \\\n",
"DP05_0033E RACE!!One race!!Black or African American NaN \n",
"DP05_0033M RACE!!One race!!Black or African American NaN \n",
"DP05_0033PE RACE!!One race!!Black or African American NaN \n",
"DP05_0033PM RACE!!One race!!Black or African American NaN \n",
"\n",
" predicateType \n",
"DP05_0033E int \n",
"DP05_0033M int \n",
"DP05_0033PE int \n",
"DP05_0033PM int "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cxn.variables.ix[cxn.varslike('^DP05_0033')] #cxn.varslike gives columns that match a regexp"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>concept</th>\n",
" <th>label</th>\n",
" <th>predicateOnly</th>\n",
" <th>predicateType</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>DP05_0018E</th>\n",
" <td>ACS DEMOGRAPHIC AND HOUSING ESTIMATES</td>\n",
" <td>SEX AND AGE!!Total population!!18 years and over</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DP05_0018M</th>\n",
" <td>ACS DEMOGRAPHIC AND HOUSING ESTIMATES</td>\n",
" <td>SEX AND AGE!!Total population!!18 years and over</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DP05_0018PE</th>\n",
" <td>ACS DEMOGRAPHIC AND HOUSING ESTIMATES</td>\n",
" <td>SEX AND AGE!!Total population!!18 years and over</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DP05_0018PM</th>\n",
" <td>ACS DEMOGRAPHIC AND HOUSING ESTIMATES</td>\n",
" <td>SEX AND AGE!!Total population!!18 years and over</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" concept \\\n",
"DP05_0018E ACS DEMOGRAPHIC AND HOUSING ESTIMATES \n",
"DP05_0018M ACS DEMOGRAPHIC AND HOUSING ESTIMATES \n",
"DP05_0018PE ACS DEMOGRAPHIC AND HOUSING ESTIMATES \n",
"DP05_0018PM ACS DEMOGRAPHIC AND HOUSING ESTIMATES \n",
"\n",
" label predicateOnly \\\n",
"DP05_0018E SEX AND AGE!!Total population!!18 years and over NaN \n",
"DP05_0018M SEX AND AGE!!Total population!!18 years and over NaN \n",
"DP05_0018PE SEX AND AGE!!Total population!!18 years and over NaN \n",
"DP05_0018PM SEX AND AGE!!Total population!!18 years and over NaN \n",
"\n",
" predicateType \n",
"DP05_0018E int \n",
"DP05_0018M int \n",
"DP05_0018PE int \n",
"DP05_0018PM int "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cxn.variables.ix[cxn.varslike('^DP05_0018')]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sometimes, the column names are too long for easy display in the notebook, so we can just peel off the `label` column, which provides more thorough information about the data."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[u'HISPANIC OR LATINO AND RACE!!Total population!!Hispanic or Latino (of any race)',\n",
" u'HISPANIC OR LATINO AND RACE!!Total population!!Hispanic or Latino (of any race)',\n",
" u'HISPANIC OR LATINO AND RACE!!Total population!!Hispanic or Latino (of any race)',\n",
" u'HISPANIC OR LATINO AND RACE!!Total population!!Hispanic or Latino (of any race)']"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cxn.variables.ix[cxn.varslike('^DP05_0066')].label.tolist()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>concept</th>\n",
" <th>label</th>\n",
" <th>predicateOnly</th>\n",
" <th>predicateType</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>DP03_0062E</th>\n",
" <td>SELECTED ECONOMIC CHARACTERISTICS</td>\n",
" <td>INCOME AND BENEFITS (IN 2014 INFLATION-ADJUSTE...</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DP03_0062M</th>\n",
" <td>SELECTED ECONOMIC CHARACTERISTICS</td>\n",
" <td>INCOME AND BENEFITS (IN 2014 INFLATION-ADJUSTE...</td>\n",
" <td>NaN</td>\n",
" <td>int</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" concept \\\n",
"DP03_0062E SELECTED ECONOMIC CHARACTERISTICS \n",
"DP03_0062M SELECTED ECONOMIC CHARACTERISTICS \n",
"\n",
" label predicateOnly \\\n",
"DP03_0062E INCOME AND BENEFITS (IN 2014 INFLATION-ADJUSTE... NaN \n",
"DP03_0062M INCOME AND BENEFITS (IN 2014 INFLATION-ADJUSTE... NaN \n",
"\n",
" predicateType \n",
"DP03_0062E int \n",
"DP03_0062M int "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cxn.variables.ix[cxn.varslike('^DP03_0062')]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[u'INDUSTRY!!Civilian employed population 16 years and over!!Manufacturing',\n",
" u'INDUSTRY!!Civilian employed population 16 years and over!!Manufacturing',\n",
" u'INDUSTRY!!Civilian employed population 16 years and over!!Manufacturing',\n",
" u'INDUSTRY!!Civilian employed population 16 years and over!!Manufacturing']"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cxn.variables.ix[cxn.varslike('^DP03_0035')].label.tolist()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To actually conduct the query, we can use the `cxn.query` function to grab a dataframe containing our requested attributes at the given level of analysis. "
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ljw/anaconda3/envs/py2/lib/python2.7/site-packages/cenpy/remote.py:167: FutureWarning: convert_objects is deprecated. Use the data-type specific converters pd.to_datetime, pd.to_timedelta and pd.to_numeric.\n",
" df[cols] = df[cols].convert_objects(convert_numeric=convert_numeric)\n"
]
}
],
"source": [
"demographics = cxn.query(cols=['DP05_0033PE', 'DP05_0066PE', 'DP05_0018E', 'DP03_0062E', 'DP03_0035PE'],\n",
" geo_unit='county:*')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This reads the data from the census API endpoint and stores it in a pandas dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DP05_0033PE</th>\n",
" <th>DP05_0066PE</th>\n",
" <th>DP05_0018E</th>\n",
" <th>DP03_0062E</th>\n",
" <th>DP03_0035PE</th>\n",
" <th>state</th>\n",
" <th>county</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>18.6</td>\n",
" <td>2.5</td>\n",
" <td>40922</td>\n",
" <td>52475</td>\n",
" <td>13.2</td>\n",
" <td>01</td>\n",
" <td>001</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9.4</td>\n",
" <td>4.5</td>\n",
" <td>148019</td>\n",
" <td>50183</td>\n",
" <td>9.1</td>\n",
" <td>01</td>\n",
" <td>003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>46.3</td>\n",
" <td>4.7</td>\n",
" <td>21257</td>\n",
" <td>35634</td>\n",
" <td>21.3</td>\n",
" <td>01</td>\n",
" <td>005</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>21.2</td>\n",
" <td>2.0</td>\n",
" <td>17750</td>\n",
" <td>37984</td>\n",
" <td>18.6</td>\n",
" <td>01</td>\n",
" <td>007</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1.5</td>\n",
" <td>8.5</td>\n",
" <td>43768</td>\n",
" <td>44409</td>\n",
" <td>17.4</td>\n",
" <td>01</td>\n",
" <td>009</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" DP05_0033PE DP05_0066PE DP05_0018E DP03_0062E DP03_0035PE state county\n",
"0 18.6 2.5 40922 52475 13.2 01 001\n",
"1 9.4 4.5 148019 50183 9.1 01 003\n",
"2 46.3 4.7 21257 35634 21.3 01 005\n",
"3 21.2 2.0 17750 37984 18.6 01 007\n",
"4 1.5 8.5 43768 44409 17.4 01 009"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"demographics.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's use a bit more descriptive column names"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"demographics.columns = ['afam_pct', 'hisp_pct', 'over_18', 'median_income', 'manuf_pct', 'state', 'county']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And, maybe we'll do some transformations of the data to make it better behaved. For example, the income and population over 18 should probably get log-transformed. And, since the african american and hispanic population percentages are pretty skewed, I've used a logit transformation below to regularize them somewhat. "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ljw/anaconda3/envs/py2/lib/python2.7/site-packages/ipykernel/__main__.py:4: RuntimeWarning: invalid value encountered in log\n"
]
}
],
"source": [
"demographics['log(med_income)'] = np.log(demographics.median_income)\n",
"demographics['log(over_18)'] = np.log(demographics.over_18 + 1)\n",
"demographics['afam_logit'] = np.log((demographics.afam_pct+.01)*.01 / ((1 - (demographics.afam_pct+.01)*.01)))\n",
"demographics['hisp_logit'] = np.log((demographics.hisp_pct+.01)*.01 / ((1 - (demographics.hisp_pct+.01)*.01)))\n",
"demographics['manuf_logit'] = np.log((demographics.manuf_pct+.01)*.01 / ((1 - (demographics.manuf_pct+.01)*.01)))\n",
"demographics['fullfips'] = demographics.state + demographics.county"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ljw/anaconda3/envs/py2/lib/python2.7/site-packages/IPython/core/interactiveshell.py:2881: UserWarning: To output multiple subplots, the figure containing the passed axes is being cleared\n",
" exec(code_obj, self.user_global_ns, self.user_ns)\n"
]
},
{
"data": {
"image/png": "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\nAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f05306a6490>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"f = plt.figure(figsize=(1.6*5*2,2))\n",
"ax = plt.gca()\n",
"demographics[['log(med_income)', 'log(over_18)',\\\n",
" 'afam_logit', 'hisp_logit', 'manuf_logit']].hist(bins=20, layout=(1,5), ax=ax)\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then, we'll read in a table of the election results at the county-level put together by Github user [@tonmcg](https://github.com/tonmcg). "
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"votes = pd.read_csv('https://raw.githubusercontent.com/tonmcg/'\n",
" 'County_Level_Election_Results_12-16/master/'\n",
" 'US_County_Level_Presidential_Results_08-16.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, I want to see how effective our model is spatially. To do this, I'll need the actual county geometries. Fortunately, this data ships inside of `PySAL`'s examples. "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"NAT = ps.pdio.read_files(ps.examples.get_path('NAT.shp'))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>FIPS</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>27077</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052dc0f...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>53019</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052dc66...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>53065</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052d4dc...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>53047</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052dbf5...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>53051</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052d4f8...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" FIPS geometry\n",
"0 27077 <pysal.cg.shapes.Polygon object at 0x7f052dc0f...\n",
"1 53019 <pysal.cg.shapes.Polygon object at 0x7f052dc66...\n",
"2 53065 <pysal.cg.shapes.Polygon object at 0x7f052d4dc...\n",
"3 53047 <pysal.cg.shapes.Polygon object at 0x7f052dbf5...\n",
"4 53051 <pysal.cg.shapes.Polygon object at 0x7f052d4f8..."
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"NAT.head()[['FIPS','geometry']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With everything together, we'll need to do some joining:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>fips_code</th>\n",
" <th>county</th>\n",
" <th>total_2008</th>\n",
" <th>dem_2008</th>\n",
" <th>gop_2008</th>\n",
" <th>oth_2008</th>\n",
" <th>total_2012</th>\n",
" <th>dem_2012</th>\n",
" <th>gop_2012</th>\n",
" <th>oth_2012</th>\n",
" <th>total_2016</th>\n",
" <th>dem_2016</th>\n",
" <th>gop_2016</th>\n",
" <th>oth_2016</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>26041</td>\n",
" <td>Delta County</td>\n",
" <td>19064</td>\n",
" <td>9974</td>\n",
" <td>8763</td>\n",
" <td>327</td>\n",
" <td>18043</td>\n",
" <td>8330</td>\n",
" <td>9533</td>\n",
" <td>180</td>\n",
" <td>18467</td>\n",
" <td>6431</td>\n",
" <td>11112</td>\n",
" <td>924</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>48295</td>\n",
" <td>Lipscomb County</td>\n",
" <td>1256</td>\n",
" <td>155</td>\n",
" <td>1093</td>\n",
" <td>8</td>\n",
" <td>1168</td>\n",
" <td>119</td>\n",
" <td>1044</td>\n",
" <td>5</td>\n",
" <td>1322</td>\n",
" <td>135</td>\n",
" <td>1159</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1127</td>\n",
" <td>Walker County</td>\n",
" <td>28652</td>\n",
" <td>7420</td>\n",
" <td>20722</td>\n",
" <td>510</td>\n",
" <td>28497</td>\n",
" <td>6551</td>\n",
" <td>21633</td>\n",
" <td>313</td>\n",
" <td>29243</td>\n",
" <td>4486</td>\n",
" <td>24208</td>\n",
" <td>549</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>48389</td>\n",
" <td>Reeves County</td>\n",
" <td>3077</td>\n",
" <td>1606</td>\n",
" <td>1445</td>\n",
" <td>26</td>\n",
" <td>2867</td>\n",
" <td>1649</td>\n",
" <td>1185</td>\n",
" <td>33</td>\n",
" <td>3184</td>\n",
" <td>1659</td>\n",
" <td>1417</td>\n",
" <td>108</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>56017</td>\n",
" <td>Hot Springs County</td>\n",
" <td>2546</td>\n",
" <td>619</td>\n",
" <td>1834</td>\n",
" <td>93</td>\n",
" <td>2495</td>\n",
" <td>523</td>\n",
" <td>1894</td>\n",
" <td>78</td>\n",
" <td>2535</td>\n",
" <td>400</td>\n",
" <td>1939</td>\n",
" <td>196</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" fips_code county total_2008 dem_2008 gop_2008 oth_2008 \\\n",
"0 26041 Delta County 19064 9974 8763 327 \n",
"1 48295 Lipscomb County 1256 155 1093 8 \n",
"2 1127 Walker County 28652 7420 20722 510 \n",
"3 48389 Reeves County 3077 1606 1445 26 \n",
"4 56017 Hot Springs County 2546 619 1834 93 \n",
"\n",
" total_2012 dem_2012 gop_2012 oth_2012 total_2016 dem_2016 gop_2016 \\\n",
"0 18043 8330 9533 180 18467 6431 11112 \n",
"1 1168 119 1044 5 1322 135 1159 \n",
"2 28497 6551 21633 313 29243 4486 24208 \n",
"3 2867 1649 1185 33 3184 1659 1417 \n",
"4 2495 523 1894 78 2535 400 1939 \n",
"\n",
" oth_2016 \n",
"0 924 \n",
"1 28 \n",
"2 549 \n",
"3 108 \n",
"4 196 "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"votes.head()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>afam_pct</th>\n",
" <th>hisp_pct</th>\n",
" <th>over_18</th>\n",
" <th>median_income</th>\n",
" <th>manuf_pct</th>\n",
" <th>state</th>\n",
" <th>county</th>\n",
" <th>log(med_income)</th>\n",
" <th>log(over_18)</th>\n",
" <th>afam_logit</th>\n",
" <th>hisp_logit</th>\n",
" <th>manuf_logit</th>\n",
" <th>fullfips</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>18.6</td>\n",
" <td>2.5</td>\n",
" <td>40922</td>\n",
" <td>52475</td>\n",
" <td>13.2</td>\n",
" <td>01</td>\n",
" <td>001</td>\n",
" <td>10.868092</td>\n",
" <td>10.619448</td>\n",
" <td>-1.475553</td>\n",
" <td>-3.659467</td>\n",
" <td>-1.882517</td>\n",
" <td>01001</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>9.4</td>\n",
" <td>4.5</td>\n",
" <td>148019</td>\n",
" <td>50183</td>\n",
" <td>9.1</td>\n",
" <td>01</td>\n",
" <td>003</td>\n",
" <td>10.823432</td>\n",
" <td>11.905103</td>\n",
" <td>-2.264571</td>\n",
" <td>-3.052724</td>\n",
" <td>-2.300277</td>\n",
" <td>01003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>46.3</td>\n",
" <td>4.7</td>\n",
" <td>21257</td>\n",
" <td>35634</td>\n",
" <td>21.3</td>\n",
" <td>01</td>\n",
" <td>005</td>\n",
" <td>10.481056</td>\n",
" <td>9.964489</td>\n",
" <td>-0.147869</td>\n",
" <td>-3.007237</td>\n",
" <td>-1.306340</td>\n",
" <td>01005</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>21.2</td>\n",
" <td>2.0</td>\n",
" <td>17750</td>\n",
" <td>37984</td>\n",
" <td>18.6</td>\n",
" <td>01</td>\n",
" <td>007</td>\n",
" <td>10.544920</td>\n",
" <td>9.784197</td>\n",
" <td>-1.312313</td>\n",
" <td>-3.886731</td>\n",
" <td>-1.475553</td>\n",
" <td>01007</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1.5</td>\n",
" <td>8.5</td>\n",
" <td>43768</td>\n",
" <td>44409</td>\n",
" <td>17.4</td>\n",
" <td>01</td>\n",
" <td>009</td>\n",
" <td>10.701197</td>\n",
" <td>10.686681</td>\n",
" <td>-4.177845</td>\n",
" <td>-2.374988</td>\n",
" <td>-1.556844</td>\n",
" <td>01009</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" afam_pct hisp_pct over_18 median_income manuf_pct state county \\\n",
"0 18.6 2.5 40922 52475 13.2 01 001 \n",
"1 9.4 4.5 148019 50183 9.1 01 003 \n",
"2 46.3 4.7 21257 35634 21.3 01 005 \n",
"3 21.2 2.0 17750 37984 18.6 01 007 \n",
"4 1.5 8.5 43768 44409 17.4 01 009 \n",
"\n",
" log(med_income) log(over_18) afam_logit hisp_logit manuf_logit fullfips \n",
"0 10.868092 10.619448 -1.475553 -3.659467 -1.882517 01001 \n",
"1 10.823432 11.905103 -2.264571 -3.052724 -2.300277 01003 \n",
"2 10.481056 9.964489 -0.147869 -3.007237 -1.306340 01005 \n",
"3 10.544920 9.784197 -1.312313 -3.886731 -1.475553 01007 \n",
"4 10.701197 10.686681 -4.177845 -2.374988 -1.556844 01009 "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"demographics.head()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"demographics['fips_code'] = demographics.fullfips.apply(int)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"data = pd.merge(demographics, votes, on='fips_code', how='right')"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"NAT['fips_code'] = NAT.FIPS.apply(int)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"geodata = pd.merge(data, NAT, how='inner', on='fips_code')"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"W = ps.weights.Queen.from_dataframe(geodata)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"sfes = pd.get_dummies(geodata.STATE_NAME)\n",
"geodata=pd.concat((geodata, sfes), axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"geodata = geodata[['STATE_NAME', 'NAME'] + [col for col in votes if col.startswith('dem') or col.startswith('gop')]\n",
" + ['afam_logit', 'hisp_logit', 'manuf_logit', 'log(over_18)', 'log(med_income)']\n",
" + sfes.columns.tolist()\n",
" + ['geometry']]"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>STATE_NAME</th>\n",
" <th>NAME</th>\n",
" <th>dem_2008</th>\n",
" <th>gop_2008</th>\n",
" <th>dem_2012</th>\n",
" <th>gop_2012</th>\n",
" <th>dem_2016</th>\n",
" <th>gop_2016</th>\n",
" <th>afam_logit</th>\n",
" <th>hisp_logit</th>\n",
" <th>...</th>\n",
" <th>Tennessee</th>\n",
" <th>Texas</th>\n",
" <th>Utah</th>\n",
" <th>Vermont</th>\n",
" <th>Virginia</th>\n",
" <th>Washington</th>\n",
" <th>West Virginia</th>\n",
" <th>Wisconsin</th>\n",
" <th>Wyoming</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Alabama</td>\n",
" <td>Autauga</td>\n",
" <td>6093</td>\n",
" <td>17403</td>\n",
" <td>6354</td>\n",
" <td>17366</td>\n",
" <td>5908</td>\n",
" <td>18110</td>\n",
" <td>-1.475553</td>\n",
" <td>-3.659467</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052cc06...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Alabama</td>\n",
" <td>Baldwin</td>\n",
" <td>19386</td>\n",
" <td>61271</td>\n",
" <td>18329</td>\n",
" <td>65772</td>\n",
" <td>18409</td>\n",
" <td>72780</td>\n",
" <td>-2.264571</td>\n",
" <td>-3.052724</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052cb43...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Alabama</td>\n",
" <td>Barbour</td>\n",
" <td>5697</td>\n",
" <td>5866</td>\n",
" <td>5873</td>\n",
" <td>5539</td>\n",
" <td>4848</td>\n",
" <td>5431</td>\n",
" <td>-0.147869</td>\n",
" <td>-3.007237</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052cbd5...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Alabama</td>\n",
" <td>Bibb</td>\n",
" <td>2299</td>\n",
" <td>6262</td>\n",
" <td>2200</td>\n",
" <td>6131</td>\n",
" <td>1874</td>\n",
" <td>6733</td>\n",
" <td>-1.312313</td>\n",
" <td>-3.886731</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052cc52...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Alabama</td>\n",
" <td>Blount</td>\n",
" <td>3522</td>\n",
" <td>20389</td>\n",
" <td>2961</td>\n",
" <td>20741</td>\n",
" <td>2150</td>\n",
" <td>22808</td>\n",
" <td>-4.177845</td>\n",
" <td>-2.374988</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>&lt;pysal.cg.shapes.Polygon object at 0x7f052cca7...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 63 columns</p>\n",
"</div>"
],
"text/plain": [
" STATE_NAME NAME dem_2008 gop_2008 dem_2012 gop_2012 dem_2016 \\\n",
"0 Alabama Autauga 6093 17403 6354 17366 5908 \n",
"1 Alabama Baldwin 19386 61271 18329 65772 18409 \n",
"2 Alabama Barbour 5697 5866 5873 5539 4848 \n",
"3 Alabama Bibb 2299 6262 2200 6131 1874 \n",
"4 Alabama Blount 3522 20389 2961 20741 2150 \n",
"\n",
" gop_2016 afam_logit hisp_logit \\\n",
"0 18110 -1.475553 -3.659467 \n",
"1 72780 -2.264571 -3.052724 \n",
"2 5431 -0.147869 -3.007237 \n",
"3 6733 -1.312313 -3.886731 \n",
"4 22808 -4.177845 -2.374988 \n",
"\n",
" ... Tennessee Texas Utah \\\n",
"0 ... 0 0 0 \n",
"1 ... 0 0 0 \n",
"2 ... 0 0 0 \n",
"3 ... 0 0 0 \n",
"4 ... 0 0 0 \n",
"\n",
" Vermont Virginia Washington West Virginia Wisconsin Wyoming \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" geometry \n",
"0 <pysal.cg.shapes.Polygon object at 0x7f052cc06... \n",
"1 <pysal.cg.shapes.Polygon object at 0x7f052cb43... \n",
"2 <pysal.cg.shapes.Polygon object at 0x7f052cbd5... \n",
"3 <pysal.cg.shapes.Polygon object at 0x7f052cc52... \n",
"4 <pysal.cg.shapes.Polygon object at 0x7f052cca7... \n",
"\n",
"[5 rows x 63 columns]"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"geodata.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the end, we have the data all stored together in a table. I'm going to compute the Two-Party vote share for Democrats, and analyze the change between 2012 and 2016 using these two-party vote share numbers. "
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"geodata['tpv_2008'] = geodata['dem_2008'] / (geodata['dem_2008'] + geodata['gop_2008'])\n",
"geodata['tpv_2012'] = geodata['dem_2012'] / (geodata['dem_2012'] + geodata['gop_2012'])\n",
"geodata['tpv_2016'] = geodata['dem_2016'] / (geodata['dem_2016'] + geodata['gop_2016'])"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"geodata['change_2012'] = geodata.tpv_2012 - geodata.tpv_2008\n",
"geodata['change_2016'] = geodata.tpv_2016 - geodata.tpv_2012"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f052da5acd0>,\n",
" <matplotlib.axes._subplots.AxesSubplot object at 0x7f052c5d6110>]], dtype=object)"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nncwoLG1TBnaQVINUP0/pvehmUqyu2DZIben7QdJREBIRH6E8O2PfLd1ulZm3RcQvKU8T/Cali21u\nRIy2nPUsrtZR/fu4ljJHgMc0pdmiWbNmMTa2jvHxTe1u0pWRkdmMjs6zTMucMWU2yhuEpgDkd4E/\naZk2e2DtAvSvbejX5zfT8u1n3tZ5MHkPqm2YdhBSBSCvAP44M29vI/0TgUWUmfOgTNe7kTK6vXkA\n2lLg6irN1cCCiNit6frv/pSo7Jrp1Hd8fBMbNw7mB8QyLXMml9lPTQHITsALMnN1S5KBtgvQ3/e4\nX3nPtHz7mbd1Hlze/TStICQiPgq8Fng5sLaa9hbggcz8dfUMgJMoY0JWUno/GlNdLwfIzLGIOAdY\nFhGrgTWUQUxXZua1VZqbI2I5cHZEHEm5Fe/DwGcdAS8Nn+rY35mHu293iohnUQat301pE55Nmd/j\nEU1tx32Z+aDtgrRtmm5PyBGUa7mXtyw/lDKV9ThleutDKKPf76IEH/8vMx9sSn98lfYCyqREl1Cm\n7W12MGVSokspkxJdABw3zfpKGow9KJdbN1d/H6iWf5oyP8if85tPKZ1VvX4B5fkaYLsgbXOmFYRk\n5pRP3a1myXtxG/msB46t/iZLcz9OQCTNCJl5BVM/lXuLT+y2XZC2PVtsGCRJkvrBIESSJNXCIESS\nJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXC\nIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESS\nJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXC\nIESSJNViTt0VkCTNDBs2bGDFihvaSjsyMpvR0XmMja1jfHzThGme/vRnMHfu3F5WUTOMQYgkqS0r\nVtzACcu+wPxFS7vOa829t3Pam2G33XbvQc00UxmESJLaNn/RUhYs2aXuamgr4ZgQSZJUC4MQSZJU\nC4MQSZJUC4MQSZJUC4MQSZJUC4MQSZJUC2/RldS1iNgXeCuwO/B44JWZ+eWWNKcAhwMLgCuBIzPz\n1qb12wHLgAOB7YDlwFGZeU9TmoXAR4CXAZuAC4HjMnNt//ZOUr/YEyKpF3YAfgAcBWxuXRkRJwLH\nAG8C9gTWAssjonm6zNOBA4BXA/sBO1KCjGbnAbsC+1dp9wPO6uWOSBoce0IkdS0zLwEuAYiIWRMk\nOQ44NTMvqtIcAqwCXgmcHxGjwGHAQZl5RZXmUOCmiNgzM6+NiF2BFwG7Z+b1VZpjga9GxFsyc2V/\n91JSr9kTIqmvIuIpwBLgssayzBwDrgH2qRbtQTkpak6TwO1NafYGVjcCkMqllJ6XvfpVf0n9Y0+I\npH5bQgkUVrUsX1WtA1gMbKiCk8nSLAHuaV6ZmeMRcV9TmraNjPT+HKyRZ6/zHpZ8+1H+nDnTy7Nf\n70U/857Jde43gxBJ26TR0XkzLu+68+11+aOj81i4cIeOt+2Xut/nYcu7nwxCJPXbSmAWpbejuTdk\nMXB9U5q5ETHa0huyuFrXSPO45owjYgR4TFOatk31iPlOtfP4+pmc79jYup6V3chv9erp3djUr/ei\nn3nP5Dr3m0HINmjDhg2sWHFDx9uPjMxm33337mGNtDXLzNsiYiXljpYfAVQDUfcCzqySXQdsrNJ8\nsUoTwFLg6irN1cCCiNitaVzI/pQA55rp1mt8fBMbN/b2B6Hfededb69/QLvZHz+/weXdTwYh26AV\nK27ghGVfYP6ipR1tv+be2zl7dB477/y0HtdMM1VE7ADsTAkIAHaKiGcB92XmHZTbb98ZEbcCPwNO\nBe4EvgRloGpEnAMsi4jVwBrgDODKzLy2SnNzRCwHzo6II4G5wIeBz3pnjDQzGYRso+YvWsqCJbvU\nXQ1tPfYAvkkZgLoZ+EC1/NPAYZl5WkRsT5nTYwHwbeAlmbmhKY/jgXHgAspkZZcAR7eUczBlsrJL\nKZOVXUC5/VfSDDStICQi3g68CngqsA64CjgxM29pSefMiNI2pJrbY8rh9Jl5MnDyFOvXA8dWf5Ol\nuR94fUeVlDR0pnsPzr6U7s+9gBcCjwC+HhEPjV5xZkRJktSOafWEZOZLm19HxBsp9+3vDnynWuzM\niJIkaYu6nY1kAeX6733gzIiSJKl9HQ9MrZ4PcTrwncy8sVo8dDMjDmrWt+ayhr3MXtVv2PfTMtsv\nT5Lq0M3dMR8FngY8r0d16Ys6ZpEb9jJ7Vb9h30/LlKTh1lEQEhEfAV4K7JuZdzetGrqZEfsxQ91k\n+jkrXi/L7NWsh8O+n5bZfnmSVIdpByFVAPIK4I8z8/bmdcM4M2Ids8gNe5m9+nEb9v20TEkabtOd\nJ+SjwGuBlwNrI2JxteqBzPx19X9nRpQkSVs03VFpRwCjwOXAXU1/r2kkyMzTKAHDWZRei3lMPDPi\nRZTZDht5vbqlrIOBmyl3xVwEfAv422nWV5IkDanpzhPSVtDizIiSJGlLvD9PkiTVwiBEkiTVwiBE\nkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTV\nwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBE\nkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVwiBEkiTVYk7dFZC0\nbYiI2cC7gNcBS4C7gE9l5rtb0p0CHA4sAK4EjszMW5vWbwcsAw4EtgOWA0dl5j2D2A9JvWNPiKRB\neRvwt8BRwFOBE4ATIuKYRoKIOBE4BngTsCewFlgeEXOb8jkdOAB4NbAfsCNw4SB2QFJv2RMiaVD2\nAb6UmZdUr2+PiIMpwUbDccCpmXkRQEQcAqwCXgmcHxGjwGHAQZl5RZXmUOCmiNgzM68d0L5I6gF7\nQiQNylXA/hGxC0BEPAt4HnBx9foplMs0lzU2yMwx4BpKAAOwB+XkqTlNArc3pZE0Q9gTImlQ3geM\nAjdHxDjlJOgdmfm5av0SYDOl56PZqmodwGJgQxWcTJZG0gxhECJpUA4EDgYOAm4Eng18KCLuysxz\nB12ZkZHedwQ38ux13sOSbz/KnzNnenn2673oZ94zuc79ZhAiaVBOA96bmZ+vXq+IiCcDbwfOBVYC\nsyi9Hc29IYuB66v/rwTmRsRoS2/I4mpd20ZH5017B+rOu+58e13+6Og8Fi7coeNt+6Xu93nY8u4n\ngxBJg7I9MN6ybBPV2LTMvC0iVgL7Az8CqAai7gWcWaW/DthYpflilSaApcDV06nM2Ng6xsc3dbQj\nkxkZmc3o6Lye5z0s+Y6NretZ2Y38Vq9eO61t+vVe9DPvmVznfjMIkTQoXwHeGRF3AiuA5wDHA59o\nSnN6leZW4GfAqcCdwJegDFSNiHOAZRGxGlgDnAFcOd07Y8bHN7FxY29/EPqdd9359voHtJv98fMb\nXN79ZBAiaVCOoQQVZwKPo0xW9rFqGQCZeVpEbA+cRZms7NvASzJzQ1M+x1N6VC6gTFZ2CXD0IHZA\n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\nr/PuJt9+7OcwGhmZzZw53e3rMH5+deU9qO+NQYikvouIJ1LGc7wwMx+suz4Ao6PzZlzeneTbz/0c\nJqOj81iuIvQ5AAAVn0lEQVS4cIee5dUPM/E7128GIZIGYXfgd4D/iohZ1bIRYL+IOAZ4KjCL0tvR\n3BuyGLi++v9KYG5EjLb0hiyu1k3L2Ng6xsc3TXezKY2MzGZ0dF7P8+4m37GxdT2rxzAbG1vH6tVr\nu8pjGD+/uvJu5NtvBiGSBuFS4Bktyz4F3AS8LzN/GhErgf2BH8FDA1H3oowjAbgO2Fil+WKVJoCl\nwNXTrdD4+CY2buztD0K/8+4k317/6A2rXr7nw/T5DUPe/WQQIqnvMnMtcGPzsohYC9ybmTdVi04H\n3hkRtwI/A04F7gS+VOUxFhHnAMsiYjWwBjgDuDIzrx3IjkjqKYMQSXXZ3PwiM0+LiO2BsyiTlX0b\neElmbmhKdjwwDlxAmazsEuDowVR3cDZs2MCKFTc89LqbLvfMm3tdPalnDEIk1SIz/2SCZScDJ0+x\nzXrg2Opvq7VixQ2csOwLzF+0tOu8Vv30eyze6bk9qJXUewYhkjSE5i9ayoIlu3Sdz5p77+hBbaT+\n2DZuIJckSUPHIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXC\nIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESS\nJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXCIESSJNXC\nIESSJNViTq8zjIiTgJNaFt+cmU9rSnMKcDiwALgSODIzb21avx2wDDgQ2A5YDhyVmff0ur4z0YYN\nG1ix4gYARkZmMzo6j7GxdYyPb2pr+8yb+1k9SZLa0vMgpPJjYH9gVvV6Y2NFRJwIHAMcAvwMeDew\nPCJ2zcwNVbLTgZcArwbGgDOBC4F9+1TfGWXFihs4YdkXmL9oaUfbr/rp91i803N7XCtJkqanX0HI\nxsz8xSTrjgNOzcyLACLiEGAV8Erg/IgYBQ4DDsrMK6o0hwI3RcSemXltn+o8o8xftJQFS3bpaNs1\n997R49pIkjR9/RoTsktE/E9E/HdE/GtE/C5ARDwFWAJc1kiYmWPANcA+1aI9KMFRc5oEbm9KI0mS\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f052c777790>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"geodata[['change_2012', 'change_2016']].hist()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Models"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's take a real simple model of the change between the Democrat's share of the two-party vote between 2012 and 2016. To do this, we'll regress the change from 2012 to 2016 on:\n",
"1. The change from 2008 to 2012 (Maybe the swing reflects an intensification from last cycle to this cycle?)\n",
"2. Manufacturing employment as a percentage of employment (reflecting a possible constituency for Trump)\n",
"3. African American percentage (reflecting possible overperformance in high-AfAm areas)\n",
"4. Hispanic population percentage (ditto on #3)\n",
"5. Log population over 18 (high-pop and low-pop counties may have changed differently)\n",
"6. Log median income (maybe high-income areas changed differently than low-income areas)\n",
"\n",
"Again, this is a model of the *change*, not the voteshares outright. "
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"xnames = ['change_2012', 'manuf_logit', 'afam_logit', 'hisp_logit', 'log(over_18)', 'log(med_income)'] \n",
"xnames_SFE = xnames + sfes.drop('District of Columbia', axis=1).columns.tolist()\n",
"ols_no_sfe = ps.spreg.OLS(geodata.change_2016.values.reshape(-1,1)*100,\n",
" geodata[xnames].values, \n",
" w=W, spat_diag=True, moran=True, \n",
" name_x=xnames,\n",
" name_y = 'change_2016')"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"REGRESSION\n",
"----------\n",
"SUMMARY OF OUTPUT: ORDINARY LEAST SQUARES\n",
"-----------------------------------------\n",
"Data set : unknown\n",
"Weights matrix : unknown\n",
"Dependent Variable : change_2016 Number of Observations: 3083\n",
"Mean dependent var : -5.9155 Number of Variables : 7\n",
"S.D. dependent var : 5.2275 Degrees of Freedom : 3076\n",
"R-squared : 0.4109\n",
"Adjusted R-squared : 0.4098\n",
"Sum squared residual: 49611.509 F-statistic : 357.6453\n",
"Sigma-square : 16.129 Prob(F-statistic) : 0\n",
"S.E. of regression : 4.016 Log likelihood : -8657.367\n",
"Sigma-square ML : 16.092 Akaike info criterion : 17328.735\n",
"S.E of regression ML: 4.0115 Schwarz criterion : 17370.970\n",
"\n",
"------------------------------------------------------------------------------------\n",
" Variable Coefficient Std.Error t-Statistic Probability\n",
"------------------------------------------------------------------------------------\n",
" CONSTANT -50.9155573 3.4863351 -14.6043212 0.0000000\n",
" change_2012 -0.2968919 2.5655244 -0.1157237 0.9078791\n",
" manuf_logit -1.7095656 0.0934498 -18.2939549 0.0000000\n",
" afam_logit 0.7393086 0.0435121 16.9908576 0.0000000\n",
" hisp_logit 0.9706244 0.0559537 17.3469197 0.0000000\n",
" log(over_18) 0.7423999 0.0653572 11.3591093 0.0000000\n",
" log(med_income) 3.6947563 0.3501994 10.5504365 0.0000000\n",
"------------------------------------------------------------------------------------\n",
"\n",
"REGRESSION DIAGNOSTICS\n",
"MULTICOLLINEARITY CONDITION NUMBER 173.453\n",
"\n",
"TEST ON NORMALITY OF ERRORS\n",
"TEST DF VALUE PROB\n",
"Jarque-Bera 2 128.988 0.0000\n",
"\n",
"DIAGNOSTICS FOR HETEROSKEDASTICITY\n",
"RANDOM COEFFICIENTS\n",
"TEST DF VALUE PROB\n",
"Breusch-Pagan test 6 267.213 0.0000\n",
"Koenker-Bassett test 6 179.899 0.0000\n",
"\n",
"DIAGNOSTICS FOR SPATIAL DEPENDENCE\n",
"TEST MI/DF VALUE PROB\n",
"Moran's I (error) 0.4899 47.028 0.0000\n",
"Lagrange Multiplier (lag) 1 1474.989 0.0000\n",
"Robust LM (lag) 1 44.672 0.0000\n",
"Lagrange Multiplier (error) 1 2179.420 0.0000\n",
"Robust LM (error) 1 749.103 0.0000\n",
"Lagrange Multiplier (SARMA) 2 2224.092 0.0000\n",
"\n",
"================================ END OF REPORT =====================================\n"
]
}
],
"source": [
"print(ols_no_sfe.summary)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Well... this model is okay, but not the best. The R-square is around .4, which is definitely lower than I'd like, but the regression is statistically significant overall. Somewhat surprisingly, last-cycle's change in voteshare is too noisy to be an effective predictor of this-cycle's voteshare. That standard error is quite large.\n",
"\n",
"More critically, I think, there's clearly some spatial effect hidden in our residuals. Since the residuals are strongly spatially correlated (judging by the Moran's I statistic), our model is doing better in some places than in other places, and this difference in performance is both statistically significant and spatially-relevant. I bet this is because we've omitted a spatially-patterned covariate. \n",
"\n",
"The simplest way people address spatial correlation in residuals is often through the use of a spatial fixed effect or hierarchical dependence strategy. This is [misguided](http://onlinelibrary.wiley.com/doi/10.1111/j.1435-5957.2012.00480.x/abstract), since the group-wise correlation induced by these hierarchical structures is *totally different in character* from the type of endogenous feedback that a *spatial markov field* model attempts to address. Regardless, let's try fitting a spatial fixed effects model, with fixed effects for each state:"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"ols_sfe = ps.spreg.OLS(geodata.change_2016.values.reshape(-1,1)*100, \n",
" geodata[xnames_SFE].values, \n",
" w=W, spat_diag=True, moran=True,\n",
" name_x = xnames_SFE,\n",
" name_y = 'change_2016')"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"REGRESSION\n",
"----------\n",
"SUMMARY OF OUTPUT: ORDINARY LEAST SQUARES\n",
"-----------------------------------------\n",
"Data set : unknown\n",
"Weights matrix : unknown\n",
"Dependent Variable : change_2016 Number of Observations: 3083\n",
"Mean dependent var : -5.9155 Number of Variables : 55\n",
"S.D. dependent var : 5.2275 Degrees of Freedom : 3028\n",
"R-squared : 0.6473\n",
"Adjusted R-squared : 0.6410\n",
"Sum squared residual: 29702.151 F-statistic : 102.9257\n",
"Sigma-square : 9.809 Prob(F-statistic) : 0\n",
"S.E. of regression : 3.132 Log likelihood : -7866.573\n",
"Sigma-square ML : 9.634 Akaike info criterion : 15843.145\n",
"S.E of regression ML: 3.1039 Schwarz criterion : 16174.996\n",
"\n",
"------------------------------------------------------------------------------------\n",
" Variable Coefficient Std.Error t-Statistic Probability\n",
"------------------------------------------------------------------------------------\n",
" CONSTANT -85.7715275 4.5676725 -18.7779503 0.0000000\n",
" change_2012 -2.3420765 2.4639877 -0.9505228 0.3419225\n",
" manuf_logit -1.3517305 0.0892964 -15.1375718 0.0000000\n",
" afam_logit 0.2935356 0.0449606 6.5287218 0.0000000\n",
" hisp_logit 0.3002370 0.0626980 4.7886183 0.0000018\n",
" log(over_18) 1.2327377 0.0604305 20.3992524 0.0000000\n",
" log(med_income) 6.0310463 0.3180039 18.9653239 0.0000000\n",
" Alabama 4.5723409 3.1727526 1.4411275 0.1496521\n",
" Arizona 4.2253569 3.2544406 1.2983359 0.1942708\n",
" Arkansas 5.7834344 3.1710325 1.8238332 0.0682758\n",
" California 4.3058398 3.1696614 1.3584542 0.1744208\n",
" Colorado 2.3400340 3.1701082 0.7381559 0.4604769\n",
" Connecticut -2.2345791 3.3313802 -0.6707668 0.5024203\n",
" Delaware -1.2972562 3.6227327 -0.3580878 0.7203026\n",
" Florida 0.9570587 3.1629029 0.3025887 0.7622241\n",
" Georgia 5.4603863 3.1567585 1.7297447 0.0837778\n",
" Idaho 5.4079160 3.1890389 1.6957824 0.0900299\n",
" Illinois -0.9277421 3.1643762 -0.2931832 0.7694022\n",
" Indiana -0.4517375 3.1713108 -0.1424450 0.8867380\n",
" Iowa -3.3712379 3.1684231 -1.0640113 0.2874084\n",
" Kansas 5.1309161 3.1644503 1.6214241 0.1050308\n",
" Kentucky 2.3641430 3.1648633 0.7469969 0.4551234\n",
" Louisiana 4.2578420 3.1674574 1.3442460 0.1789696\n",
" Maine -0.6228444 3.2457287 -0.1918966 0.8478360\n",
" Maryland -0.3093188 3.2020359 -0.0966007 0.9230499\n",
" Massachusetts 2.4561775 3.2679176 0.7516032 0.4523481\n",
" Michigan -0.5145459 3.1685058 -0.1623939 0.8710065\n",
" Minnesota -2.8133161 3.1677902 -0.8881005 0.3745572\n",
" Mississippi 6.2380348 3.1690877 1.9684009 0.0491130\n",
" Missouri -0.5530072 3.1643469 -0.1747619 0.8612784\n",
" Montana 2.2485561 3.1768495 0.7077943 0.4791275\n",
" Nebraska 2.8139840 3.1691769 0.8879226 0.3746529\n",
" Nevada -0.6814703 3.2338584 -0.2107298 0.8331123\n",
" New Hampshire 0.6604233 3.2996144 0.2001517 0.8413754\n",
" New Jersey -1.4851596 3.2133573 -0.4621832 0.6439832\n",
" New Mexico 2.5663460 3.1976731 0.8025667 0.4222882\n",
" New York -3.1752763 3.1698626 -1.0017079 0.3165647\n",
" North Carolina 3.6362710 3.1611558 1.1502979 0.2501120\n",
" North Dakota -2.5773919 3.1795337 -0.8106195 0.4176479\n",
" Ohio -3.0498614 3.1679184 -0.9627336 0.3357581\n",
" Oklahoma 1.8561845 3.1667944 0.5861399 0.5578252\n",
" Oregon 3.2671508 3.1912419 1.0237866 0.3060178\n",
" Pennsylvania -0.9530519 3.1697025 -0.3006755 0.7636826\n",
" Rhode Island -0.0816657 3.4408448 -0.0237342 0.9810662\n",
" South Carolina 4.2960366 3.1809292 1.3505603 0.1769373\n",
" South Dakota 0.5899183 3.1736486 0.1858802 0.8525512\n",
" Tennessee 1.6140271 3.1672420 0.5096002 0.6103687\n",
" Texas 4.6139009 3.1540307 1.4628586 0.1436099\n",
" Utah 11.0013267 3.2036510 3.4339967 0.0006027\n",
" Vermont 1.8692959 3.2592194 0.5735410 0.5663211\n",
" Virginia 2.7337672 3.1556634 0.8663051 0.3863915\n",
" Washington 3.5805353 3.1870011 1.1234810 0.2613223\n",
" West Virginia -0.8986229 3.1790903 -0.2826667 0.7774517\n",
" Wisconsin -0.8375322 3.1741923 -0.2638568 0.7919082\n",
" Wyoming 1.4694890 3.2123974 0.4574431 0.6473854\n",
"------------------------------------------------------------------------------------\n",
"\n",
"REGRESSION DIAGNOSTICS\n",
"MULTICOLLINEARITY CONDITION NUMBER 265.053\n",
"\n",
"TEST ON NORMALITY OF ERRORS\n",
"TEST DF VALUE PROB\n",
"Jarque-Bera 2 180.991 0.0000\n",
"\n",
"DIAGNOSTICS FOR HETEROSKEDASTICITY\n",
"RANDOM COEFFICIENTS\n",
"TEST DF VALUE PROB\n",
"Breusch-Pagan test 54 345.365 0.0000\n",
"Koenker-Bassett test 54 222.966 0.0000\n",
"\n",
"DIAGNOSTICS FOR SPATIAL DEPENDENCE\n",
"TEST MI/DF VALUE PROB\n",
"Moran's I (error) 0.2707 27.865 0.0000\n",
"Lagrange Multiplier (lag) 1 438.980 0.0000\n",
"Robust LM (lag) 1 24.760 0.0000\n",
"Lagrange Multiplier (error) 1 665.565 0.0000\n",
"Robust LM (error) 1 251.345 0.0000\n",
"Lagrange Multiplier (SARMA) 2 690.325 0.0000\n",
"\n",
"================================ END OF REPORT =====================================\n"
]
}
],
"source": [
"print(ols_sfe.summary)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Only two states, Missisippi and Utah, have \"statistically significant\" fixed effect estimates. The rest are simply too noisy. The R-squared bumps, though, to around .64, which is quite a substantial improvement. \n",
"\n",
"And, the value of Moran's I in the residuals is halved, moving from around .5 to around .25. But, while the spatial fixed effects lessen the correlation in the residuals, it's still present.\n",
"\n",
"On a hunch, I'm pretty sure this model is likely to have error-centric spatial correlation and have some significant heteroskedasticity. This means that the `pysal.spreg.GM_Error_Het` model should be applicable. "
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"error_het = ps.spreg.GM_Error_Het(geodata.change_2016.values.reshape(-1,1)*100, \n",
" geodata[xnames].values, \n",
" w=W, step1c=True,\n",
" name_x = xnames,\n",
" name_y = 'change_2016')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When we fit it without spatial fixed effects, we see that the performance of the model degrades slightly from the OLS version when comparing on the pseudo-$R^2$. But, we see that all effects become statistically significant. That is, when correlation in the error is accounted for, the `change_2012` variable becomes statistically significant. And, this effect is quite large. Lambda, being around $.8$, is also quite large. "
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"REGRESSION\n",
"----------\n",
"SUMMARY OF OUTPUT: SPATIALLY WEIGHTED LEAST SQUARES (HET)\n",
"---------------------------------------------------------\n",
"Data set : unknown\n",
"Weights matrix : unknown\n",
"Dependent Variable : change_2016 Number of Observations: 3083\n",
"Mean dependent var : -5.9155 Number of Variables : 7\n",
"S.D. dependent var : 5.2275 Degrees of Freedom : 3076\n",
"Pseudo R-squared : 0.3327\n",
"N. of iterations : 1 Step1c computed : Yes\n",
"\n",
"------------------------------------------------------------------------------------\n",
" Variable Coefficient Std.Error z-Statistic Probability\n",
"------------------------------------------------------------------------------------\n",
" CONSTANT -70.2241540 4.2562378 -16.4991144 0.0000000\n",
" change_2012 -8.2043020 3.7530947 -2.1860099 0.0288149\n",
" manuf_logit -1.2426773 0.1321238 -9.4053997 0.0000000\n",
" afam_logit 0.3196016 0.0544636 5.8681739 0.0000000\n",
" hisp_logit 0.3196106 0.0770729 4.1468597 0.0000337\n",
" log(over_18) 1.1721324 0.0705434 16.6157608 0.0000000\n",
" log(med_income) 4.8499959 0.4213783 11.5098387 0.0000000\n",
" lambda 0.7917701 0.0112345 70.4766151 0.0000000\n",
"------------------------------------------------------------------------------------\n",
"================================ END OF REPORT =====================================\n"
]
}
],
"source": [
"print(error_het.summary)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can verify that the inclusion of the spatial effect addresses the correlation in the residuals by computing Moran's I again for the residuals, which results in a statistically significant correlation very close to zero. This means that our model, using $\\lambda$, is not systematically under/overpredicting in clusters. \n"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(-0.050201326976156188, 0.001)"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ps.Moran(error_het.e_filtered, W).I, ps.Moran(error_het.e_filtered, W).p_sim"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alternatively, if we were concerned that the inclusion of the autoregressive effect traded consistent mis-prediction (in the sense that errors are smooth in space) for volatility (in the sense that errors within a given area are larger but in opposing directions), we can examine correlation in the squared residuals:"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(0.072617016285430186, 0.001)"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ps.Moran(error_het.e_filtered**2, W).I, ps.Moran(error_het.e_filtered**2, W).p_sim"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This correlation is somewhat small and positive, so it does mean that we've traded smoothness in errors for a more \"salt-and-pepper\" pattern in our residuals. But, overall:"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"OLS MSE: \t\t\t\t 16.0920\n",
"OLS-SFE MSE: \t\t\t\t 9.6342\n",
"SAR-Error (Heteroskedastic) MSE: \t 7.7297\n"
]
}
],
"source": [
"print('OLS MSE: \\t\\t\\t\\t {:.4f}'.format(ols_no_sfe.utu / ols_no_sfe.n))\n",
"print('OLS w/SFE MSE: \\t\\t\\t\\t {:.4f}'.format(ols_sfe.utu / ols_sfe.n))\n",
"print('SAR-Error (Heteroskedastic) MSE: \\t {:.4f}'\n",
" .format((error_het.e_filtered.T.dot(error_het.e_filtered) / error_het.n)[0][0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our mean square error drops in half from the typical OLS regression, and is even lower than the spatial fixed effect regression. This means that the Simultaneous Autoregressive Error model with Heteroskedasticity:\n",
"1. has lower error overall\n",
"2. is not systematically under/overpredicting in some areas\n",
"\n",
"Together, this means it's likely a better model to use when trying to work with electoral results at the county level. \n",
"\n",
"Of course, we could also include spatial fixed effects into this model specification:"
]
},
{
"cell_type": "code",
"execution_count": 112,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"error_het_sfe = ps.spreg.GM_Error_Het(geodata.change_2016.values.reshape(-1,1)*100, \n",
" geodata[xnames_SFE].values, step1c=True,\n",
" w=W,\n",
" name_x = xnames_SFE,\n",
" name_y = 'change_2016',\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"REGRESSION\n",
"----------\n",
"SUMMARY OF OUTPUT: SPATIALLY WEIGHTED LEAST SQUARES (HET)\n",
"---------------------------------------------------------\n",
"Data set : unknown\n",
"Weights matrix : unknown\n",
"Dependent Variable : change_2016 Number of Observations: 3083\n",
"Mean dependent var : -5.9155 Number of Variables : 55\n",
"S.D. dependent var : 5.2275 Degrees of Freedom : 3028\n",
"Pseudo R-squared : 0.6405\n",
"N. of iterations : 1 Step1c computed : Yes\n",
"\n",
"------------------------------------------------------------------------------------\n",
" Variable Coefficient Std.Error z-Statistic Probability\n",
"------------------------------------------------------------------------------------\n",
" CONSTANT -81.3411974 4.3122339 -18.8628909 0.0000000\n",
" change_2012 -6.4045908 3.5575069 -1.8003031 0.0718128\n",
" manuf_logit -1.2110560 0.1301613 -9.3042680 0.0000000\n",
" afam_logit 0.2613519 0.0526722 4.9618526 0.0000007\n",
" hisp_logit 0.2067565 0.0732096 2.8241728 0.0047403\n",
" log(over_18) 1.2898184 0.0679781 18.9740263 0.0000000\n",
" log(med_income) 5.3296095 0.4057916 13.1338594 0.0000000\n",
" Alabama 6.4873994 1.2966250 5.0032967 0.0000006\n",
" Arizona 6.8534923 2.3041297 2.9744386 0.0029353\n",
" Arkansas 7.9031816 1.3209373 5.9830105 0.0000000\n",
" California 7.0913262 1.4194674 4.9957654 0.0000006\n",
" Colorado 4.9602920 1.3799554 3.5945307 0.0003250\n",
" Connecticut 1.9523988 2.0479390 0.9533481 0.3404137\n",
" Delaware 0.1445018 1.3806926 0.1046590 0.9166464\n",
" Florida 3.9096906 1.2969873 3.0144402 0.0025745\n",
" Georgia 7.4774223 1.2298608 6.0798934 0.0000000\n",
" Idaho 6.7469107 1.5625370 4.3179204 0.0000158\n",
" Illinois 1.5807193 1.3354486 1.1836617 0.2365470\n",
" Indiana 1.5174448 1.3485000 1.1252835 0.2604689\n",
" Iowa -0.6945686 1.3516927 -0.5138510 0.6073562\n",
" Kansas 7.1177534 1.3041924 5.4575946 0.0000000\n",
" Kentucky 4.4239783 1.3133187 3.3685488 0.0007557\n",
" Louisiana 6.8655417 1.2492234 5.4958481 0.0000000\n",
" Maine 1.4538415 2.0361560 0.7140128 0.4752193\n",
" Maryland 1.3220415 1.2762183 1.0359055 0.3002463\n",
" Massachusetts 4.0216852 1.7424978 2.3080001 0.0209991\n",
" Michigan 1.3968055 1.4063009 0.9932480 0.3205891\n",
" Minnesota -0.2110373 1.3400489 -0.1574848 0.8748628\n",
" Mississippi 8.1698662 1.2676701 6.4447889 0.0000000\n",
" Missouri 2.2184956 1.2906045 1.7189585 0.0856219\n",
" Montana 4.9466154 1.6089176 3.0744990 0.0021086\n",
" Nebraska 4.9853894 1.3482751 3.6976056 0.0002176\n",
" Nevada 2.5706991 1.7544870 1.4652141 0.1428625\n",
" New Hampshire 3.1687419 1.9277553 1.6437469 0.1002285\n",
" New Jersey 0.6011491 1.4228227 0.4225046 0.6726568\n",
" New Mexico 5.1834962 1.5025274 3.4498515 0.0005609\n",
" New York -0.6495469 1.3941059 -0.4659236 0.6412702\n",
" North Carolina 5.9306116 1.2452401 4.7626251 0.0000019\n",
" North Dakota -0.3375742 1.4404224 -0.2343578 0.8147072\n",
" Ohio -0.6298477 1.3754937 -0.4579066 0.6470195\n",
" Oklahoma 4.4739597 1.2771483 3.5030855 0.0004599\n",
" Oregon 6.0339517 1.5065504 4.0051443 0.0000620\n",
" Pennsylvania 1.4220088 1.3257600 1.0725989 0.2834511\n",
" Rhode Island 5.5629699 2.9526560 1.8840562 0.0595574\n",
" South Carolina 6.7967344 1.3032458 5.2152360 0.0000002\n",
" South Dakota 2.6500151 1.3757456 1.9262392 0.0540745\n",
" Tennessee 3.9080740 1.2762650 3.0621181 0.0021978\n",
" Texas 7.2800579 1.2454929 5.8451221 0.0000000\n",
" Utah 12.6690119 1.8176482 6.9700021 0.0000000\n",
" Vermont 4.8074150 1.9233914 2.4994470 0.0124387\n",
" Virginia 5.4499884 1.2059712 4.5191695 0.0000062\n",
" Washington 6.4990424 1.4985578 4.3368646 0.0000145\n",
" West Virginia 1.9865319 1.3658744 1.4544030 0.1458346\n",
" Wisconsin 0.8638805 1.3780820 0.6268716 0.5307434\n",
" Wyoming 3.4490128 1.7063810 2.0212443 0.0432545\n",
" lambda 0.5901467 0.0209069 28.2273738 0.0000000\n",
"------------------------------------------------------------------------------------\n",
"================================ END OF REPORT =====================================\n"
]
}
],
"source": [
"print(error_het_sfe.summary)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Including the spatial fixed effects reduces the autoregressive effect, $\\lambda$, and nearly doubles the R-squared. In addition, many of the spatial fixed effects are statistically significant in this model, whereas they are not significant in the OLS-SFE model. The previous change variate `change_2012` goes back to being statistically insignificant in this model. When it comes to the MSE:"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"OLS MSE: \t\t\t\t 16.0920\n",
"OLS w/SFE MSE: \t\t\t\t 9.6342\n",
"SAR-Error (Heteroskedastic) MSE: \t 7.7297\n",
"SAR-Error w/ SFE (Heteroskedastic) MSE: 7.3913\n"
]
}
],
"source": [
"print('OLS MSE: \\t\\t\\t\\t {:.4f}'.format(ols_no_sfe.utu / ols_no_sfe.n))\n",
"print('OLS w/SFE MSE: \\t\\t\\t\\t {:.4f}'.format(ols_sfe.utu / ols_sfe.n))\n",
"print('SAR-Error (Heteroskedastic) MSE: \\t {:.4f}'\n",
" .format((error_het.e_filtered.T.dot(error_het.e_filtered) / error_het.n)[0][0]))\n",
"print('SAR-Error w/ SFE (Heteroskedastic) MSE: {:.4f}'\n",
" .format((error_het_sfe.e_filtered.T.dot(error_het_sfe.e_filtered) / error_het_sfe.n)[0][0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The one with the spatial fixed effects only marginally outperforms the one without spatial fixed effects. So, it's up to you as to which might be better. I bet a fully-hierarchical model might make the state-effects more useful, considering the vast differences between states. "
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda env:py2]",
"language": "python",
"name": "conda-env-py2-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment