Robert Klarer, Oct 26 2014

*Disclosure: I intend to vote for Morgan Baskin tomorrow.*

Imagine that there's going to be a municipal election in your town on Monday, in which the town's mayor will be selected. Furthermore, let's assume that there are three major candidates in the race. Sound familiar? Okay, let's make the following, somewhat more hypothetical assumptions, too:

- your town has exactly 852 registered voters
- we know with perfect certainty that all 852 registed voters will vote
- we have reliable polls that tell us the probability with which each voter will select a given candidate

For example, let's say that our reliable polls tell us that there is a 33% chance that any single voter will select Candidate T, a 33% percent chance that the same voter will select Candidate C, and a 32% percent chance that the voter will select Candidate F. The remaining 2% represents the possibility of the voter selecting some other, dark horse candidate.

Remember, we're talking about probabilities; if we treat each ballot cast as a random event, what are Candidate F's odds of prevailing on election night, and becoming the mayor-elect?

- is it 32%?
- is it less than 32%
- is it a lot less than 32%

To answer that question, I wrote some C++ code. You don't need to read the code to follow the rest of this analysis, but here it is anyway:

#include <algorithm> #include <iomanip> #include <iostream> #include <iterator> #include <random> #include <type_traits> int main() { const int nsimulations = 10000; const int nballots = 852; const int voteshare[] = { 33, 32, 33, 2 }; const std::string candidatename[] = { "Tory", "Ford", "Chow", "other" }; const int ncandidates = std::extent <decltype(voteshare) >(); int wins[ncandidates] = {}; std::mt19937 engine; std::discrete_distribution<> d(voteshare, std::end(voteshare)); for (int i = 0; i < nsimulations; ++i) { int votescast[ncandidates] = {}; for (int j = 0; j < nballots; ++j) { ++votescast[d(engine)]; } ++wins[std::max_element(votescast, std::end(votescast)) - votescast]; } for (int k = 0; k < ncandidates; ++k) { std::cout << std::setw(6) << candidatename[k] << std::setw(9) << wins[k] << std::endl; } }

Oh, and did I mention that Candidate T's full name is Tory, Candidate C's full name is Chow, and Candidate F's full name is Ford? No? Well, let's go with that. Those seem like good hypothetical names for a TOTALLY HYPOTHETICAL election, right?

Anyway, the program simulates 10,000 elections in which exactly 852 ballots are cast. The ballots are generated randomly, using the 33/33/32/2 probability split I mentioned earlier. Here is the actual output from the program:

Tory 4051 Ford 2060 Chow 3889 other 0

The number to the right of each candidate's name is the number of simulated elections (out of a total of 10,000) that were won by that candidate. What this experiment shows is that reducing the probability of a ballot being marked for Ford by just 1% from 33% to 32% reduces the number of randomly-generated elections in which Ford wins from 33% to 20%.

A recent Forum poll showed that a sample of 852 likely voters and early-bird voters who had voted in advance polls - when weighted according to Forum's demographic model - supported Ford about 29% of the time, plus or minus 3%. If you believe Forum's numbers (I know, I know), then, you're obliged to believe that the above simulation represents Ford's ideal outcome: 29 + 3% chance of any single voter supporting him, plus an equal split of non-Ford votes between his two main opponents, Tory and Chow.

What if the split between Tory and Chow is not equal? Let's change the line of the program that reads

const int voteshare[] = { 33, 32, 33, 2 };

to

const int voteshare[] = { 35, 32, 31, 2 };

This leaves the probability of a ballot going to Ford at 32%, as before, but it gives Tory a 35% chance of winning over any single voter, while reducing the chance of Chow's winning over any single voter to 31%. Let's run the program again:

Tory 8228 Ford 1262 Chow 510 other 0

Ford now wins fewer than 13% of the 10,000 simulated elections, and we didn't even change his share of the vote.

What if we choose to believe Forum's top-line prediction of 29% support for Ford? Let's make this as advantageous as possible for Ford, and assume an equal split between Tory and Chow:

const int voteshare[] = { 35, 29, 35, 1 };

Here's the outcome:

Tory 5049 Ford 18 Chow 4933 other 0

Ford wins just 18 out of 10,000 simulations. That's 0.18%, folks.

OK, one more. Let's assume that all of Forum's top line numbers are correct:

const int voteshare[] = { 43, 29, 25, 3 };

The outcome looks decisive:

Tory 10000 Ford 0 Chow 0 other 0

What can we conclude from this experiment?

- a candidate's predicted vote share is not the same as that candidate's likelihood of winning
- small changes in vote share can effect large changes in a candidate's likelihood of winning
- one candidate's chance of winning can be affected in a large way by small changes in
*another*candidate's share of the vote - if you believe that Doug will pull about 29% of the vote, strategic voting is not merited
- the case for strategic voting improves as Ford's numbers approach 32%, but there haven't been many polls predicting that. UPDATE: SEE BELOW
- a newspaper op-ed column that calls for strategic anti-Ford voting without offering any mathematical analysis is morally equivalent to climate change denial, or anti-vax/anti-wifi hysteria

A predictable counter-argument to everything that you've just read is this: What if the polls are wrong, and what if the particular poll whose results I plugged into the program is really, really wrong?

I have two responses to this:

- the polls have been remarkably consistent with one another for a long time; a single poll on its own isn't convincing, but months of regular polling?
- if you are going to discount the polls, then you are discounting the basis for strategic voting, too; you can't say "the best strategy is to vote for the candidate who is leading in the polls" while silmutaneously saying "I think the polls are totally wrong"

The whole point of strategic voting is that it is an informed response to known information about how others will vote. If you choose to believe that the polls are wrong you CANNOT VOTE STRATEGICALLY. At best, you can vote based on a hunch and flatter yourself with the false belief that doing so is smart, somehow.

Just vote for the candidate you like. Good luck.

Oct 27 2014

OK, Forum released the results of a new poll Sunday night (October 26th). Let's run the simulation with these new results:

const int voteshare[] = { 44, 32, 21, 3 };

These numbers still predict decisive victory for Tory.

Tory 10000 Ford 0 Chow 0 other 0

How much of Tory's share of the vote is attributable to strategic voting? I have no way of knowing. Is it possible that, without the strategic vote, Tory and Chow would split the anti-Ford vote exactly evenly? Yes, it's possible, but decidedly improbable. Still, at 32%, an even split of the anti-Ford vote between Tory and Chow, lets Doug win only 20% of 10,000 simulated elections (see above).

Should you vote strategically, then? Here's a guide:

- if you believe that Doug is going to pull 32% of the vote, AND
- you believe that Tory and Chow would split the rest of the vote equally, if not for strategic voting, AND
- giving Doug about a one-in-five chance of victory is too risky for you

then yeah, vote strategically. Honestly, though, anything other than a Tory mayoralty is really really unlikely at this point, so I still think you should just vote however you want. And if you want to vote "strategically," then go for it, but be aware that the math doesn't support you.