ProxySVAR#

class cultivars.multivariate.structural.external_instruments.ProxySVAR(result, instruments, *, shock='proxied', normalize=None)[source]#

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

An instrument \(z_t\) that is correlated with one structural shock and uncorrelated with the others,

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

identifies that shock’s impact column \(b_1\) up to scale, because \(\mathbb{E}[z_t u_t] = \alpha\, b_1\) for the reduced-form innovations \(u_t = B \varepsilon_t\). The column is recovered by two-stage least squares on the innovations: the instrument’s covariance with each innovation is proportional to the column, the ratio to the normalization variable’s covariance removes the unknown \(\alpha\), and the unit-variance rescaling \(b_1' \Sigma_u^{-1} b_1 = 1\) pins the scale against the innovation covariance. Nothing else is identified, and the result carries exactly that one column.

Note

Both instrument conditions are assumptions, not testable implications. Relevance shows up in the first-stage F statistic the summary reports, and a weak first stage (F in the single digits) means the column is poorly determined and its sign uncertain – the statistic is the classical homoskedastic F, which overstates strength under heteroskedasticity. Exogeneity never shows up anywhere and must be argued from how the instrument was built: a narrative series, a high-frequency surprise, a supply disruption.

Variables:
  • _source – The closed reduced-form result being identified.

  • _instruments – The (nobs, m) demeaned instrument panel.

  • _pivot – Column index of the normalization variable.

  • _shock – The label of the identified shock.

See also

  • SVARResult – the partially identified result returned.

  • RecursiveSVAR – full identification from a Cholesky ordering, with no outside information.

  • sign_restrictions – set identification when no instrument exists.

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 structural shock moves both variables on impact, with a noisy proxy for that shock. The identified column recovers the true impact to two decimals, the recovered shock series tracks the truth, and the column satisfies the unit-variance normalization against the innovation covariance:

>>> 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.scheme, svar.shock_names, svar.is_complete
('proxy', ('policy',), False)
>>> svar.impact.round(2)
array([[1. ],
       [0.5]])
>>> bool(np.corrcoef(svar.structural_shocks()[:, 0], eps[1:, 0])[0, 1] > 0.99)
True
>>> column = svar.impact[:, 0]
>>> round(float(column @ np.linalg.solve(res.sigma_u, column)), 6)
1.0

Attributes#

k_endog

Number of variables in the source system.

k_instruments

Number of instrument series.

names

Variable labels of the source system.

source

The fitted reduced-form result being identified.

Methods#

identify()

Recover the proxied shock's impact column.