Skip to main content

Methodology

How The Northern Vibe Project works: plain English first, technical depth below.

By Matt Hickey · contact@northernvibe.ca

What Northern Vibe does

Northern Vibe projects the seat outcome of a Canadian federal election as of today. It combines national and regional polling averages with riding-level demographic baselines and economic indicator trends, then runs 10,000 simulated elections to produce a probability distribution over seat counts rather than a single point estimate. (The daily pre-computed run uses 10,000 simulations; live scenario runs on the map use 2,000.) The result is a range of plausible outcomes and a probability for each scenario (majority, minority, or opposition win), not a prediction that any one outcome will definitely happen.

Inputs

Polling aggregate. National and regional vote-intention polls going back to 2004, with a 21-day rolling window and exponential recency decay (14-day half-life). Each poll is house-effect-corrected before entering the average (see below).

Economic indicators. Real GDP growth, unemployment rate, and CPI from Statistics Canada. A Bayesian trajectory model (PyMC) translates these, alongside a media sentiment covariate (see Accountability below), into a medium-term support prior that grounds the short-term poll average.

2025 riding baselines. Certified GE45 results at the riding level provide the starting point for the simulation. Demographic covariates from the 2021 Statistics Canada Census (income, age, housing tenure, immigration share) shift the swing away from the national average in each riding.

Historical baseline

Every riding starts with its historical voting pattern (how people voted in 2021 and 2025), adjusted for who actually lives there. A riding full of renters in their twenties and thirties behaves differently than a rural riding with a large retiree population.

Polling & vote transfer

Polling data provides the national and regional mood. If the Liberals drop three points nationally, the model distributes that drop across ridings using empirically calibrated vote-transfer matrices: votes leaving one party flow to other parties in the proportions observed between the 2021 and 2025 election transitions, rather than being distributed uniformly. The simulation also applies structural regional corrections that national swing alone can't capture.

Why vote share doesn't predict seats

National vote share can move in the opposite direction from seat count. A party can lose two points of national support and still gain seats, or gain a point and lose seats. This isn't a quirk of the model. It reflects a structural feature of Canadian federal elections under first-past-the-post, and it is one of the most common sources of confusion when comparing two forecast scenarios.

Vote share is national; seats are local. A party can lose support concentrated in regions where it already wins every seat (or already loses every seat), with no effect on the seat count. Recent forecasts have shown the Liberals losing close to two points of national support while still gaining a small number of seats, because most of the drop occurred in Alberta and rural Saskatchewan, where the LPC seat count is near zero anyway.

Three-way races are sensitive to second-place support. When the NDP gains a point of support, those voters don't come uniformly from the Liberals. The vote-transfer matrix estimates that NDP gains pull disproportionately from CPC-leaning urban and suburban voters in Ontario. That cross-pressure can tighten LPC versus CPC marginals even when LPC's own vote share is falling.

Regional adjustments matter. The simulation applies calibrated regional intercepts on top of national swing: an Alberta CPC floor of 45%, a BC NDP baseline intercept, and an Atlantic uncertainty multiplier. These encode patterns visible in past elections that pure uniform swing misses.

The practical implication is that you cannot infer seat changes from vote share changes alone, and a forecast that does so will mislead. The seat projection on this site is computed riding by riding using local fundamentals, demographic transitions, and the vote-transfer matrix, then aggregated to the national total.

Monte Carlo simulation

To turn all of that into seat counts, the model runs 2,000 simulated elections per live scenario (the daily pre-computed run uses 10,000). Each simulation adds correlated randomness (ridings in the same province move together to reflect the province-level swings that happen on election night), then counts who wins each riding. The result is a probability distribution: not just "LPC wins 170 seats" but "LPC wins between 155 and 185 seats 80% of the time."

Scenario Builder

The Scenario Builder lets you apply your own assumptions on top of all of this. Shift the NDP up five points or collapse Liberal support nationwide. The simulation reruns immediately and the map updates. Click any riding to see its full probability breakdown, previous election results, and riding profile.

The results table reports five statistics for each party. Mean is the average seat count across all 2,000 simulated elections. p10 and p90 are the 10th and 90th percentiles: 80% of simulations produced a result within that range. Majority % is the share of simulations in which that party won 172 or more seats. Minority % is the share in which they won the most seats but fell short of a majority.

Volatility tiers

Volatility tiers appear in two places and mean slightly different things. On individual riding pages, the tier is based on the certified April 2025 election margin between first- and second-place finishers: TOSSUP (<5 pp), SWING (5–10 pp), LEAN (10–20 pp), SAFE (≥20 pp). On the map riding drawer, the tier reflects the current simulation: it is derived from the leading party's win probability across 2,000 simulated elections under the active scenario. This means the drawer tier updates as you move scenario sliders, giving a live read on how competitive each riding is under your assumptions rather than how it finished on election night.

Polling aggregator

The aggregate is a rolling 21-day weighted average: polls conducted closer to today receive more weight than older ones, following an exponential decay curve with a 14-day half-life that prioritises recency while still incorporating the signal in earlier surveys. The aggregator also applies a house effect correction: each polling firm's historical tendency to over- or under-estimate each party's support is estimated from past elections and subtracted before combining results. The 95% confidence interval shown in the polls table is derived from the spread of polls within the window. The aggregate refreshes automatically as new polls are published.

British Columbia runs on shorter numbers. BC is polled far less often than the country, and a fixed election date means the campaign lasts about a month. So the provincial average reacts faster than the federal one: a poll loses half its weight after seven days rather than fourteen, and we look back 28 days instead of 21 so there is still enough to average.

A few rules keep any one pollster from steering the average. Each firm counts once, through its most recent poll, and bigger, fresher polls count for more. Some firms report OneBC and CentreBC on their own while others lump them in with “Others”, so we average those three together and then split them using the polls that break them out. When polling goes quiet and fewer than three firms have published in the last four weeks, we reach back far enough to include three. We also correct for each firm’s track record in 2017, 2020 and 2024, and trust that correction less when it rests on fewer elections. For the Conservatives we only use 2024: in 2020 they were a 1.9% party, not the main opposition.

How much could the polls be off? We assume each party’s province-wide number could be off by about 3.5 points either way (one standard deviation). The polls have actually done better than that in the last three BC elections, missing the NDP by about 1.7 points and the main opposition by about 0.9, but three elections is not much to go on, so we deliberately leave room. The NDP and Conservative errors vary independently, which leaves roughly five points of uncertainty in the gap between them. How far a party can swing in a district also depends on how big it is there, so a party with no support somewhere can’t pick up phantom votes, and small parties get small swings. Surrey, Delta and Langley move together as their own region rather than with the rest of Metro Vancouver, which would otherwise be almost half the seats in one block.

Two judgement calls about the starting point. Independents who ran in 2024, many of them former BC United MLAs, are left out, and their votes are shared among the parties in line with how each district voted. And where the Greens didn’t run in 2024 but have a candidate this time, we start them at their usual share in that region instead of at zero.

Every Nova Scotia projection is "if an election were held today". The next election may be as late as December 2029, so these are not forecasts of that vote: they say what today's polls would mean in seats.

Nova Scotia runs on longer numbers. It is polled about once a month between elections, and has no fixed election date. So its average reacts more slowly than the federal one: a poll loses half its weight after 30 days rather than 14, and we look back 90 days so there are enough firms to average. When a campaign starts, it moves to BC's campaign settings.

Each firm counts once, through its most recent poll, and bigger, fresher polls count for more. We correct for each firm's track record in 2017, 2021 and 2024, and trust that correction less when it rests on fewer elections. Firms differ a lot in Nova Scotia, which is the reason for the correction: some have the NDP well ahead in the same month others have the PCs ahead.

Between elections, firms are corrected against each other. Each firm's measured lean has two parts: what it shares with every other firm, and how it differs from them. Every firm ran the PCs low in the final week of 2017, 2021 and 2024, but that shared error is an election-eve effect, and applying it two or three years out would move the whole average on the strength of three final weeks. So until a campaign starts, only each firm's lean relative to the others is applied; the shared part returns when the writ drops.

How much could the polls be off? We assume each party's province-wide number could be off by about 3.5 points either way (one standard deviation), the same floor BC uses. The polls' measured misses in Nova Scotia sit below it, but they have leaned the same way three elections running, understating the PCs by 2.6 to 4.3 points in the final week, and three elections is not much to go on.

The starting point is the certified 2024 result. Two districts did not exist then: Inverness was split in 2026 and Chéticamp-Margarees-Pleasant Bay created from its north. For those two, the 2024 and 2021 figures are estimates, built from the old district's polls that fall in each, and labelled as such. The June 2026 by-election in the new district is shown, but it is not the starting point: a by-election is a small, unusual vote. One party was missing from a 2024 ballot: the NDP ran nobody in Eastern Passage, where its 2021 candidate stood as an independent. Rather than start the NDP at zero there, we start it at its 2021 share in the district, moved by its province-wide change since.

An independent who won as an independent keeps their vote, if they stand. In BC, independents are left out of the starting point, because nobody knows who will run again. Cumberland North's MLA was elected as an independent in 2021 and 2024, so her 2024 vote stays with her in the simulations where she stands again. When a party's MLA retires, the party's vote stays on the ballot; when an independent does, the vote goes with her. So she stands in three simulations out of four: of the 55 MLAs Nova Scotia elected in 2021, 41 ran again in 2024.

Every Prince Edward Island projection is "if an election were held today". No election has been called. The next one is due by October 4, 2027, and can be called sooner, as three of the last four were. So these are not forecasts of that vote: they say what today's polls would mean in seats.

Prince Edward Island's average follows VoteLab's rules. The Island has one regular pollster, Narrative Research, and the occasional poll a party pays for, so keeping only each firm's latest poll, as Nova Scotia does, would leave the average resting on a single poll. Instead every poll from the past 180 days counts, weighted by its decided sample and by how recent it is, losing half its weight every 90 days. A poll a party commissioned counts at half weight. VoteLab will seed its own PEI models from this average, and sharing the rules keeps the two sites from disagreeing.

No house effects, and Others held still. With one regular firm there is nothing to measure a firm's lean against, so no correction is applied. Recent polls do not offer the Island Party by name, so a polled "Other" figure means different things in different polls; Others are held at their 2023 share instead.

How much could the polls be off? We measure it from the final-week polls of 2019 and 2023 (2015 had none in its last week), with the 3.5-point floor BC and Nova Scotia use. Both times the polls ran the PCs low, by 5.1 and 7.2 points, and the Greens high, so the PC and Green figures are wider: about 6.3 and 4.9 points. The model treats that lean as noise rather than shifting the average, because two elections are not enough to tell a pattern from luck.

The starting point is the certified 2023 result. Both 2019 and 2023 were fought on the 2017 map, so no district needs estimating. Five by-elections have been held since; they are shown on the district pages but are not the starting point, because a by-election is a small, unusual vote. Where a main party ran nobody in 2023 (the Liberals and the Greens each left two districts open), it starts from its 2019 share in that district, moved by its province-wide change since.

A floor under every party. No party is projected below a quarter of its own 2023 share in a district. The polls have the PCs far below their 2023 share, and a plain uniform swing that large takes them to nothing in seats they will still contest, when in practice a party's vote falls least, in points, where it was weakest. The rule is VoteLab's, chosen on its 2019 to 2023 backtest on this map.

A sitting independent. Gilles Arsenault was elected as a PC in Evangeline-Miscouche in 2023 and now sits as an independent. In each simulation the member keeps a share of that 2023 vote, drawn around 42% as for BC's independents, and stands again in three simulations out of four, Nova Scotia's figure.

Where the data comes from. The 2019 and 2023 results are VoteLab's extraction from Elections PEI's official reports, with its corrections, and the district map is the province's own. Census figures are built from the 2021 dissemination areas inside each district, each divided by where the district's registered electors live, since Statistics Canada publishes no profile for PEI's provincial districts.

Accountability

The Accountability page tracks how Canadian media assigns political blame and credit in real time. Every day the platform fetches political news headlines, classifies each article for relevance and framing, and scores whether coverage attributes economic conditions to government decisions or to forces beyond its control. Those scores are aggregated into a 28-day exponentially weighted signal (the attribution modifier) that feeds the forecast model as an additional directional input.

Each article's framing score subtracts an empirically calibrated 0.10 baseline from the government-responsibility signal to neutralize the classifier's structural tendency to register a small responsibility signal whenever government action is described, regardless of the article's actual attribution direction. The resulting signal is centred at zero, so positive readings indicate genuine Ottawa-side framing and negative readings indicate external-blame framing.

Source coverage. The national trajectory is computed from national-circulation outlets only: CBC, the Globe and Mail, National Post, iPolitics, National Observer, CTV News, The Conversation, plus a MediaCloud backfill restricted (by URL domain) to national outlets. The 35 provincial outlets added to the RSS pool in May 2026, and the regional outlets that appear in the MediaCloud corpus (Toronto Star, Hamilton Spectator, Winnipeg Free Press, BC and AB local papers, etc.), are tagged at the row level and routed to per-province readings rather than the national chart. As of 2026-10-10, the chart draws on 3,565 national articles published between 2024-04-02 and today: 2,143 from the MediaCloud political-news index and 1,422 from the daily RSS pipeline.

Smoothing. The daily attribution signal is smoothed in two stages. First, articles are aggregated into a 28-day exponentially weighted moving average (half-life 14 days) at the data layer. Second, the chart bins those daily values into ISO weeks and applies a 9-week sliding average, so each plotted point reflects roughly two months of underlying coverage. The combined smoothing damps day-to-day news-cycle noise while preserving multi-month political arcs.

Date provenance. Each article's publication date carries a date_provenance field recording how it was determined. Sources, in order of authority: rss_publish_date (RSS feed's declared <pubDate>), html_meta (the publisher's article:published_time meta tag or JSON-LD datePublished), url_path (parsed from /YYYY/MM/DD/ slugs in the URL), mediacloud_api (the MediaCloud index's own publish_date), or wayback (Internet Archive's first snapshot, accurate within 1–3 days). Current breakdown of the national pool: HTML metadata 33%, RSS pubDate 9%, MediaCloud API 20%, URL path 3%, Wayback 0%. A further 4% are MediaCloud rows from before May 2026 whose real publish date could not be recovered; these are flagged fetch_window_estimated and remain pinned to the start of their original 30-day backfill window. The remaining 31% are older rows ingested before the provenance field existed, and carry no provenance flag. The window-start fallback was the result of a MediaCloud client-library bug that silently misdated articles; the bug is fixed prospectively (#619) and new MediaCloud ingests use the API's real publish_date.

Economic forecast

The Forecast page projects where the parties are likely to stand 1, 3, and 6 months from now, with calibrated uncertainty bands that widen with each horizon. A Bayesian trajectory model (PyMC) is trained on economic time series (inflation, unemployment, housing starts, governing-party tenure) with a media sentiment covariate (valence signal, γ ≈ 0.05) that nudges the fundamental level up or down based on the tone of political news coverage. The model output is blended with current polling to produce forward-looking support estimates.

The sentiment covariate enters the Bayesian model directly as a fitted parameter (γ_valence); it is not a post-hoc adjustment. Its posterior mean is positive and its 94% credible interval is mostly above zero, meaning favourable media coverage is associated with modestly higher governing-party support in the model. Economic fundamentals dominate over the medium term; the sentiment effect is intentionally modest.

By-election open-seat adjustments

When a sitting MP does not contest a by-election, the model applies two literature-calibrated corrections. First, the personal-vote incumbency bonus (3.2 pp, derived from Blais et al. 2003) is removed, since that bonus is tied to the individual MP, not the party. Second, a retirement adjustment is applied: long-serving MPs accumulate an additional personal vote of roughly 0.5–1 pp per electoral cycle (Cain, Ferejohn & Fiorina 1987; Kendall & Rekkas 2012), which also disappears on retirement. For ridings where the departing MP's personal positioning attracted voters who would not otherwise support the party, a BQ recovery adjustment is also applied where appropriate. All parameters carry citation comments in the source code.

Members who change parties

Seven MLAs elected as Conservatives in 2024 now sit somewhere else: three as independents, two with OneBC, one with CentreBC and one with the NDP. Some of their personal support will follow them, and the model tries to account for that.

How depends on where they went. When a member joins a party that already had voters in the district, as Penticton-Summerland's MLA did by moving to the NDP, we add a standard incumbency boost of a few points. When the new party had no voters there at all, as with OneBC, CentreBC or sitting as an independent, a flat boost would make no sense. Instead the member takes a share of their own 2024 vote with them, 42% on average, and the Conservatives lose the same amount in that district. Six of the seven seats work this way.

This moves votes around. It doesn’t invent them. The polls already count these members’ supporters under their new parties, so we make sure the Conservatives don’t lose those voters twice. After placing each member’s support in their own district, the model adjusts the province-wide numbers so every party still matches the polls. The member keeps their local support. The Conservatives get back what would otherwise have been counted twice, spread across the rest of the province. And OneBC and CentreBC end up with most of their vote in the seats their MLAs hold, which is where you’d expect it. Independents count as part of the polls’ “Others”, since that’s where pollsters put them.

Nova Scotia's floor-crosser. Lunenburg West's MLA was elected as a PC in 2024 and now sits as a Liberal. The Liberals already had voters there, so she takes the standard incumbency boost of a few points to her new party, the rule BC uses for a member who joins an established party. That figure comes from the literature and BC, not from Nova Scotia, and is not yet calibrated here.

Prince Edward Island's by-election gains. Three seats changed party at by-elections: the Greens took Borden-Kinkora and Cornwall-Meadowbank, and the Liberals took Charlottetown-Hillsborough Park. Each new member carries the standard incumbency boost of a few points to their party, the rule BC uses for a member who joins an established party.

Where does 42% come from? The 2024 election. When BC United collapsed mid-campaign, six of its MLAs ran without a party and kept between 36% and 52% of their previous vote, with a median of 42%.

We use the same rate whatever party a member joins. The seven MLAs who switched to the Conservatives in 2024 actually gained votes, a median of 129% of their old share, but moving to OneBC or CentreBC today looks more like those independents than like joining a party on the rise.

We don't pretend to know it exactly. Six MLAs in one election is thin evidence for a number that can decide seven seats, so every simulation picks its own rate, centred on 42% and usually somewhere between 19% and 67%. That is much wider than the six 2024 results, which landed within a few points of each other. They agreed with each other, but that says little about how a different set of MLAs, in different parties, will do.

What the model can't know yet is who will actually run. A member who doesn't stand again hands their support back to the party they left. Two of the three independents have said they're running. And outside these MLAs' own seats, the model can't tell where OneBC or CentreBC might be strong. Neither ran in 2024, so we spread their support in line with Conservative strength, which is where their voters came from but may not be where they are now.

How uncertainty is modelled

Every simulated election draws a national vote share from a multivariate normal distribution centred on the current poll average. The variance has two components added in quadrature: the estimation variance from the polling window itself, and a systematic polling error calibrated from past elections.

Systematic polling error (RMSE) is estimated from the gap between the final 7-day poll average and the certified result across all six federal elections from 2008 to 2025:

PartyPolling RMSE (pp)
LPC1.8pp
CPC2.9pp
NDP2.0pp
BQ0.5pp
GPC1.0pp
PPC1.2pp

Calibrated across 6 federal elections (2008–2025). Regenerated against certified results after each election.

A province-level correlation structure is also applied so that ridings within the same province move together, reflecting shared regional events rather than independent noise.

Pollster house effects

Every polling firm has a characteristic "house effect": a tendency to over- or under-estimate each party's support relative to the final certified result. This can arise from differences in methodology (phone vs. online), sample weighting, and how undecided voters are handled. If uncorrected, combining polls from multiple firms can amplify a systematic bias in one direction.

We estimate house effects from each firm's final-week polls before GE44 (2021) and GE45 (2025) and apply James-Stein shrinkage: when the sample of past elections is small, the correction is pulled toward zero, so that sparse data produces a modest adjustment rather than an overfit one. The table below shows the current computed adjustments:

PollsterLPCCPCNDPBQGPCPPC
Abacus Data-0.5-0.9+1.0-0.2+0.1+0.3
Angus Reid-0.4-0.6+0.3—+0.1—
Ekos Research-0.2-1.2+0.5-0.4+0.4+0.7
Forum Research-0.6-0.5-0.0-0.2+0.2+0.8
Ipsos-0.6-0.8+0.8-0.1+0.2-0.1
Liaison Strategies-0.2-0.4+0.2-0.1+0.0+0.1
Léger-0.3-0.5+0.4-0.1+0.1+0.3
Mainstreet Research-0.4-0.5+0.2-0.3+0.1+0.7
Nanos Research-0.4-0.9+0.6-0.2+0.5+0.3

pp = percentage points. Positive = firm historically over-predicts this party; the aggregator subtracts this before computing the rolling average. "—" = insufficient data to estimate a correction for this firm/party combination.

What the model does not do

Northern Vibe does not incorporate real-time news sentiment during live campaigns. The accountability tracker reads daily Canadian political headlines to produce a directional modifier, but this is an attribution index based on media framing, not a real-time waveform of campaign events. During an active campaign, the poll aggregate is the dominant input.

The model does not use internal party data, private polling, constituency canvass returns, or any non-public information. All inputs are from publicly available sources listed in the data sources section below.

Track record

The honest test of a forecast is out-of-sample: does it work when it has never seen the answer? We validated the model on GE45 (April 28, 2025) by giving it only what a forecaster would have had beforehand — each riding's 2021 result as a baseline plus the final pre-election national poll average — and asking it to project a winner in every riding. It called 88.0% of ridings correctly (301 of 342), beating a naive “2021 winner holds” baseline of 83.3%, with a national vote-share error of 0.87pp. No 2025 result touched any prediction; the certified outcome was used only to score the calls.

Full results and the regional breakdown are on the Model Accuracy page. The backtest is a single auditable script, simulation/backtest_ge45_oos.py.

British Columbia, tested the same way. We ran the provincial model forward from the 2020 result, using only polls published before the 2024 vote, with pollster corrections worked out from 2017 and 2020 alone so the answer couldn't leak in. It called 86.0% of districts correctly (80 of 93), against 79.6% if you simply assumed every 2020 winner held on. It missed the average party's vote by 1.23 points, and every seat total landed inside its range: 49.1 against 47 actual for the NDP, 42.6 against 44 for the Conservatives. The script is simulation/bc/backtest_2024.py. Some fair caveats. 2024 was close to a two-party race, so this doesn't test OneBC, CentreBC or MLAs switching parties. The model was also too sure of itself at the top end: of the 80 districts it called with 90% or more confidence, it got 72 right. And we chose the uncertainty settings with this test in front of us, so read it as evidence the machinery works, not as an independent audit.

Nova Scotia, tested the same way. Run forward from the 2021 result on polls published before the 2024 vote, with pollster corrections from 2017 and 2021 alone, the model called 54 of 56 districts (96.4%), against 69.6% for "every 2021 winner holds". It missed the average party's vote by 1.67 points. It missed Sackville-Cobequid, and Halifax Atlantic, whose 2021 Liberal MLA had crossed to the PCs before the vote, something a 2021 starting point cannot know. The script is simulation/ns/backtest_2024.py.

Prince Edward Island, tested the same way. Run forward from the 2019 result on polls published before the 2023 vote, with polling error measured on 2015 and 2019 alone, the model called 21 of 26 districts (80.8%), against 65.4% for "every 2019 winner holds". It missed the average party's vote by 2.01 points, and every party's seat total landed within a seat of the result. District 9 is left out: its 2019 vote was held in July after a candidate died, so it is a different election from the other 26. The script is simulation/pe/backtest_2023.py.

Honest limitations

Riding-level accuracy is validated on one general election (GE45). One election is not enough to make strong statistical claims about interval calibration. Whether the 80% bands really contain the true outcome 80% of the time requires many more observations. The current results are encouraging but not conclusive evidence of correct calibration.

National polls carry a ±2–3% margin of error that compounds at the riding level. The model faithfully reproduces the uncertainty in the polls; it does not add or reduce it. If the polls are wrong, the model will be wrong in the same direction.

Demographic data is from the 2021 Census. Fast-growing ridings and those that have seen significant demographic change since 2021 may carry larger errors than the aggregate suggests.

By-election open-seat effects use literature-calibrated retirement adjustments. Candidate quality, local profile, and campaign spending beyond incumbency are not modelled.

Model decision log

Changes to model parameters are documented publicly in docs/model_decisions.md. We do not adjust parameters retroactively to improve past accuracy figures.

How to verify the numbers

The scoring/ directory in the GitHub repository contains a self-contained Python script that reproduces every metric on the accuracy page (MAE, riding call accuracy, 80% band coverage, and the missed-riding list) from a frozen fixture file and the Elections Canada certified results CSV. No simulation imports required:

python scoring/evaluate.py

Data sources

SourceWhat it feeds
Elections CanadaRiding boundaries, 2021 & 2025 candidate results, EDA campaign finance (2025)
Statistics Canada (2021 Census)Demographics per riding: income, age, housing tenure, immigration, education, commuting, industry; rent baseline scaled to CMHC 2025 CMA prices
Statistics Canada (Web Data Service)Economic indicators: real GDP growth, unemployment rate, CPI
Statistics Canada (Crime Severity Index)CMA-level crime severity, rescaled to national average = 100
CRA (Individual Tax Statistics by FSA)Tax filer median income, government transfer dependency, EI & benefits recipients, RRSP contributors
CMHCNew housing construction starts by metro area (CMA-level)
IRCCAnnual permanent residents admitted per CMA, distributed to ridings by population
CRTC (National Broadband Data)% of households without 50/10 Mbps broadband service, by riding
NRCan (National Fire Database)Wildfire exposure index per riding (2015–2024), indexed to national average = 100
NRCan (Flood Susceptibility Mapping)Mean flood susceptibility index per riding (2000–2023 raster)
NRCan (Atlas of Canada 1:1,000,000)Coastlines, lakes and islands on the share-card maps. Contains information licensed under the Open Government Licence – Canada
Pollster Audit API + Polling CanadaNational & regional vote-intention polls (2004–present)
Nanos Research, Angus Reid, EnvironicsIssue salience polling: cost of living, housing, healthcare, Canada–US relations
OurCommons.caMP Hill office contact information (phone & email)
Government of Canada (Proactive Disclosure)Federal grants & contributions by riding, all fiscal years available
MediaCloudCanadian political news headlines: vibe score & party attribution classifier