DescriptiveRepresentation is an R package
for measuring descriptive representation in political bodies. It
implements key functions from Gerring, Jerzak, and Oncel (2024),
offering an accessible approach to modeling:
The package therefore provides seven main functions:
ExpectedRepresentation()ObservedRepresentation()SDRepresentation()RelativeRepresentation()ExpectedDistrictRepresentation()GroupRepresentation()CompareRepresentation()Each function measures a slightly different concept linked to the ideas in Gerring, Jerzak, and Oncel (2024) and in the companion book manuscript, Gerring, Hicken, Jerzak, Moser, and Oncel, Electoral Rules and Descriptive Representation: A Comprehensive View Across Multiple Identities. In this vignette, we show how to install and use these functions, illustrate a few worked examples, and discuss conceptual underpinnings relevant to descriptive representation. Installation
To install and load the
DescriptiveRepresentationCalculator package, run:
How well do political bodies reflect the demographic features of the population they serve? This question is at the heart of descriptive representation, and the work of Gerring, Jerzak, and Oncel (2024) offers a systematic way to measure and analyze this phenomenon.
The approach builds on the Rose Index of Proportionality that captures how far a political body’s group shares deviate from the population’s group shares. Concretely: \[ R = 1 - \frac{1}{2} \sum_{k=1}^{K} |g_{p_k} - G_{b_k}| \] where \(g_{p_k}\) is the population share of group \(k\), and \(G_{b_k}\) is that group’s share in the body of interest \(b\). The index ranges from 0 (no descriptive representation) to 1 (perfect descriptive representation).
Note that there are a range of other possible weighting factors in
the equation. In the package, the default parameters
(a = -0.5 and b = 1), producing the Rose
Index. The user can modify the a and b
parameters to fit other affine transformations of the underlying
absolute deviations: \[
R = b + a \sum_{k=1}^{K} |g_{p_k} - G_{b_k}|
\] The Rose Index has nice theoretical properties in that it is
bounded between 0 (total representation mismatch) and 1 (complete match
between elite and population group shares).
In addition to the L1 (absolute-deviation) form above, the
index-computing functions accept a metric argument. Setting
metric = "L2" replaces absolute deviations with squared
deviations: \[
\tilde{R} = 1 - \frac{1}{2} \sum_{k=1}^{K} \left(g_{p_k} -
G_{b_k}\right)^2
\] This squared-deviation index, analyzed in Gerring, Hicken,
Jerzak, Moser, and Oncel (book manuscript), is analytically tractable
(its expectation under random sampling has an exact closed form) and
always upper-bounds the Rose Index. The default
metric = "L1" reproduces the classic Rose Index
behavior.
One of the insights of Gerring, Jerzak, and Oncel (2024) is to compare observed descriptive representation to what would be expected under a random sampling model—if individuals (or group shares) were randomly drawn into the political body.
This expected value establishes a baseline: how much shortfall or surplus we might attribute purely to compositional factors (like the body’s size or the population’s group diversity).
Divergences from this random baseline can reveal additional, potentially systematic, sources of under- or over-representation.
ExpectedRepresentation(). This gives you the theoretical
baseline if seats or positions were allocated proportionally by chance
given the group shares.ObservedRepresentation(). This takes actual data on who
occupies each seat (or the observed group shares in the body) and
compares it to population-level group shares.RelativeRepresentation() to directly compute the
difference between observed and expected representation, optionally
standardized by the variability under random sampling.SDRepresentation() to assess how much
variation is left unexplained by the random sampling model.The function ExpectedRepresentation() computes the
expected level of representation (the “expected Rose Index”) under a
random sampling model:
ExpectedRepresentation(
PopShares,
BodyN,
a = -0.5,
b = 1
)
Arguments:
`PopShares`: Numeric vector of group-level population proportions (e.g., `c(0.25, 0.5, 0.25)`).
`BodyN`: Integer, the size of the political body in question (e.g., `50L`).
`a`, `b`: (Optional) Affine transformation parameters. By default, `a=−0.5`,`b=1` (for the Rose Index).
Returns: A single numeric value representing the expected representation score.
# Suppose the population is split into 3 groups: 25%, 50%, 25%.
# We have a political body (say, a legislature) of size 50.
PopShares_example <- c(1/4, 2/4, 1/4)
BodySize_example <- 50
ExpectedRep <- ExpectedRepresentation(
PopShares = PopShares_example,
BodyN = BodySize_example
)
ExpectedRep## [1] 0.9227715
In many settings, this expected value serves as the baseline to which we compare actual data. Larger bodies and more homogenous populations will tend to have higher expected representation scores under the random sampling model.
To compare theory to reality, we compute the observed representation of any group in a political body:
ObservedRepresentation(
BodyMemberCharacteristics = NULL,
PopShares,
BodyShares = NULL,
a = -0.5,
b = 1
)
Arguments:
BodyMemberCharacteristics: A vector describing group
identities for each member of the body. If supplied, the function
automatically calculates the group share distribution.PopShares: Numeric vector of population-level group
proportions (with names matching those in
BodyMemberCharacteristics).BodyShares: (Optional) A numeric vector with the same
structure as PopShares that directly specifies each group’s share in the
body. If not NULL, overrides BodyMemberCharacteristics. a,
b: Affine transformation parameters, defaulting to
(−0.5,1).Returns: A single numeric value for the observed representation score.
# Observed scenario: A 6-seat body with members: "A", "A", "C", "A", "C", "A"
# The population shares are: A=1/4, B=2/4, C=1/4.
ObsRep <- ObservedRepresentation(
BodyMemberCharacteristics = c("A","A","C","A","C","A"),
PopShares = c("A"=0.25, "B"=0.50, "C"=0.25)
)
ObsRep## [1] 0.5
If group "B" had no seats here, we’d expect a larger
observed discrepancy from the population’s proportions, lowering the
representation score.
Finally, SDRepresentation() estimates the extent to
which the observed representation can vary around its expected value
under random sampling. It performs Monte Carlo simulations, drawing
random compositions of the body and re-computing the representation
score each time:
SDRepresentation(
PopShares,
BodyN,
a = -0.5,
b = 1,
nMonte = 10000
)
Arguments:
PopShares: Numeric vector of group-level population
proportions.BodyN: Size of the political body.a, b: Affine transformation
parameters.nMonte: Number of Monte Carlo draws used to approximate
the variance.Returns: A single numeric value summarizing how much representation fluctuates (in standard deviation units) around the expected representation under a random selection model.
The function RelativeRepresentation() computes the
difference between observed and expected representation, providing a
direct measure of how a body deviates from the random sampling baseline.
It can optionally standardize this difference by the standard deviation
under the random sampling model:
RelativeRepresentation(
BodyMemberCharacteristics,
PopShares,
a = -0.5,
b = 1,
standardize = FALSE,
nMonte = 10000
)
Arguments:
BodyMemberCharacteristics: A vector specifying
characteristics for each member of a political body.PopShares: Numeric vector of population group
proportions. Names must correspond to identities in
BodyMemberCharacteristics.a, b: Affine transformation parameters
(default: Rose Index with a = -0.5,
b = 1).standardize: Logical. If TRUE, the
difference is divided by the standard deviation under random
sampling.nMonte: Number of Monte Carlo iterations for estimating
the standard deviation when standardize = TRUE.Returns: A scalar giving the difference between observed and expected
representation. If standardize = TRUE, this difference is
expressed in standard deviation units.
# Same body and population as before
BodyMembers <- c("A", "A", "C", "A", "C", "A")
PopShares_example <- c("A" = 0.25, "B" = 0.50, "C" = 0.25)
# Compute relative representation (observed - expected)
RelRep <- RelativeRepresentation(
BodyMemberCharacteristics = BodyMembers,
PopShares = PopShares_example
)
RelRep## [1] -0.2735596
#> Prints how much observed representation differs from expected
# Standardized version (in SD units)
RelRep_std <- RelativeRepresentation(
BodyMemberCharacteristics = BodyMembers,
PopShares = PopShares_example,
standardize = TRUE
)
RelRep_std## [1] -2.384368
A positive value indicates the body is more representative than expected under random sampling; a negative value indicates less representation than expected. When standardized, values beyond ±2 suggest the observed representation is unlikely under the random sampling model alone.
The functions above treat the political body as a single pool filled
by random sampling. ExpectedDistrictRepresentation()
extends the framework to bodies elected from single-member districts,
following the derivations in Gerring, Hicken, Jerzak, Moser, and Oncel
(book manuscript). In this model, each district’s group composition is
drawn from a Dirichlet distribution whose mean is PopShares
and whose concentration parameter governs geographic
segregation: small values produce highly segregated districts, large
values produce districts that each resemble the national population.
ExpectedDistrictRepresentation(
PopShares,
concentration,
nDistricts,
selectionRule = c("random", "affinity"),
a = -0.5,
b = 1,
nMonte = 10000
)
Arguments:
PopShares: Numeric vector of group-level population
proportions (mean district shares).concentration: Positive number; the Dirichlet
concentration parameter controlling spatial concentration of groups
across districts.nDistricts: Number of single-member districts, or
Inf for the large-district limit.selectionRule: "random" (each district
seat won by a group with probability equal to its district share) or
"affinity" (the largest group in each district always
captures the seat).a, b: Affine transformation
parameters.nMonte: Monte Carlo draws used only for
"affinity" with more than two groups.Returns: A single numeric value — the expected squared-deviation
representation index (the metric = "L2" index) for the
district-elected body.
# Random-sampling seat allocation across 100 districts:
ExpectedDistrictRepresentation(
PopShares = c(0.3, 0.7),
concentration = 4,
nDistricts = 100
)## [1] 0.99832
#> Approaches 1 as nDistricts grows (Proposition 2 of the book manuscript)
# Largest-group-wins affinity voting, large-district limit:
ExpectedDistrictRepresentation(
PopShares = c(0.3, 0.7),
concentration = 4,
nDistricts = Inf,
selectionRule = "affinity"
)## [1] 0.9860725
#> Need not approach 1: the gap reflects the mismatch between each group's
#> population share and its probability of being the largest group in a districtUnder random sampling, representation converges to the proportional benchmark as the number of districts grows. Under affinity voting, it converges instead to a limit governed by the mismatch between each group’s mean population share and its probability of forming a local plurality — which is how geographically concentrated groups can secure representation under single-member district rules while dispersed groups (such as women) are disadvantaged.
GroupRepresentation() unpacks the scalar representation
index into per-group diagnostics:
GroupRepresentation(
BodyMemberCharacteristics = c("A", "A", "C", "A", "C", "A"),
PopShares = c("A" = 0.25, "B" = 0.50, "C" = 0.25)
)## Group PopShare BodyShare Shortfall ShortfallRatio
## 1 A 0.25 0.6666667 -0.41666667 -1.6666667
## 2 B 0.50 0.0000000 0.50000000 1.0000000
## 3 C 0.25 0.3333333 -0.08333333 -0.3333333
Shortfall (population share minus body share)
accentuates the under-representation of large groups;
ShortfallRatio (the shortfall as a fraction of the group’s
population share) accentuates the under-representation of small
groups.
CompareRepresentation() computes the difference in
observed representation between two bodies measured against the same
population — for example, the multi-member (MMD) and single-member (SMD)
district tiers of a mixed electoral system:
CompareRepresentation(
BodyMemberCharacteristics1 = c("A", "B", "A", "B", "A", "A"), # e.g., MMD tier
BodyMemberCharacteristics2 = c("A", "A", "A", "A", "A", "B"), # e.g., SMD tier
PopShares = c("A" = 0.55, "B" = 0.45)
)## [1] 0.1666667
Expected Representation (ExpectedRepresentation()) helps
analysts understand the baseline level of representation when selection
is effectively random.
Conversely, Observed Representation
(ObservedRepresentation()) is the real-world result,
showing how close or far a body’s membership is from the population
distribution.
SDRepresentation (SDRepresentation()) quantifies how
much randomness alone could explain variation in representation,
shedding light on when observed deviations might be plausibly attributed
to other (non-random) factors like institutional rules or
discrimination.
Relative Representation (RelativeRepresentation())
directly compares observed to expected representation, providing a
single measure of deviation from the random sampling baseline. When
standardized, it expresses this deviation in terms of standard
deviations, enabling cross-body or cross-country comparisons on a common
scale.
Expected District Representation
(ExpectedDistrictRepresentation()) provides theoretical
benchmarks for district-based electoral systems, quantifying how group
size, geographic concentration, and the seat-allocation rule (random
sampling versus affinity voting) shape expected representation.
Group Representation (GroupRepresentation()) and Compare
Representation (CompareRepresentation()) support
finer-grained analyses: the former identifies which specific groups
drive a body’s representational shortfall, and the latter quantifies
which of two bodies (or electoral tiers) better mirrors the
population.
The DescriptiveRepresentation package operationalizes
key ideas about descriptive representation from Gerring, Jerzak, and
Oncel (2024). By offering easy-to-use functions for measuring expected,
observed, and residual variance in representation, the package helps
scholars, analysts, and policymakers investigate how factors like body
size and population diversity shape the composition of political bodies
worldwide.
We hope this vignette gets you started! For any questions or feedback, feel free to open an issue on our GitHub repository.
@article{gerring2024composition,
title={The Composition of Descriptive Representation},
author={Gerring, John and Connor T. Jerzak and Erzen \"{O}ncel},
journal={American Political Science Review},
year={2024},
volume={118},
number={2},
pages={784-801}
}
@book{gerring2026electoral,
title={Electoral Rules and Descriptive Representation:
A Comprehensive View Across Multiple Identities},
author={Gerring, John and Allen Hicken and Connor T. Jerzak
and Robert G. Moser and Erzen \"{O}ncel},
note={Book manuscript}
}