[EM] Biproportional representation (was Re: Preferential voting system where a candidate may win multiple seats)
Kristofer Munsterhjelm
km_elmet at lavabit.com
Mon Jul 29 04:36:49 PDT 2013
On 07/28/2013 04:37 PM, Vidar Wahlberg wrote:
> On Tue, Jul 23, 2013 at 09:29:25PM +0200, Vidar Wahlberg wrote:
>> Implementing it is no easy task. It may be that my sources, mainly the
>> Wikipedia entry and Olli Salmi's page[2] are a bit short on the topic,
>> but one hindrance I've faced is figuring out what the divisor values
>> should be during the correction stages. Neither sources elaborate well
>> on how they decided the divisor values, and Salmi writes "I have just
>> fiddled with the divisor until the total number of seats assigned is
>> correct", but that's no good when implementing the algorithm.
>
> An update on this. This mail will be very long, sorry about that.
>
> I gave up on using the article on Wikipedia and Salmi's page, instead I
> came across a PDF where the method was explained well, although using
> multiplicators rather than divisors. Arguably this only makes the method
> easier to explain and produce the same result, so it probably is a
> better solution.
> The PDF I've used for reference can be found here:
> http://www.math.uni-augsburg.de/stochastik/pukelsheim/2008f.pdf
>
> Here's a shot at explaining my implementation (as of this writing I've
> not yet implemented preferential election, which I intend to do later).
> The code (rough, only intended as "proof of concept") can be found here:
> https://github.com/canidae/voting/blob/master/pbpa.d
>
> Upper apportionment:
> - Party seats are apportioned using unmodified Sainte-Laguë based on
> national votes. If desirable the first divisor may be modified, or a
> election threshold may be set to prevent fragmentation, but I've not
> done this.
Apportionment according to divisor methods can be done in two ways:
either explicitly (like Sainte-Laguë) or by a round-and-adjust method
(like Webster). If I understand you correctly, your biproportional
program uses the Webster method, i.e. you pick x so that
SUM k=1...n round(support[k] * x)
equals the desired number of seats.
I don't know how to turn a given explicit divisor method into a given
rounding method, so how would you implement modified Sainte-Laguë this way?
> - District seats are determined externally and thus not apportioned in
> this implementation.
A similar trick could be used to implement a threshold if desired. It
would be complicated, though, something like:
1. Do a county-by-county count.
2. Parties below the threshold have their number of seats fixed to the
number of seats they got "directly".
3. Fixing these parties' number of seats, determine the number of seats
for the other parties by national Sainte-Laguë: each party gets a seat
as in Sainte-Laguë, but when a party below the threshold have got all
their seats according to 2., remove that party from the count.
4. Use the result as the target for the number of party seats.
I'd still rather use an absolute but lower threshold, though; or none at
all, like you're doing.
> The PDF I used as reference says you should use the maximum multiplier
> when you're to increase the number of seats, and the minimum multiplier
> when you're to decrease the number of seats. I'm not entirely sure why
> this is recommended, if someone have insight on this then please share.
I would guess this makes the method converge more quickly, but I'm not
sure. Perhaps try and see if it does?
On the other hand, one could argue that one should use the minimal
multiplier when increasing and the maximal when decreasing. Say there's
a somewhat sophisticated opponent that objects by saying "You got the
current outcome by multiplying the votes by certain adjustment factors.
Well, I can make Rødt get every single seat with the right adjustment
factors, too, so this is not democratic". Against an objection like
that, the closer the factors are to 1, the better; and so, when
increasing the strength of a party (or district) to increase the number
of seats, one should increase it by as little as possible that gets the
job done, and similarly when decreasing.
> Salmi on the other hand mentions using the average of these two
> multipliers (or divisors in his case), and this also more or less solves
> the problem with multipliers being a fraction of the optimal value, so
> for now I'm using the average of the minimum and maximum multipliers.
I seem to recall seeing somewhere that this avoids certain tricky tie
situations where it would otherwise fail to converge. I don't remember
where I read that, however.
> In this code I've not weighted up votes from districts which in the
> current system are weighted up, and I've kept the amount of seats in
> each district. This means that there's a theoretical possibility (as
> I've discussed earlier) that you can end up with an unresolvable
> election, but it should be noted that this possibility is very low.
> If there are too many parties/districts and/or there are very small
> differences in votes for parties then you may also have a problem with
> too low accuracy of floating numbers. This can be solved by using
> floating numbers with higher precision if it should become a problem.
The method itself will partly make votes unequal by weighting them to
match the district totals you have already specified. However, it will
not be quite as biased as just preweighting all the vote counts, since
the party axis is based on the unweighted votes.
That is, it will give certain districts more than its "fair" share of
MPs according to population alone. But it won't give parties
disproportionate numbers of MPs like it does districts, because the
party target is provided by national Sainte-Laguë.
That's an interesting tension. To see how it works, consider an extreme:
Finnmark gets every seat but one, but the party target is based on a
national count. Then almost every MP would come from Finnmark (contrary
to relative party support there), but even if most Finnmark voters voted
for Rødt, Rødt would still only get two Finnmark MPs.
So I expect that the districts with "too many" seats would see greater
adjustment of their party factors than would districts with the right
number of seats.
---
Floating point problems can also be solved by using a rational number
type, for instance the one provided by the GNU multiprecision library. I
think I read about an implementation of the Meek STV method doing just
that - the Meek method can also run into problems with floating point
precision in certain cases. Rational number types are much slower than
floating point, but they are exact.
> That said, this looks like a very solid system for an optimal
> biproportional apportionment. Since there are multiplicators for each
> party and each district it will also be more resistant to two parties
> receiving the exact same amount of votes in the same district.
> That each vote is worth equally much regardless of which district the
> vote was given is also an appealing thought.
I agree.
> So here's the result using data from the Norwegian 2009 election. No
> election threshold cause 3 new parties to enter the parliament:
>
> Upper apportionment:
>
> Parties (2009 result in parentheses):
> Rødt : 2 ( 0)
> Sosialistisk Venstreparti: 11 (11)
> Arbeiderpartiet : 60 (64)
> Senterpartiet : 10 (11)
> Kristelig Folkeparti : 9 (10)
> Venstre : 7 ( 2)
> Høyre : 29 (30)
> Fremskrittspartiet : 39 (41)
> Miljøpartiet de Grønne : 1 ( 0)
> Kystpartiet : 0 ( 0)
> Pensjonistpartiet : 1 ( 0)
The Loosemore-Hanby index for the 2009 result is 5.4%. The
Loosemore-Hanby index for the biproportional result is 1.3%, so by that
measure, the biproportional result is indeed more proportional. And that
is not very strange, since for this election, the biproportional
apportionment method managed to completely satisfy the nationwide
Sainte-Laguë result: each party got as many seats as it should have had
were there just one district.
(The greatest contribution to disproportionality in the 2009 election,
according to the Loosemore-Hanby index, was due to the number of seats
given to Venstre. Second-place finisher was Arbeiderpartiet. The former
party got too few seats and the latter too many. According to the
Sainte-Laguë index, Venstre was still the most disproportionately
represented party, but Rødt came in second.)
> After this it went back to adjust parties again, then districts, and so
> on. It needed to adjust parties 13 times and districts 13 times before
> it found a final result:
>
> Modifying multipliers for districts:
> Multiplier for Buskerud : 1.00021 (1.00003/1.00039)
> Multiplier for Telemark : 0.999337 (0.998849/0.999826)
>
> | Rodt | Sosiali | Arbeide | Senterp | Kristel | Venstre | Hoyre | Fremskr | Miljopa | Kystpar | Pensjon | Total
> ------------------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
> Akershus | 0 | 1 | 5 | 0 | 1 | 1 | 4 | 4 | 0 | 0 | 0 | 16/ 16
> Aust-Agder | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 4/ 4
> Buskerud | 0 | 0 | 3 | 1 | 0 | 0 | 2 | 3 | 0 | 0 | 0 | 9/ 9
> Finnmark | 0 | 1 | 2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 5/ 5
> Hedmark | 0 | 1 | 3 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 8/ 8
> Hordaland | 1 | 1 | 4 | 1 | 1 | 1 | 3 | 3 | 0 | 0 | 0 | 15/ 15
> More og Romsdal | 0 | 0 | 3 | 1 | 1 | 1 | 1 | 2 | 0 | 0 | 0 | 9/ 9
> Nordland | 0 | 1 | 4 | 1 | 0 | 0 | 1 | 3 | 0 | 0 | 0 | 10/ 10
> Nord-Trondelag | 0 | 0 | 3 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 6/ 6
> Oppland | 0 | 0 | 4 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 7/ 7
> Oslo | 1 | 2 | 5 | 0 | 0 | 2 | 3 | 3 | 1 | 0 | 0 | 17/ 17
> Rogaland | 0 | 1 | 3 | 1 | 2 | 1 | 2 | 3 | 0 | 0 | 0 | 13/ 13
> Sogn og Fjordane | 0 | 0 | 2 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 5/ 5
> Sor-Trondelag | 0 | 1 | 4 | 1 | 0 | 1 | 1 | 2 | 0 | 0 | 0 | 10/ 10
> Telemark | 0 | 0 | 3 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 6/ 6
> Troms | 0 | 1 | 3 | 0 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 7/ 7
> Vest-Agder | 0 | 0 | 2 | 0 | 1 | 0 | 1 | 2 | 0 | 0 | 0 | 6/ 6
> Vestfold | 0 | 1 | 2 | 0 | 0 | 0 | 2 | 2 | 0 | 0 | 0 | 7/ 7
> Ostfold | 0 | 0 | 4 | 0 | 1 | 0 | 1 | 3 | 0 | 0 | 0 | 9/ 9
> ------------------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
> Total | 2/ 2 | 11/ 11 | 60/ 60 | 10/ 10 | 9/ 9 | 7/ 7 | 29/ 29 | 39/ 39 | 1/ 1 | 0/ 0 | 1/ 1 | 169/169
What did the factors end up being for the parties and districts?
More information about the Election-Methods
mailing list