CLMP - 2025 simulation
Introduction
This simulation was built on publicly available data for the 2025 Canadian Federal Election (preliminary results as of the morning of 2025-Apr-29) that is assumed to be accurate. Since this is a solo project there is a high likelihood of minor mistakes. I do not feel any are serious enough to cause any fundamental problems with the simulation that would invalidate the basic fundamentals of how the system works when applied to a real scenario.
The 2025 Federal election was one that broadly delivered the minority government that Canadians seemed to want. It does not feature very major distortions between the vote share of the parties and the number of seats they won.
However it still had the bizarre situation of
- Having large swaths of the country represented by only one party even though that is not representative of the voters in the regions.
- The NDP and Bloc getting pretty much the same vote share but wildly different resulting seats.
Making the simulation work
Data Sources
- Overall results breakdown is preliminary and from Elections Canada as of 2025-Apr-29 which are preliminary. I will not be updating to the final results as the preliminary results are very close to final and the demonstration purpose is fulfilled.
Points to note
- The seat calculations are done at both the provincial and federal levels to show how the two different options would work.
- A party is eligible for regional seats if they get 5% of the vote at the federal level OR only in provinces where they get 5% of the vote.
- I assumed no vote splitting, that is to say that a vote for a party candidate would also be a vote for the party. This is the most reasonable option from a simulation perspective and also serves to demonstrate how a 'one vote PR' system would work where a single ballot vote for a candidate would also be considered to be a vote for the party. While this removes one of the more attractive features of MMP, it does prevent gaming the system through the use of 'decoy lists', though CLMP has other safeguards against this.
Additional seats by province
Province |
# of riding seats |
regional seats (30% rounded up) |
total |
Newfoundland |
7 |
3 |
10 |
Nova Scotia |
11 |
5 |
16 |
Prince Edward Island |
4 |
2 |
6 |
New Brunswick |
10 |
5 |
15 |
Quebec |
78 |
34 |
112 |
Ontario |
122 |
53 |
175 |
Manitoba |
14 |
6 |
20 |
Saskatchewan |
14 |
6 |
20 |
Alberta |
37 |
16 |
53 |
British Columbia |
43 |
19 |
62 |
Yukon |
1 |
1 |
2 |
NorthWest Territories |
1 |
1 |
2 |
Nunavut |
1 |
1 |
2 |
Total |
343 |
152 |
495 |
Calculations
Federal Level calculation
Table of FPTP district/riding level results by party
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Lib |
43.5 |
168 |
48.98 |
TRUE |
Con |
41.4 |
144 |
41.98 |
TRUE |
NDP |
6.3 |
7 |
2.04 |
TRUE |
BQ |
6.4 |
23 |
6.71 |
TRUE |
Green |
1.2 |
1 |
0.29 |
FALSE |
The results in 2025 were fairly proportional outside of the inefficiency of the NDP vote. I have also added a column to note if the party has passed the 5% threshold or not as that matters to the subsequent calculations.
Base Calculations
- PEVP is calculated as 32.6+33.7+17.8+7.6+2.3 = 97.6
- PES is calculated as 343+152-1 = 494
Table of FPTP results plus proportional calculations
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
43.5 |
168 |
48.98 |
TRUE |
220.1741803 |
52.17418033 |
52 |
52 |
220 |
44.44444444 |
Con |
41.4 |
144 |
41.98 |
TRUE |
209.545082 |
65.54508197 |
66 |
66 |
210 |
42.42424242 |
NDP |
6.3 |
7 |
2.04 |
TRUE |
31.88729508 |
24.88729508 |
25 |
25 |
32 |
6.464646465 |
BQ |
6.4 |
23 |
6.71 |
TRUE |
32.39344262 |
9.393442623 |
9 |
9 |
32 |
6.464646465 |
Green |
1.2 |
1 |
0.29 |
FALSE |
1 |
0 |
0 |
0 |
1 |
0.202020202 |
Gallagher Index comparison
The Gallagher Index is a simple measure of how proportional an election outcome is, with a lower index meaning more proportional.
The 2025 election results have a Gallagher Index of 5.25, under CLMP it would be 2.09.
Provincial Level calculation
Newfoundland and Labrador
- PEVP is calculated as 99.4
- PES is calculated as 10
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
54.3 |
5 |
71.43 |
TRUE |
5.46277666 |
0.46277666 |
0 |
0 |
5 |
50 |
Con |
39.6 |
2 |
28.57 |
TRUE |
3.983903421 |
1.983903421 |
2 |
2 |
4 |
40 |
NDP |
5.5 |
0 |
0 |
TRUE |
0.55331992 |
0.55331992 |
1 |
1 |
1 |
10 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
0 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 14.9 to 4.43
Nova Scotia
- PEVP is calculated as 97.6
- PES is calculated as 16
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
57 |
10 |
90.91 |
TRUE |
9.344262295 |
-0.655737705 |
0 |
0 |
10 |
62.5 |
Con |
35.4 |
1 |
9.09 |
TRUE |
5.803278689 |
4.803278689 |
5 |
4 |
5 |
31.25 |
NDP |
5.2 |
0 |
0 |
TRUE |
0.852459016 |
0.852459016 |
1 |
1 |
1 |
6.25 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
0.9 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 30.6 to 5.25
Prince Edward Island
- PEVP is calculated as 96.9
- PES is calculated as 6
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
57.3 |
4 |
100 |
TRUE |
3.547987616 |
-0.452012384 |
0 |
0 |
4 |
66.66666667 |
Con |
37.1 |
0 |
0 |
TRUE |
2.297213622 |
2.297213622 |
2 |
2 |
2 |
33.33333333 |
NDP |
2.5 |
0 |
0 |
TRUE |
0.154798762 |
0.154798762 |
0 |
0 |
0 |
0 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
2.2 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 40.1 to 7.83
New Brunswick
- PEVP is calculated as 97.2
- PES is calculated as 15
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
53.3 |
6 |
60 |
TRUE |
8.225308642 |
2.225308642 |
2 |
2 |
8 |
53.33333333 |
Con |
41 |
4 |
40 |
TRUE |
6.327160494 |
2.327160494 |
2 |
3 |
7 |
46.66666667 |
NDP |
2.9 |
0 |
0 |
TRUE |
0.447530864 |
0.447530864 |
0 |
0 |
0 |
0 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
1.7 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 5.7 to 5.06
Quebec
- PEVP is calculated as 98.1
- PES is calculated as 112
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
42.5 |
43 |
55.13 |
TRUE |
48.52191641 |
5.521916412 |
6 |
5 |
48 |
42.85714286 |
Con |
23.4 |
11 |
14.1 |
TRUE |
26.71559633 |
15.71559633 |
16 |
16 |
27 |
24.10714286 |
NDP |
4.4 |
1 |
1.28 |
TRUE |
5.023445464 |
4.023445464 |
4 |
4 |
5 |
4.464285714 |
BQ |
27.8 |
23 |
29.49 |
TRUE |
31.73904179 |
8.739041794 |
9 |
9 |
32 |
28.57142857 |
Green |
1.7 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 11.5 to 1.97
Ontario
- PEVP is calculated as 97.7
- PES is calculated as 175
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
48.8 |
69 |
56.56 |
TRUE |
87.41044012 |
18.41044012 |
18 |
18 |
87 |
49.71428571 |
Con |
44 |
53 |
43.44 |
TRUE |
78.81269191 |
25.81269191 |
26 |
26 |
79 |
45.14285714 |
NDP |
4.9 |
0 |
0 |
TRUE |
8.776867963 |
8.776867963 |
9 |
9 |
9 |
5.142857143 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
1.2 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 6.76 to 2.11
Manitoba
- PEVP is calculated as 98.2
- PES is calculated as 20
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
40.6 |
6 |
42.86 |
TRUE |
8.268839104 |
2.268839104 |
2 |
2 |
8 |
40 |
Con |
46.6 |
7 |
50 |
TRUE |
9.490835031 |
2.490835031 |
2 |
3 |
10 |
50 |
NDP |
11 |
1 |
7.14 |
TRUE |
2.240325866 |
1.240325866 |
1 |
1 |
2 |
10 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
0.7 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 4.2 to 2.89
Saskatchewan
- PEVP is calculated as 98.7
- PES is calculated as 20
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
26.5 |
1 |
7.14 |
TRUE |
5.369807497 |
4.369807497 |
4 |
4 |
5 |
25 |
Con |
64.7 |
13 |
92.86 |
TRUE |
13.11043566 |
0.110435664 |
0 |
0 |
13 |
65 |
NDP |
7.5 |
0 |
0 |
TRUE |
1.519756839 |
1.519756839 |
2 |
2 |
2 |
10 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
0.6 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 24.8 to 2.31
Alberta
- PEVP is calculated as 97.6
- PES is calculated as 53
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
27.8 |
2 |
5.41 |
TRUE |
15.09631148 |
13.09631148 |
13 |
13 |
15 |
28.30188679 |
Con |
63.6 |
34 |
91.89 |
TRUE |
34.53688525 |
0.536885246 |
1 |
1 |
35 |
66.03773585 |
NDP |
6.2 |
1 |
2.7 |
TRUE |
3.366803279 |
2.366803279 |
2 |
2 |
3 |
5.660377358 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
0.4 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 25.7 to 2.49
British Columbia
- PEVP is calculated as 95.7
- PES is calculated as 61
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
41.6 |
20 |
46.51 |
TRUE |
26.51619645 |
6.516196447 |
7 |
7 |
27 |
43.5483871 |
Con |
41.1 |
19 |
44.19 |
TRUE |
26.19749216 |
7.197492163 |
7 |
7 |
26 |
41.93548387 |
NDP |
13 |
3 |
6.98 |
TRUE |
8.28631139 |
5.28631139 |
5 |
5 |
8 |
12.90322581 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
3 |
1 |
2.33 |
FALSE |
1 |
0 |
0 |
0 |
1 |
1.612903226 |
- Gallagher Index goes from 6.66 to 3.52
Yukon
- PEVP is calculated as 97.9
- PES is calculated as 2
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
52.8 |
1 |
100 |
TRUE |
1.078651685 |
0.078651685 |
0 |
0 |
1 |
50 |
Con |
38.7 |
0 |
0 |
TRUE |
0.790602656 |
0.790602656 |
1 |
1 |
1 |
50 |
NDP |
6.4 |
0 |
0 |
TRUE |
0.130745659 |
0.130745659 |
0 |
0 |
0 |
0 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
0 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 43.4 to 9.51
Northwest Territories
- PEVP is calculated as 99
- PES is calculated as 2
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
53.8 |
1 |
100 |
TRUE |
1.086868687 |
0.086868687 |
0 |
0 |
1 |
50 |
Con |
33.1 |
0 |
0 |
TRUE |
0.668686869 |
0.668686869 |
1 |
1 |
1 |
50 |
NDP |
12.1 |
0 |
0 |
TRUE |
0.244444444 |
0.244444444 |
0 |
0 |
0 |
0 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
1 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 41.1 to 14.97
Nunavut
- PEVP is calculated as 99.0
- PES is calculated as 2
Party |
Vote percentage |
Seats |
Seats percentage |
Meet Threshold of 5%? |
Should have total seats |
Difference between Should have seats and locally elected seats |
Regional Seats (Rounded) |
Modification if needed |
Final Seats |
Final Percent |
Lib |
36.6 |
0 |
0 |
TRUE |
0.732732733 |
0.732732733 |
1 |
1 |
1 |
50 |
Con |
26 |
0 |
0 |
TRUE |
0.520520521 |
0.520520521 |
1 |
0 |
0 |
0 |
NDP |
37.3 |
1 |
100 |
TRUE |
0.746746747 |
-0.253253253 |
0 |
0 |
1 |
50 |
BQ |
0 |
0 |
0 |
TRUE |
0 |
0 |
0 |
0 |
0 |
0 |
Green |
0 |
0 |
0 |
FALSE |
0 |
0 |
0 |
0 |
0 |
0 |
- Gallagher Index goes from 54.5 to 22.55
Assessing Federal vs Provincial Level Calculation
The following is the overall picture of how many seats each party gets from a federal perspective when all the provincial CLMP results are totalled up.
Party |
NF |
NS |
PEI |
NB |
QB |
ON |
MB |
SK |
AB |
BC |
YK |
NWT |
NU |
Total |
Seat % |
Vote % |
Lib |
5 |
10 |
4 |
8 |
48 |
87 |
8 |
5 |
15 |
27 |
1 |
1 |
1 |
221 |
44.55645161 |
43.5 |
Con |
4 |
5 |
2 |
7 |
27 |
79 |
10 |
13 |
35 |
26 |
1 |
1 |
0 |
210 |
42.33870968 |
41.4 |
NDP |
1 |
1 |
0 |
0 |
5 |
9 |
2 |
2 |
3 |
8 |
0 |
0 |
1 |
32 |
6.451612903 |
6.3 |
BQ |
0 |
0 |
0 |
0 |
32 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
32 |
6.451612903 |
6.4 |
Green |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0.201612903 |
1.2 |
Comparing it to the federal level calculation we can see that it is identical. As such, this simulation at least, points towards the province level calculations being a better choice as in this example they did not give up any proportionality at all while increasing the tie of the proportional candidates elected to the province they were competing in. As an example a NDP candidate will get chosen in Newfoundland here which might not have been the case if calculation is only done on the federal level.
Final thoughts
While the 2025 election was overall very proportional, looking at the party level and regional level breakdowns shows significant distortions remain which is a bug of all Winner Take All systems like FPTP and Winner Take All Ranked Ballot (otherwise known as IRV or Justin Trudeau's favourite system).
For example:
This plus the volatility of the resulting parliament, where the incentive for the Liberal and Conservative party to force an election the moment they sense weakness in the other and an opportunity to gain a false majority, are incredibly unhealthy aspects of Canadian democracy. Proportionality doesn't fix everything, but it does fix these.