Function to calculate the allocated seats according to the Adams method in a given electoral district.
Source:R/seat_allocation.R
adams_seats.Rd
This function allocates seats to political parties in a given electoral district using the Adams method, a highest averages method for proportional representation that favors smaller candidacies. In this method, the first quotient for every eligible party is treated as "infinite", each party will receive a seat initially if possible, so a party cannot receive a second seat until all other eligible parties have had the chance at a first seat. After that, each party’s ballots total is divided by a sequence of integers starting from 1 (i.e., 1, 2, 3, ...), generating a series of quotients. The remaining seats are allocated one at a time to the highest quotients until all seats are distributed. Only parties that surpass a specified ballots threshold (expressed as a proportion of total ballots, including blank ballots) are eligible for seat allocation.
If there are more eligible parties than seats, in this package, in order to ensure reproducibility, ties will be broken by ordering from highest to lowest number of absolute ballots.
Usage
adams_seats(
candidacies,
ballots,
blank_ballots,
n_seats,
threshold = 0.03,
short_version = TRUE
)
Arguments
- candidacies
A vector containing one of the following variable: unique codes or abbreviations of the candidacies that participated in the election.
- ballots
A vector containing the absolute number of ballots (integer positive values) received by each candidacies
- blank_ballots
A numerical value indicating the number of blank ballots (integer positive values).
- n_seats
An integer positive value indicating the number of seats that are going to distributed for a given electoral district.
- threshold
A numerical value (between 0 and 1) indicating the minimal percentage of ballots needed to obtain representation for a given electoral district. Defaults to
0.03
.- short_version
Flag to indicate whether it should be returned a short version of the data (just key variables) or not. Defaults to
TRUE
.
Value
A tibble or a list of tibbles with rows corresponding to each party including the following variables:
- candidacies
abbrev or id of the candidacies
- seats
number of seats distributed to each party
- ballots
absolute number of ballots, just in long format
- porc_seats
percentage of seats respect to the number of seats, just in long format
- porc_ballots
percentage of ballots respect to party ballots (including blank ballots), just in long format
- quotient_x
intermediate quotients of the allocation process
Details
The purpose of this helper function is to be used in a general
function, seats_allocation()
, to calculate the seats distribution of every
electoral district of a given election according to the Adam method.
Examples
## Correct examples
## Seats distribution with Adams method for given vectors of candidacies and ballots
## without the remainder quotients
candidacies <- c("PP", "PSOE", "PODEMOS", "VOX")
ballots <- c(200, 350, 100, 200)
seats <- adams_seats(candidacies = candidacies, ballots = ballots,
blank_ballots = 50, n_seats = 15, threshold = 0.03)
# Same results in a long version (providing quotients)
seats <- adams_seats(candidacies, ballots, blank_ballots = 50,
n_seats = 15, short_version = FALSE)
# Adams with threshold 0.05
seats <- adams_seats(candidacies, ballots, blank_ballots = 50,
n_seats = 5, threshold = 0.05)
# A very high threshold that only one party meets
seats <- adams_seats(candidacies, ballots, blank_ballots = 50,
n_seats = 5, threshold = 0.3)
if (FALSE) { # \dontrun{
# Incorrect examples
# Different length of candidacies and ballots
candidacies <- c("PP", "PSOE", "PODEMOS", "VOX")
ballots <- c(200, 350, 100)
seats <- adams_seats(candidacies = candidacies, ballots = ballots,
blank_ballots = 50, threshold = 0.03)
# Ballots with missing values
candidacies <- c("PP", "PSOE", "PODEMOS")
ballots <- c(200, 350, NA)
seats <- adams_seats(candidacies = candidacies, ballots = ballots,
n_seats = 5, blank_ballots = 50,
threshold = 0.03)
# Ballots with char values
candidacies <- c("PP", "PSOE", "PODEMOS")
ballots <- c("200", "350", "100")
seats <- adams_seats(candidacies = candidacies, ballots = ballots,
n_seats = 5, blank_ballots = 50,
threshold = 0.03)
# Threshold should be a numerical value between 0 and 1
candidacies <- c("PP", "PSOE", "PODEMOS")
ballots <- c(200, 350, 100)
seats <- adams_seats(candidacies = candidacies, ballots = ballots,
n_seats = 5, blank_ballots = 50,
threshold = 3)
} # }