Quant Memo
Core

The Frisch-Waugh-Lovell Theorem

A result showing that a coefficient in a multi-variable regression can be obtained by first stripping ("partialling out") every other variable's influence from both the target and the variable of interest, then running a simple one-variable regression on what's left — the same answer either way.

Prerequisites: The Classical Linear Regression Assumptions, Multicollinearity

A quant regressing stock returns on five factors wants to understand what the momentum coefficient really means, isolated from the other four factors it's correlated with. Running the full five-variable regression gives an answer, but it's a black box — you can't see how the momentum coefficient is actually being purified of the other factors' influence. The Frisch-Waugh-Lovell theorem says you don't have to take that on faith: you can get the exact same coefficient by first "cleaning" both the returns and the momentum factor of everything the other four factors explain, and then running a plain single-variable regression on the leftovers. Same number, but now you can see exactly what's driving it.

An analogy: correcting for height before comparing weight

Suppose you want to know whether weight is related to exercise habits, but taller people tend to weigh more regardless of exercise, and you want that height effect out of the way first. One approach: regress weight on both height and exercise together, and read off the exercise coefficient. An equivalent approach: first regress weight on height alone and keep only the leftover ("weight after removing what height explains"), then separately regress exercise on height alone and keep its leftover too, and finally regress the leftover weight on the leftover exercise. Both routes give the identical coefficient on exercise — the second route just makes visible, step by step, exactly what "controlling for height" is doing to both variables before they're compared.

The mechanics, one symbol at a time

Consider a regression of yy on two blocks of regressors, x1x_1 (the variable of interest) and X2X_2 (all the other controls): y=β1x1+X2β2+εy = \beta_1 x_1 + X_2 \beta_2 + \varepsilon. Let y~\tilde{y} be the residuals from regressing yy on X2X_2 alone (the part of yy that X2X_2 can't explain), and let x~1\tilde{x}_1 be the residuals from regressing x1x_1 on X2X_2 alone (the part of x1x_1 that X2X_2 can't explain). The Frisch-Waugh-Lovell theorem states:

β^1=x~1y~x~12,\hat{\beta}_1 = \frac{\sum \tilde{x}_1 \tilde{y}}{\sum \tilde{x}_1^2},

which is exactly the OLS slope from a simple regression of y~\tilde{y} on x~1\tilde{x}_1 alone — and it is numerically identical to the β^1\hat{\beta}_1 you'd get from the original full multi-variable regression. In plain English: strip out from both yy and x1x_1 everything the other controls already explain, and whatever relationship remains between the two leftovers is the multi-variable coefficient — nothing is lost or changed by doing it in two simple steps instead of one complicated one.

Worked example 1: two factors by hand

A small dataset has 5 months of returns yy, a momentum factor x1x_1, and a value factor x2x_2. Suppose regressing x1x_1 on x2x_2 gives residuals x~1=[2,1,0,3,4]\tilde{x}_1 = [2, -1, 0, 3, -4] (the part of momentum not explained by value), and regressing yy on x2x_2 gives residuals y~=[3,1.5,0.2,4,5.5]\tilde{y} = [3, -1.5, 0.2, 4, -5.5] (the part of returns not explained by value). The FWL coefficient on momentum is:

β^1=(2)(3)+(1)(1.5)+(0)(0.2)+(3)(4)+(4)(5.5)22+(1)2+02+32+(4)2=6+1.5+0+12+224+1+0+9+16=41.5301.383.\hat{\beta}_1 = \frac{(2)(3) + (-1)(-1.5) + (0)(0.2) + (3)(4) + (-4)(-5.5)}{2^2 + (-1)^2 + 0^2 + 3^2 + (-4)^2} = \frac{6 + 1.5 + 0 + 12 + 22}{4+1+0+9+16} = \frac{41.5}{30} \approx 1.383 .

Running the full two-variable regression of yy on x1x_1 and x2x_2 together on the original data would produce this exact same 1.383 coefficient on momentum — FWL just made the computation transparent by isolating the piece of each variable that value doesn't already explain.

Worked example 2: what "controlling for" actually removes

A researcher regresses a strategy's daily P&L on trade count while controlling for market volatility (a known driver of both). Before partialling out volatility, the raw correlation between P&L and trade count looks strongly positive — but much of that is because high-volatility days independently produce both more trades and more P&L opportunity. After regressing both P&L and trade count on volatility alone and keeping only the residuals — the part of each variable volatility can't explain — the leftover relationship between residual P&L and residual trade count shrinks to a much smaller, more modest coefficient. FWL makes explicit that the "controlling for volatility" step is literally the act of computing these two residual series before comparing them; the modest leftover coefficient is what remains of the trade-count effect once the shared driver, volatility, has been subtracted out of both sides.

Regression explorer
amber = residuals
fitted slope 1.133true slope 1.00 0.642SSres 42.0

Picture running this on the residuals: drag points representing x~1\tilde{x}_1 against y~\tilde{y} (already stripped of the other controls) and watch the fitted slope — that slope is exactly the multi-variable coefficient the full regression would report.

y regressed on x1 and X2 together coefficient on x1 = β̂₁ residualize y on X2 → ỹ residualize x1 on X2 → x̃1 simple regression of ỹ on x̃1 = same β̂₁ FWL: both paths give the identical answer
The full multivariate regression and the "partial out, then regress the leftovers" route are not approximations of each other — they produce exactly the same coefficient, by algebraic identity.

What this means in practice

Frisch-Waugh-Lovell is the theoretical justification behind "controlling for" language in factor models, event studies, and panel regressions with fixed effects: demeaning a variable within groups (see Panel Data and Fixed Effects) is a special case of FWL where X2X_2 is a set of group-indicator dummy variables, and the demeaned regression gives the same coefficients as including the dummies explicitly. It's also a practical computational shortcut — when X2X_2 contains hundreds of fixed-effect dummies, sweeping them out via residualization is far cheaper than inverting a huge design matrix directly, and many statistical packages use exactly this trick under the hood.

The coefficient on one variable in a multi-variable regression is identical to the coefficient from a simple regression of the residualized outcome on the residualized variable, after both have had every other regressor's explanatory power removed — "controlling for" other variables literally means partialling them out of both sides before comparing what's left.

The classic mistake is assuming residualizing only the variable of interest, but not the outcome, still gives the right answer — or skipping the second residualization step and regressing x~1\tilde{x}_1 against the raw yy. FWL requires both yy and x1x_1 to be stripped of X2X_2's influence; residualizing only one side produces a different, generally wrong coefficient, because the leftover correlation with X2X_2 still contaminates whichever side wasn't cleaned.

Related concepts

Practice in interviews

Further reading

  • Frisch & Waugh, 'Partial time regressions as compared with individual trends', Econometrica 1933
  • Lovell, 'Seasonal adjustment of economic time series', JASA 1963
ShareTwitterLinkedIn