Skip to contents

This function allocates seats to political parties in a given electoral district using the Dean method (also known as the Harmonic Mean method), a highest averages method for proportional representation. The method uses divisors based on the harmonic mean of consecutive integers: for each party, its ballots total is divided by \((2s(s+1))/(2s+1)\), where \(s\) is the current number of seats allocated to the party. Seats are assigned one at a time to the party with the highest resulting quotient until all seats are distributed. Only parties that exceed a ballots threshold (expressed as a proportion of the total ballots, including blank ballots) are considered eligible.

Usage

deans_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

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 Dean method.

Author

Javier Alvarez-Liebana, Irene Bosque-Gala and David Pereiro-Pol

Examples


## Correct examples

## Seats distribution with Dean 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 <- deans_seats(candidacies = candidacies, ballots = ballots,
blank_ballots = 50, n_seats = 15, threshold = 0.03)

# Same results in a long version (providing quotients)
seats <- deans_seats(candidacies, ballots, blank_ballots = 50,
                      n_seats = 15, short_version = FALSE)

# Deans with threshold 0.05
seats <- deans_seats(candidacies, ballots, blank_ballots = 50,
                      n_seats = 5, threshold = 0.05)

# A very high threshold that only one party meets
seats <- deans_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 <- deans_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 <- deans_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 <- deans_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 <- deans_seats(candidacies = candidacies, ballots = ballots,
                      n_seats = 5, blank_ballots = 50,
                      threshold = 3)
} # }