redistmetrics
provides an interface for computing common
redistricting measures and metrics. This covers the range of compactness
measures, partisan gerrymandering metrics, county splits, and more. The
goal is to provide a flexible and friendly (to existing R users)
implementation of scores which are often used in academic research,
litigation, public projects, and journalism. This package began as a set
of functions in redist
.
While those features will remain, this package should offer friendlier
examples by separating out measures into their own functions.
The package is developed and maintained by the ALARM Project, the ALgorithm-Assisted Redistricting Methodology Project,a research project under the direction of Kosuke Imai. The code in this package was developed by Christopher T. Kenny, Cory McCartan, and Ben Fifield. When using the package, please cite the package using the following:
citation('redistmetrics')
#> To cite redistmetrics in publications use:
#>
#> Kenny C, McCartan C, Fifield B, Imai K (2023). _redistmetrics:
#> Redistricting Metrics_. R package,
#> <https://alarm-redist.org/redistmetrics/>.
#>
#> A BibTeX entry for LaTeX users is
#>
#> @Manual{redistmetrics,
#> title = {{redistmetrics}: Redistricting Metrics},
#> author = {Christopher T. Kenny and Cory McCartan and Ben Fifield and Kosuke Imai},
#> year = {2023},
#> note = {R package},
#> url = {https://alarm-redist.org/redistmetrics/},
#> }
The package is fully open source and can be installed from GitHub:
if (!requireNamespace('remotes')) {
install.packages('remotes')
}
remotes::install_github('alarm-redist/redistmetrics)
Once installed, the package can be loaded with:
For example purposes, we include data about New Hampshire’s political geography and demographics. The following data is included:
nh
: a tibble
with geographic data, an
adjacency graph, past electoral data, 2020 Census demographics, and two
proposed NH redistricting plansnh_m
: a matrix of 52 redistricting plans, where the
first two are the proposed plans in nh
and the next 50 are
simulated alternative plansFor users of redist
, we also provide example data using
redist
objects, which offer some desirable features
available via redist
: - nh_map
: a
redist_map
version of nh
-
nh_plans
: a redist_plans
version of
nh_plans
Each of these can be loaded with the data()
function.
Given some data set where the districts are indicated, we can begin to compute measures.
We start with nh
:
data(nh)
Functions in redistmetrics
use common prefixes to
indicate their usage. The prefixes in the current version are:
comp_
: compactness measurespart_
: partisan measuresdist_
: distance-between-plan measuressplits_
: administrative split measuresseg_
: segregation measures (currently limited in
scope)inc_
: incumbent pairing measures (currently limited in
scope)compet_
: competitiveness measures (currently limited in
scope)With these, we can pick a measure that we’d like to compute, say the
Reock compactness, via comp_reock()
. The major arguments
are then the plans
, or what the redistricting plan is, and
the shp
, which is the geography that the district is based
on. Notably, comp_
functions also typically take an
epsg
argument which has the goal of converting the object
to a projected map. This allows for more accurate measurement by more
correctly describing the relative location of points on a map.
comp_reock(plans = nh$r_2020, shp = nh)
#> [1] 0.4444653 0.2502152
The output here is two Reock scores, the first being for the first district and the second for the second.
We can similar look at a partisan score, perhaps the efficiency gap,
via part_egap()
. This takes additional arguments. As
before, it wants the plans
defining the assignment to
districts, along with a shp
object, which just contains the
next two columns: rvote
(votes for Republicans) and
dvote
(votes for Democrats).
part_egap(plans = nh$r_2020, shp = nh,
rvote = nh$pre_20_rep_tru, dvote = nh$pre_20_dem_bid)
#> [1] 0.08171976 0.08171976
As the variable names suggest, we compute the Efficiency Gap using 2020 presidential data. Now, because the Efficiency Gap is defined for a plan, rather than by district, it is repeated here for each district for consistency.
If you want a plan-level metric to not be repeated, you can pipe
through to by_plan
.
part_egap(plans = nh$r_2020, shp = nh,
rvote = nh$pre_20_rep_tru, dvote = nh$pre_20_dem_bid) %>%
by_plan()
#> [1] 0.08171976
For more information, view the other vignettes or the package website.