Function to calculate the allocated seats according to the Webster method in a given electoral district.
Source:R/seat_allocation.R
webster_seats.Rd
This function allocates seats to political parties in a given electoral district using the Webster method (also known as the Sainte-Laguë method), a highest averages method for proportional representation. Each party's total number of ballots is divided by a series of odd-numbered divisors (1, 3, 5, ...), generating a list of quotients. The highest quotients are selected sequentially to assign the available seats. Only parties that receive a number of ballots exceeding a specified threshold (expressed as a proportion of the total ballots, including blank ballots) are eligible for seat allocation.
Usage
webster_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:
- party
aabbrev or id of the candidacies
- seats
number of seats
- 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 Webster method.
Examples
## Correct examples
## Seats distribution with Webster 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 <- webster_seats(candidacies = candidacies, ballots = ballots,
blank_ballots = 50, n_seats = 15, threshold = 0.03)
# Same results in a long version (providing quotients)
seats <- webster_seats(candidacies, ballots, blank_ballots = 50,
n_seats = 15, short_version = FALSE)
# Webster with threshold 0.05
seats <- webster_seats(candidacies, ballots, blank_ballots = 50,
n_seats = 5, threshold = 0.05)
# A very high threshold that only one party meets
seats <- webster_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 <- webster_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 <- webster_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 <- webster_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 <- webster_seats(candidacies = candidacies, ballots = ballots,
n_seats = 5, blank_ballots = 50,
threshold = 3)
} # }