Last week, I attended a conference in Greece organized by the University of Piraeus. During the conference, an economist from the Bundesbank told me that this blog was very useful for applied work. This encouraged me to write a new post connected to my latest NBER Working Paper, US Monetary Spillovers, Foreign Exchange, and Gold Reserves at Times of Geopolitical Fragmentation, coauthored with Joshua Aizenman, Gazi Salah Uddin, and Naoki Yago. The paper uses local projections to study high-frequency exchange-rate responses to FOMC monetary-policy surprises, and it naturally raises a broader methodological question: how should we evaluate statistical significance after a shock or a treatment? The main point of this post is that, as emphasized by Jordà and Taylor (2025) in their Journal of Economic Literature article on local projections, the effect of a shock is a dynamic response path, not a collection of unrelated horizon-by-horizon coefficients. Therefore, when the empirical question is whether the shock or intervention had an effect after it occurred, inference should be conducted jointly over the relevant post-shock horizons rather than only horizon by horizon.
Local projections are now a standard tool in empirical macroeconomics. They are especially useful when we want to estimate the dynamic effect of a treatment, intervention, or shock. In a monetary-policy application, for example, we may want to know how output, prices, exchange rates, or financial variables respond over several horizons after a monetary-policy surprise.
The basic idea is simple. Instead of estimating one dynamic system, we estimate one regression for each horizon:
\[ y_{i,t+h}-y_{i,t-1} = \alpha_h + \theta_h S_t + X_{i,t-1}’\beta_h + D_i + \varepsilon_{i,t+h}, \qquad h=0,1,\ldots,H. \]Here, \(S_t\) is the shock or treatment, and \(\theta_h\) is the response at horizon \(h\). The sequence
\[ \left\{\theta_0,\theta_1,\ldots,\theta_H\right\} \]is the impulse-response path. Jordà and Taylor (2025) emphasize that local projections should be interpreted as estimates of dynamic response paths, not as a collection of unrelated coefficients. This point is important for inference.
1. The problem with pointwise significance
In many empirical papers, local-projection figures show a line surrounded by pointwise confidence intervals. A pointwise confidence interval at horizon \(h\) answers a narrow question:
\[ H_{0,h}: \theta_h=0. \]This is useful, but it is not the same as asking whether the response is jointly significant after the shock. A pointwise test says: “Is the response significant at this particular horizon?” A joint test says: “Is the response path significant over the post-shock window?”
This distinction matters because local projections produce many coefficients. If we estimate responses from \(h=0\) to \(h=20\), we have 21 post-shock coefficients. Looking at 21 separate pointwise tests is not the same as conducting one test of the dynamic response.
The reason is simple. If we test many horizons one by one, we increase the chance of finding at least one apparently significant coefficient by chance. If the 21 tests were independent, the probability of at least one false rejection at the 5 percent level would be:
\[ 1-(1-0.05)^{21} = 1-0.95^{21} \simeq 0.66. \]In local projections, the coefficients are not independent, so this calculation is only illustrative. But the lesson remains: pointwise significance is not a path-level test.
2. Why local-projection coefficients are correlated across horizons
The horizon-specific regressions in local projections are estimated separately, but they are not statistically unrelated. The same observations, the same shock, and closely related dependent variables are used across horizons.
For example, if the outcome is a cumulative exchange-rate change,
\[ y_{i,t+h}-y_{i,t-1}, \]then the dependent variable at horizon \(h=10\) overlaps mechanically with the dependent variable at horizon \(h=11\). The regression errors across horizons are therefore correlated. As a result, the coefficient estimates
\[ \widehat{\theta}_0,\widehat{\theta}_1,\ldots,\widehat{\theta}_H \]have a joint variance-covariance matrix. A proper test of the response path should use that covariance matrix.
3. The correct post-shock question
Suppose we want to test whether the treatment or shock has any post-shock effect between horizons 0 and 20. The relevant null hypothesis is:
\[ H_0: \theta_0=\theta_1=\cdots=\theta_{20}=0. \]Equivalently:
\[ H_0: \theta_h=0 \quad \text{for all} \quad h=0,1,\ldots,20. \]Rejecting this null does not mean that every individual horizon is statistically significant. It means that the response path is jointly different from zero over the post-shock window.
| Inference object | Question answered |
|---|---|
| Pointwise confidence interval | Is the response significant at one horizon? |
| Joint Wald test | Is the post-shock response path jointly different from zero? |
This is why joint tests are especially useful in local-projection work. The economic object is often a dynamic path, not one isolated coefficient.
4. A treatment-effect example
Consider a treatment or shock \(S_t\). We estimate:
\[ y_{i,t+h}-y_{i,t-1} = \alpha_h + \theta_h S_t + X_{i,t-1}’\beta_h + D_i + \varepsilon_{i,t+h}. \]The joint post-treatment test is:
\[ H_0: \theta_h=0 \quad \forall h \in \{0,1,\ldots,H\}. \]If this null is rejected, the treatment has a jointly significant dynamic effect over the post-treatment window.
5. An interaction example
In many macro-finance applications, the response to a shock depends on a predetermined state variable. Suppose the regression is:
\[ y_{i,t+h}-y_{i,t-1} = \alpha_h + \beta_h S_t + \gamma_h R_{i,t-1} + \delta_h(S_t \times R_{i,t-1}) + D_i + \varepsilon_{i,t+h}. \]Here, \(R_{i,t-1}\) may be a reserve measure, a debt ratio, a vulnerability index, or any predetermined state variable. The marginal effect of \(R_{i,t-1}\) after a shock of size \(S_t=1\) is:
\[ m_h = \left. \frac{\partial E[y_{i,t+h}-y_{i,t-1}]}{\partial R_{i,t-1}} \right|_{S_t=1} = \gamma_h+\delta_h. \]The joint post-shock null becomes:
\[ H_0: m_h=0 \quad \forall h=0,1,\ldots,20, \]or equivalently:
\[ H_0: \gamma_h+\delta_h=0 \quad \forall h=0,1,\ldots,20. \]This is the object we need to test if the figure plots the marginal effect evaluated at \(S_t=1\).
6. Why use suest in Stata?
A local projection is estimated horizon by horizon. Stata therefore stores one regression for \(h=0\), another for \(h=1\), and so on. To test a restriction across all horizons, we need the covariance matrix across these regressions.
The Stata command suest combines stored estimation results into a joint parameter vector and a joint variance-covariance matrix. This makes it possible to run Wald tests across equations. In the local-projection context, each horizon is one equation.
One practical detail is important: suest requires that Stata can generate equation-level scores. Commands such as reghdfe are not directly compatible with suest. A simple solution is to re-estimate the same specification using regress with fixed effects included as factor variables, for example i.currencyid.
7. Stata code: joint post-shock test
The following code tests whether the post-shock marginal effects are jointly zero from horizon 0 to horizon 20. The example uses a monetary-policy shock variable mps_orth10, a reserve variable l_resusdgdp_std, and two dollar-exposure controls, l_liability_usd_std and l_import_usd_std.
*------------------------------------------------------------
* Joint Wald test after the shock: h = 0,...,20
*------------------------------------------------------------
preserve
estimates clear
local models
forv h = 0/20 {
quietly regress ds`h' ///
c.mps_orth10##c.(l_resusdgdp_std ///
l_liability_usd_std l_import_usd_std) ///
i.currencyid
estimates store post`h'
local models `models' post`h'
}
* Combine horizon-specific regressions.
* Cluster at the shock-date level here, not inside each regression.
quietly suest `models', vce(cluster date)
* Joint null:
* marginal effect of l_resusdgdp_std at mps_orth10 = 1
* equals zero at every post-shock horizon.
local joint
forv h = 0/20 {
local joint `joint' ///
([post`h'_mean]l_resusdgdp_std + ///
[post`h'_mean]c.mps_orth10#c.l_resusdgdp_std = 0)
}
test `joint'
display "Joint p-value, horizons 0-20 = " %6.4f r(p)
restore
8. Why this restriction is correct
The Stata notation
c.mps_orth10##c.l_resusdgdp_std
includes three terms:
\[ S_t, \qquad R_{i,t-1}, \qquad S_t \times R_{i,t-1}. \]Therefore, the marginal effect of \(R_{i,t-1}\) is:
\[ \gamma_h+\delta_h S_t. \]If the figure evaluates the response after a shock normalized to \(S_t=1\), the plotted object is:
\[ \gamma_h+\delta_h. \]That is why the Stata restriction is:
[post`h'_mean]l_resusdgdp_std +
[post`h'_mean]c.mps_orth10#c.l_resusdgdp_std = 0
9. Correct formulas with suest
The main advantage of suest is that it allows us to test linear combinations of coefficients across several horizon-specific local-projection equations. Formally, after estimating one regression for each horizon, suest stacks the estimated coefficients:
It also constructs the joint variance-covariance matrix:
\[ \widehat{V} = \widehat{\mathrm{Var}}\left(\widehat{b}\right). \]A joint Wald test then takes the form:
\[ W = (A\widehat{b}-c)’ \left(A\widehat{V}A’\right)^{-1} (A\widehat{b}-c), \]where \(A\) selects the coefficients or linear combinations to be tested, and \(c\) is usually a vector of zeros. Under the null hypothesis, the statistic is asymptotically distributed as:
\[ W \sim \chi^2(q), \]where \(q\) is the number of restrictions. In a post-shock test over horizons \(h=0,\ldots,20\), there are 21 restrictions, so \(q=21\).
For a simple local projection without interactions,
\[ y_{i,t+h}-y_{i,t-1} = \alpha_h + \theta_h S_t + D_i + \varepsilon_{i,t+h}, \]the post-shock joint null is:
\[ H_0: \theta_h=0 \quad \forall h=0,\ldots,20. \]
In Stata, after suest, each restriction has the form:
[post`h'_mean]S = 0
For an interaction model,
\[ y_{i,t+h}-y_{i,t-1} = \alpha_h + \beta_h S_t + \gamma_h R_{i,t-1} + \delta_h(S_t \times R_{i,t-1}) + D_i + \varepsilon_{i,t+h}, \]there are two common marginal effects. They answer different questions.
First, the marginal effect of the state variable \(R_{i,t-1}\), evaluated at shock size \(S_t=s^\ast\), is:
\[ m_h(s^\ast) = \left. \frac{\partial E[y_{i,t+h}-y_{i,t-1}]}{\partial R_{i,t-1}} \right|_{S_t=s^\ast} = \gamma_h+s^\ast\delta_h. \]If \(s^\ast=1\), the relevant restriction is:
\[ H_0: \gamma_h+\delta_h=0 \quad \forall h=0,\ldots,20. \]In Stata, this is:
[post`h'_mean]R + [post`h'_mean]c.S#c.R = 0
More generally, if the shock is evaluated at \(S_t=s^\ast\), the restriction is:
[post`h'_mean]R + s_star*[post`h'_mean]c.S#c.R = 0
Second, the marginal effect of the shock \(S_t\), evaluated at a given state-variable level \(R_{i,t-1}=r^\ast\), is:
\[ q_h(r^\ast) = \left. \frac{\partial E[y_{i,t+h}-y_{i,t-1}]}{\partial S_t} \right|_{R_{i,t-1}=r^\ast} = \beta_h+r^\ast\delta_h. \]If the figure plots the shock response at \(R_{i,t-1}=r^\ast\), the correct Stata restriction is:
[post`h'_mean]S + r_star*[post`h'_mean]c.S#c.R = 0
The distinction matters. If the graph plots the marginal effect of reserves after a monetary-policy shock, use \(\gamma_h+s^\ast\delta_h\). If the graph plots the monetary-policy response at a given reserve level, use \(\beta_h+r^\ast\delta_h\).
With additional exposure controls and their interactions with the shock,
\[ y_{i,t+h}-y_{i,t-1} = \alpha_h + \beta_h S_t + \gamma_h R_{i,t-1} + \delta_h(S_t \times R_{i,t-1}) + \phi_h X_{i,t-1} + \lambda_h(S_t \times X_{i,t-1}) + D_i + \varepsilon_{i,t+h}, \]the marginal effect of \(R_{i,t-1}\), evaluated at \(S_t=s^\ast\), remains:
\[ m_h(s^\ast)=\gamma_h+s^\ast\delta_h, \]provided there are no interactions between \(R_{i,t-1}\) and \(X_{i,t-1}\). Hence, the same Stata restriction applies:
[post`h'_mean]R + s_star*[post`h'_mean]c.S#c.R = 0
If the specification includes a triple interaction among the shock, the state variable, and an exposure variable,
\[ y_{i,t+h}-y_{i,t-1} = \alpha_h + \beta_{1h}S_t + \beta_{2h}R_{i,t-1} + \beta_{3h}X_{i,t-1} + \beta_{4h}(S_t \times R_{i,t-1}) + \beta_{5h}(S_t \times X_{i,t-1}) + \beta_{6h}(R_{i,t-1} \times X_{i,t-1}) + \beta_{7h}(S_t \times R_{i,t-1} \times X_{i,t-1}) + D_i + \varepsilon_{i,t+h}, \]then the marginal effect of \(R_{i,t-1}\), evaluated at \(S_t=s^\ast\) and \(X_{i,t-1}=x^\ast\), is:
\[ m_h(s^\ast,x^\ast) = \beta_{2h} + s^\ast\beta_{4h} + x^\ast\beta_{6h} + s^\ast x^\ast \beta_{7h}. \]The corresponding joint null is:
\[ H_0: \beta_{2h} + s^\ast\beta_{4h} + x^\ast\beta_{6h} + s^\ast x^\ast \beta_{7h} = 0 \quad \forall h=0,\ldots,20. \]
The Stata restriction must include all four terms. The exact coefficient names depend on how the interaction was written. Use coeflegend after one regression to verify the coefficient names before constructing the joint test.
* Example after one regression:
regress ds0 c.S##c.R##c.X i.currencyid, coeflegend
A safe rule is: the restriction used after suest must reproduce exactly the same linear combination that was used to draw the figure. If the plotted object is \(m_h\), then the joint test must impose \(m_h=0\) at each horizon.
10. Takeaway
Pointwise confidence intervals are useful for visualizing uncertainty at each horizon. But local projections estimate a dynamic response path. If the economic hypothesis concerns the post-shock path, inference should also be path-level.
A joint Wald test asks whether the full response path is jointly different from zero. This is why Jordà and Taylor’s discussion of inference in local projections is useful for applied macroeconomists: it shifts attention from isolated horizon-by-horizon significance toward inference on the dynamic object that local projections are designed to estimate.
References
- Jordà, Òscar, and Alan M. Taylor. 2025. “Local Projections.” Journal of Economic Literature 63(1): 59–110. DOI: 10.1257/jel.20241521.
- StataCorp. suest — Seemingly unrelated estimation. Stata Base Reference Manual. Stata manual entry for suest.