Releasing Our 2026 House Forecast
With primary season coming to an end and candidates shifting into gear for the November general, the upcoming midterms and their results are anticipated by everyone from analysts to activists to degenerate gamblers. As we head into general election season, we here at SnoutCounter (and by “we” I mean myself, I’m the only person here) are proud to announce the release of our (my) House forecast, with Senate and gubernatorial forecasts in the works as well. As of the day this is being released, my House forecast gives Democrats a 66% chance of winning the House, with them winning, on average, 230 seats. This is a notably more bearish forecast than most for Democrats, with my projections being comparable to those of DDHQ and ElectIndex while being significantly more bearish than The Silver Bulletin/FLIPR, The Economist, and FiftyPlusOne. I recommend that you track multiple forecasts and view them holistically rather than relying on any one individual forecast, especially given the large variation in predictions for some seats in particular. Nevertheless, my model is in line with other predictions of a blue wave this year as consumer sentiment sours and Trump’s approval rating reaches its lowest point out of either of his two administrations.
My forecast is powered by a hierarchical Bayesian linear regression model. The code for this model is fully open source and is available at the GitHub repo page. Below is the specification for the model that powers the SnoutCounter House forecast.
\[\begin{aligned}\\ y_{st} = \beta_1b_{st}+\beta_2F_{st}+\beta_3I_{st}+\beta_4\rho_{t-1}F_{st}+\beta_5\rho_{t-1}I_{st}+\beta_6s_{st}+\beta_7n_{st}p_{st}+\beta_8n_{st}b_{st}+\beta_9n_{st}F_{st}+\\ \beta_{10}n_{st}I_{st}+\beta_{11}n_{st}s_{st}+d_t+r_t+\epsilon_t+\alpha_{st}+\gamma_{rt}+\delta_{ct} \end{aligned}\] That’s a lot of mathematical notation! So let’s break this model down into its constituent parts.
- \(y_{st}\) is the response variable, specified as \(y_{st}=v_{st}-50\), where \(v_{st}\) is the two-party Democratic vote share for congressional district \(s\) and election cycle \(t\). Setting \(y_{st}\) as the target is equivalent to setting \(v_{st}\) as the target and fixing the intercept term to \(\beta_0=50\).
- \(\beta_i\) with \(i\in[1,11]\) are the regression coefficients.
- \(b_{st}\) is the “baseline,” an estimate of how the district should vote solely based on PVI and generic ballot. The PVI is calculated as \(l_{st}=0.75(v_{s,t-1}-p_{t-1})+0.25(v_{s,t-2}-p_{t-2})\), where \(v_{st}\) is the two-party Democratic voteshare for seat \(s\) in cycle \(t\) and \(p_{t}\) is the two-party Democratic share of the popular vote for president in year \(t\) - this is the same formula used by Cook Political. The generic ballot term utilized is the margin between Republicans and Democrats in the SnoutCounter generic ballot polling average - you can find how that average is calculated here. We calculate the baseline as \(b_{st}=2l_{st}-G_{t}\), where \(l_{st}\) is the PVI and \(G_{t}\) is the generic ballot margin for year \(t\). I multiply the PVI by 2 as the number is a measure of how the district leans in terms of Democratic two-party voteshare - for instance, a district with a PVI of D+1 is estimated to have 51% of its voteshare go to the Democrat in a perfectly even national environment, and all other factors held equal. Thus, a PVI of D+1 implies a margin of D+2. We also swap the sign on \(G_{t}\) as it is calculated as the Republican polling average minus the Democratic polling average, i.e. \(G_{t}\) is negative when Democrats have the advantage, whereas \(l_{st}\) is positive when Democrats have the advantage in seat \(s\).
- \(F_{st}\) represents fundraising for a seat-level race. It is calculated as the difference between percentages of individual contributions donated to the Democrat and the Republican. \(F_{st}\) is positive if the Democrat has received a greater share of individual contributions than the Republican, and is set to zero if neither the Democrat or Republican have filed with the FEC, or if neither candidate has been determined (i.e. pending a primary election result).
- \(I_{st}\) represents incumbency. It is set to 1 if the Democrat is the incumbent, -1 if the Republican is the incumbent, and 0 if neither or both candidates are incumbents.
- \(\rho_{t}\) represents polarization. It is calculated as the correlation between two-party Democratic voteshare for the most recent presidential election and the two-party Democratic voteshare in House elections in cycle \(t\). Incumbency and fundraising generally tend to have lesser influence in more polarized cycles, so I utilize this term to adjust their influence in accordance with polarization.
- \(s_{st}\) is the “net scandal score” for a certain race. Each politician in a race is assigned a “scandal score”, which counts up the number of scandals that the aforementioned politician has faced over the course of their political career, weighted by an exponential decay function to place less weight on older scandals that a politician has weathered. The net scandal score is the scandal score of the Democrat minus the scandal score of the Republican.
- \(n_{st}\) and \(p_{st}\) relate to the race-level polling for seat \(s\). \(n_{st}\) is calculated as \(n_{st}=\sqrt{N_{st}}\), where \(N_{st}\) is a the effective number of polls (ENOP) - essentially, the number of polls weighted by pollster quality and recency. A race with more polls, higher quality polls, and that has been polled more recently will have a higher ENOP. \(p_{st}\) is simply the margin between the Republican and the Democrat in the polling average for the race in question. Due to time constraints, I don’t calculate “fancy” polling averages for House races like I do for presidential approval and generic ballot - instead, I calculate a simpler weighted average of all polls, weighting by sample size, pollster quality, and recency, and downweighting partisan-sponsored and internal polls. The higher the ENOP of a race, the more weight is placed on race-level polling in the forecast, and the less weight is placed on fundamentals.
- \(d_t\) and \(r_t\) are random intercept terms that correspond with the Democratic and Republican candidate, respectively. These account for routine electoral over- (e.g. Marie Gluesenkamp Perez) and under-performers (e.g. Marjorie Taylor Greene).
- \(\epsilon_t\) is a random intercept term that accounts for cycle-level error, e.g. industry-wide systemic polling error, like that which occurred in 2020. This term accounts for approximately 2.5 points of error on the margin.
- \(\alpha_{st}\) is a random intercept term that accounts for state-level error, e.g. idiosyncratic trends at the state level, such as the localized red waves in New York and Florida in 2022. This term accounts for approximately 3.2 points of error on the margin.
- \(\gamma_{rt}\) is a random intercept term that accounts for region-level error. For instance, if the Democrat generally overperforms in the Midwest, this random intercept will capture that. I utilize census regions for this term. This term accounts for approximately 1.2 points of error on the margin.
- \(\delta_{ct}\) is a random intercept term that accounts for error at the level of a “demographic cluster.” I constructed a k-means clustering algorithm to categorize all districts in the training data into seven clusters based on racial composition, educational attainment, and urbanization. This accounts for idiosyncratic trends among certain demographics, for instance the right-ward swing of Hispanic voters in 2024, or the left-ward swing of college-educated voters in 2018. This term accounts for approximately 2.7 points of error.
The non-candidate random effects \(\epsilon_t\), \(\alpha_{st}\), \(\gamma_{rt}\), \(\delta_{ct}\) account for the fact that errors are spatially correlated in elections, which is especially helpful for posterior simulation. I train this model on all House elections from 2014-2024 (excluding seats that were not contested by one party for whatever reason). Certain independents (for example, Cara Mund in 2022 and Bill Hill in 2026) are considered to be part of one party or the other for training and prediction reasons. For states that utilize ranked-choice voting (Alaska since 2022 and Maine since 2018), I utilize the maximum round results in training and validation. I set the priors for the coefficients to auto-scaled student’s t distributions, which accounts for outliers and heteroskedasticity, and utilize Markov chain Monte Carlo sampling to fit the model and generate 20,000 simulations of how the upcoming House elections could go.
This model, of course, doesn’t exist in a vacuum - it didn’t just fall out of a coconut tree. I consulted a variety of sources when constructing this forecast, notably Lauderdale & Linzer 2015, Louit, Ram et al 2022, Johnson et al’s Bayes Rules!, Stock & Watson’s Introduction to Econometrics, Angrist & Pischke’s Mostly Harmless Econometrics, and the methodology articles of various professional forecasts.
And that’s about it! I don’t plan on making any major changes to my model, unless I stumble upon a bug or major methodological/statistical issue. If you find any bugs, errors or uncited sources, or have any suggestions, feel free to open an issue on the GitHub repo page (when that is made public).
Updates
- September 1, 2026: I corrected some case inconsistencies in candidate names in the training set (which affect candidate random intercepts) and have re-trained the model accordingly. This only has a very small effect on the forecast.
- August 31, 2026: I found a bug that incorrectly marked AZ-04 as having a Republican incumbent instead of the current Democratic incumbent, Greg Stanton. That error has been fixed.