Structural identification

Practicum · Session 02

A worked MATLAB replication with explicit data, timing, and numerical checks.

Two identifying assumptions

Place both fingerprinted inputs in the raw-data directory as described in the session README. This replication estimates two distinct datasets: a monthly monetary VAR and a quarterly productivity-hours VAR. Their horizons must never be combined on an unlabeled time axis.

% Run from the repository root so input and output paths resolve consistently.
projectRoot = pwd;
% Preserve the caller's search path before loading shared estimators.
originalPath = path;
% Restore the original path after the walkthrough.
pathCleanup = onCleanup(@()path(originalPath));
% Keep namespaced functions visible after the session dispatcher cleans up.
addpath(fullfile(projectRoot,'matlab'));
% Estimate both source-derived applications and retain their identifying matrices.
result = run_session(2);

Check the recursive monetary experiment

The lower-triangular matrix is a set of restrictions, not a list of estimated zeros to celebrate. Policy is the fourth column. Its first three impact responses vanish because production, prices, and unemployment precede the funds rate in the ordering.

% Read the original unit-variance monetary impact matrix.
B = result.monetary.B;
% Check that its covariance reproduces the fitted reduced-form covariance.
assert(max(abs(B*B'-result.monetary.model.Sigma),[],'all')<1e-10);
% The identified policy column cannot affect the first three variables on impact.
assert(max(abs(B(1:3,4)))<1e-12);
% The published experiment raises the funds rate by half a percentage point.
assert(abs(result.monetary.response(4,1)-0.5)<1e-12);
% Display production, prices, unemployment, rate, and NFCI effects at month twelve.
disp(result.monetary.response(:,13));

The saved unit-variance responses and the normalized monetary response serve different purposes. Use the former for shock-variance accounting. Use the latter to describe the stated fifty-basis-point experiment.

Check the long-run restriction

The technology model is ordered productivity growth, then hours growth. The workbook contains annualized quarterly growth. Inspect both the impact and long-run matrices: a long-run zero does not generally imply an impact zero.

% Read the exact long-run identifying objects from the quarterly application.
identified = result.technology.identification;
% Multiply the cumulative reduced-form multiplier by the structural impact matrix.
longImpact = identified.C*identified.B;
% Nontechnology has no cumulative long-run effect on productivity.
assert(abs(longImpact(1,2))<1e-10);
% Recover the reduced-form covariance as an independent identification check.
assert(max(abs(identified.B*identified.B'-result.technology.model.Sigma),[],'all')<1e-10);
% Confirm that annualized growth was divided by four before level cumulation.
assert(max(abs(result.technology.levelResponse(:,:,1)-identified.B/4),[],'all')<1e-12);
% Inspect the numerical effect of replacing the classroom finite sum by the exact multiplier.
disp(result.technology.truncationDifference);

The finite-sum difference is approximately five times ten to the minus seven in this dataset. Treat that as a result of this estimated system, not a general rule about forty quarters being enough.

For a paper-style empirical extension, rerun the analysis under a clearly named hours specification or sample choice and discuss the changed identifying content. The archived source already differs from Galí’s original dataset; do not describe the current expanded-sample exercise as a complete replication of his paper.

% Export the exact-identification response figure from the verified result object.
tsma.var.publish_session(result,projectRoot);
% Restore the caller's original path after completing all shared-function checks.
clear pathCleanup;

Worked exercises

A recursive shock

Write B=\begin{pmatrix}a&0\\b&c\end{pmatrix}. Multiplication gives

BB'=\begin{pmatrix}a^2&ab\\ab&b^2+c^2\end{pmatrix}.

The positive-diagonal convention yields a=2, then b=2/a=1, and finally c=\sqrt{5-1}=2. Hence B=\begin{pmatrix}2&0\\1&2\end{pmatrix}. A unit second shock affects variable two by two units on impact. Multiplying its column by .5/2=.25 gives (0,.5)'.

If that column replaces the original one without changing its variance, the implied covariance becomes \begin{pmatrix}4&2\\2&1.25\end{pmatrix}, not the observed \Sigma. The normalized response is a different-sized experiment, not a new unit-variance decomposition of the same residual covariance. Keep the original factor for variance accounting.

The infinite-horizon zero

The exact multiplier is

C(1)=(I-A)^{-1}=\operatorname{diag}(2,4/3).

Consequently,

C(1)\Sigma C(1)'= \begin{pmatrix}16&16/3\\16/3&80/9\end{pmatrix}.

Its lower-triangular factor is D=\begin{pmatrix}4&0\\4/3&8/3\end{pmatrix}: the bottom-right covariance is (4/3)^2+(8/3)^2=80/9. Premultiply by I-A:

B=\begin{pmatrix}1/2&0\\0&3/4\end{pmatrix} \begin{pmatrix}4&0\\4/3&8/3\end{pmatrix} =\begin{pmatrix}2&0\\1&2\end{pmatrix}.

The direct check gives C(1)B=\begin{pmatrix}4&0\\4/3&8/3\end{pmatrix}, whose upper-right element is zero. In this diagonal-dynamics example the short-run and long-run restrictions select the same factor. That is a feature of this fixture, not a general equivalence: cross-equation dynamics usually make the long-run impact matrix nontriangular.

Conflicting restrictions

Write q_1=(a,b)'. The impact restriction gives a=0. The second row of C(1) gives the long-run restriction a+2b=0. Substituting a=0 yields b=0. The only solution is therefore the zero vector, which violates q_1'q_1=1.

The stacked restriction matrix \begin{pmatrix}1&0\\1&2\end{pmatrix} has rank two and no nontrivial null space. There is no admissible shock direction. More restrictions do not necessarily produce a better-identified model; they may produce an inconsistent model. A single impact restriction here would leave direction (0,1)' up to sign. The additional long-run restriction rules it out.

Annualized growth

Annualized quarterly log growth is four times quarterly log growth. The underlying quarterly responses are therefore 1, .5, and 0. Cumulating yields

L_0=1,\qquad L_1=1+.5=1.5,\qquad L_{10}=1.5.

The return of growth to zero means that the log-level difference stops increasing; it does not imply that the accumulated level difference vanishes. An offsetting negative growth response would be needed for that.

If the supplied 4 and 2 were already nonannualized quarterly growth, no division by four would be appropriate. The level responses would be 4, 6, and 6. The discrepancy is exactly a units error, even though both calculations use the same cumulative-sum command.