cultivars.multivariate.structural.external_instruments#

External-instrument identification: one shock, named from outside the system.

A reduced-form VAR pins down the innovation covariance \(\Sigma_u\) and nothing about the matrix \(B\) in \(u_t = B \varepsilon_t\). An instrument \(z_t\) with

\[\mathbb{E}[z_t \varepsilon_{1t}] \neq 0, \qquad \mathbb{E}[z_t \varepsilon_{jt}] = 0 \quad (j \neq 1),\]

gives \(\mathbb{E}[z_t u_t] \propto b_1\): the column of \(B\) belonging to the shock the instrument speaks for, up to a scale that the unit-variance normalization \(b_1' \Sigma_u^{-1} b_1 = 1\) fixes. Narrative tax changes, high-frequency monetary surprises, oil supply disruptions: the instrument brings information the reduced form never had, and in exchange identifies only that one column. The partial result is the honest one.

Two commitments shape the surface. First, what is not identified is not fabricated. The result carries one column, and the shared SVARResult surface is built so a single column supports impulse responses, variance shares, shock recovery and historical contributions without inventing the columns it does not have; the variance shares therefore need not sum to one, and the summary says which shocks remain unidentified. Second, the two instrument conditions are kept apart. Relevance is a testable implication and the first-stage F statistic reports it; exogeneity is an assumption that no statistic in the system can check, and the result’s restriction note says so on every summary rather than letting a large F stand in for both.

Layout. ProxySVAR is an _IdentificationModel from _internals, which validates the closed-system contract of the source result and exposes its names; the instrument panel is validated and demeaned here, identify() runs the two-stage least squares on the source’s residuals, and the column is packaged into SVARResult from zero_restrictions with scheme="proxy" and the first-stage diagnostics. Full identification from an ordering is zero_restrictions; set identification without an instrument is sign_restrictions.

References

Mertens, K., & Ravn, M. O. (2013). The dynamic effects of personal and corporate income tax changes in the United States. American Economic Review, 103(4), 1212-1247.

Stock, J. H., & Watson, M. W. (2018). Identification and estimation of dynamic causal effects in macroeconomics using external instruments. Economic Journal, 128(610), 917-948.

Montiel Olea, J. L., Stock, J. H., & Watson, M. W. (2021). Inference in structural vector autoregressions identified with an external instrument. Journal of Econometrics, 225(1), 74-87.

Example

A bivariate system whose first shock moves both variables on impact and a noisy proxy for it. The column is recovered, the variance shares of the one identified shock stay below one for the variable it only partly drives, and the historical decomposition carries one column:

>>> import numpy as np
>>> from cultivars.multivariate.reduced_form.vector_autoregression import VAR
>>> rng = np.random.default_rng(0)
>>> B = np.array([[1.0, 0.0], [0.5, 1.0]])
>>> A = np.array([[0.5, 0.1], [0.0, 0.4]])
>>> eps = rng.standard_normal((402, 2))
>>> y = np.zeros((402, 2))
>>> for t in range(1, 402):
...     y[t] = A @ y[t - 1] + B @ eps[t]
>>> proxy = eps[:, 0] + 0.5 * rng.standard_normal(402)
>>> res = VAR(y, order=1, names=("r", "x")).fit()
>>> svar = ProxySVAR(res, proxy[1:], shock="policy").identify()
>>> svar.impact.round(2).ravel(), svar.is_complete
(array([1. , 0.5]), False)
>>> shares = svar.fevd(10)[-1, :, 0]
>>> bool(shares[0] > 0.95), bool(0.1 < shares[1] < 0.4)
(True, True)
>>> svar.historical_decomposition().shape
(401, 2, 1)

Classes#

ProxySVAR

External-instrument identification, Mertens-Ravn (2013).