From Connected Equations to Identification · Module 11 release · 2026-11-12
How to use this lab
Module 11 release · 2026-11-12. Everything runs as shipped, offline. Your work is to predict, calculate, modify, and explain; no AI is required. Record predictions in your private LEARNING_LOG.md, on paper, or in an R comment before running the corresponding calculation.
With an AI tutor, the prediction pause takes one turn; “just run it” releases it. The tutor asks once per section or experiment. Printed subprompts are optional self-study opportunities, not fresh gates before every chunk.
The algebra has a destination: understand what a fitted VAR coefficient measures. We follow the deck’s sequence from connected equations through both scalar substitutions, then matrices, output, identification, and timing. Sections 2–8 are the main path. Section 9 is optional and outside the assessable surface. The notes’ Core is the factual source and boundary.
This module uses one Concept → Math → computation/interpretation break → Application arc. Deterministic calculations are the spine. One fixed sample from the notes illustrates what regression estimates; there is no Monte Carlo or external-data requirement. The economic application asks you to defend timing assumptions. Neither lecture widget is required to use this lab.
1. Setup
Use a fresh R session and run chunks in order from this folder. In RStudio, choose Session → Set Working Directory → To Source File Location. The calculations use base R; rendering uses installed knitr, rmarkdown, and Quarto. No packages or data are downloaded. Render this file by path, not the folder or the reference notes.
2. Give both outcomes an equation
The pond separates a disturbance’s source from the connections carrying it and the movement you observe. A policy-rate movement could respond to inflation news, reflect an unexpected policy disturbance, or combine the two. An observed movement alone does not distinguish these accounts.
The ARDL already allowed current in the equation. Give its own equation, then allow current to enter it:
On the mixing board, intercepts and own memory remain, both cross-lags are available, and both outcomes now have an equation. Explicit MA terms and a deterministic trend are off. VAR(1) means one lag of the vector.
The first subscript names the receiving equation; the second names the entering variable. Draw four dated nodes, , and put the terms on their arrows. The two current arrows form a directed cycle, so the simultaneous diagram is not a DAG. A lag arrow crosses dates.
Predict: if both current arrows are present, can we find current by (a) ignoring the equation, (b) accounting for that equation too, or (c) treating current as yesterday’s ? Explain what each time subscript means before doing algebra.
The structural shocks have mean zero and positive constant variances, are independent across dates and of the past, and are uncorrelated with each other. Calling an equation structural does not establish these assumptions. Our supplied simulation uses independent standard normals.
Modify on paper: remove the current arrow and rewrite the second equation. Identify the lagged feedback arrows that remain.
So what: giving the predictor an equation changes the joint determination problem, even before any new software is used.
3. Follow one coefficient through both substitutions
Our destination is two equations with only known lags on the right, plus innovations. For the forward calculation, structural parameters, the past, and a particular pair of shock realizations are supplied inputs. The analyst does not observe those structural shocks in real data.
Predict: if the direct structural -lag coefficient is zero, must the reduced coefficient be (a) zero, (b) nonzero, or (c) dependent on the other connections? Follow it through the calculation before running R.
Work through the following lines on paper. At each line, name the operation and the term it changes. These are the full substitutions from Core §11.3.
First solve for current y
Start with the equation and replace its current by the entire right-hand side of the equation:
Distribute across every term inside the parentheses:
The substitution has brought back onto its own right-hand side. Move that term to the left, and collect the intercept, the lag, the lag, and the two disturbances:
Define . Provided , divide every term by :
There is no current left on the right. Its influence has been incorporated into the intercept, both lag coefficients, and the innovation.
Pause and interpret. Point to the two pieces in the numerator of the coefficient. Which came directly from the original equation, and which arrived when we substituted for current ?
Now solve for current x
Before repeating the calculation, predict whether the denominator should change when we solve for the other outcome. Watch for the reciprocal current-coefficient product as you work.
Start from the other equation and substitute for current :
Distribute the contemporaneous coefficient:
Move the current term to the left and collect:
Dividing by the same gives
The denominator is not an arbitrary adjustment. It arose because each substitution returned part of the variable to its own equation. If , these steps cannot produce a unique current solution for arbitrary lags and disturbances. We exclude that singular case.
Give the transformed quantities names
The reduced form expresses current outcomes using lagged information and innovations:
These equations are a shorter way to write exactly what we just derived. Every reduced-form object has a structural expression:
Reduced-form object
Structural expression
The reduced form preserves the joint solution of the proposed structural system. It has not deleted the contemporaneous connections. It has folded them into new coefficients and mixed disturbances.
Population reduced coefficients from scalar substitution
Intercept
y lag
x lag
y
0.28571
0.4
0.22857
x
0.17143
0.2
0.45714
Here and . Trace yesterday’s into today’s and then today’s . The denominator accounts for the reciprocal current connection. Reconcile your prediction: the structural zero and reduced nonzero refer to different coefficients.
Modify: on paper set in the expression for . State which route disappears. To check in R, calculate (phi_yx + 0 * phi_xx) / (1 - 0 * b_xy) without overwriting the shipped parameters.
So what: the coefficient a regression can estimate has already combined structural connections before we draw a single observation.
4. Record the same calculation with matrices
Predict: which operation produces the coefficient on yesterday’s in today’s equation: (a) row 1 of times column 2 of , (b) row 2 times column 1, or (c) multiplying matching entries only? State the row and column meanings.
Stack everything in order . The vectors , and have two rows and one column. Move the current cross-variable terms to the left:
One row times one column means multiply corresponding entries and add. Thus reproduces the two left sides and reproduces the two lag expressions. The structural vector equation is
The identity leaves a vector unchanged. The inverse undoes :
Multiply every term on the left by the inverse. This gives , , and . The course reserves for the reduced intercept.
byrow = TRUE fills rows. %*% multiplies matrices; * multiplies matching entries. solve(B, Gamma1) solves . The agreement with substitution is the point of the notation.
# Trace row 1, column 2 by multiplying its two pairs of entries.entry_terms <- B_inverse[1, ] * Gamma1[, 2]entry_terms
# A fixed pair of lags/shocks checks the equations, not a second DGP.previous <-c(y =1, x =-1)eta_now <-c(y =0.2, x =-0.3)current <-as.vector(A0 + A1 %*% previous + B_inverse %*% eta_now)structural_left <- B %*% currentstructural_right <- Gamma0 + Gamma1 %*% previous + eta_nowc(y_equation_error = structural_left[1] - structural_right[1],x_equation_error = structural_left[2] - structural_right[2])
y_equation_error x_equation_error
0 0
Modify: change the selected entry to row 2, column 1. Write its scalar formula first, then compare the sum with A1[2, 1]. Keep the variable order.
A brief stability check
makes today’s simultaneous equations solvable for the supplied past and shocks. Stability concerns propagation through time and depends on . For this VAR(1), each eigenvalue must have modulus below one. R can do this arithmetic; no companion-matrix workflow is needed here.
The values are 0.644 and 0.213. This is equivalent to roots of lying outside the unit circle. Invertibility of alone is a different condition.
So what: matrix multiplication locates the same economic and dated connections that scalar substitution revealed.
5. Read the output without changing the target
Predict: uncorrelated structural shocks imply reduced innovations that are (a) always uncorrelated, (b) potentially correlated through mixing, or (c) fitted regression residuals by definition? State which object is random in the population and which becomes observable after estimation.
The innovations are and . With uncorrelated structural shocks,
The exact covariance is . Both mixtures share shocks. This is covariance after removing predictable history, not the covariance of the raw series.
One fixed sample, exactly as in the notes
The next chunk is a short illustration of what regression estimates, not a Monte Carlo exercise. Preserve the seed, draw order, sample size and burn-in. The initialization reduces the stable system’s starting transient.
The estimated -lag coefficient is 0.274; its population target is , while the structural lag is zero. Differences between reduced truth and its estimate are sampling variation. They do not change the algebra or justify reseeding for a closer-looking table.
The estimated equation is . The hat marks an estimate and is a residual.
coefficient_table <-as.data.frame(coef(summary(fit_y)))coefficient_table[["Pr(>|t|)"]] <-format.pval(coefficient_table[["Pr(>|t|)"]],digits =3, eps =0.001)knitr::kable(coefficient_table, digits =4, caption ="Reduced y regression; very small p-values are not zero")
Reduced y regression; very small p-values are not zero
Estimate
Std. Error
t value
Pr(>|t|)
(Intercept)
0.2550
0.0301
8.4784
<0.001
y_lag
0.3756
0.0282
13.3415
<0.001
x_lag
0.2742
0.0287
9.5477
<0.001
E <-cbind(y =residuals(fit_y), x =residuals(fit_x))Sigma_hat <-crossprod(E) /nrow(E)knitr::kable(Sigma_hat, digits =4, caption ="Estimated innovation covariance, residual divisor n")
Estimated innovation covariance, residual divisor n
y
x
y
1.5423
0.9473
x
0.9473
1.3848
The current reduced innovation has conditional mean zero given the included history, under this DGP. Across-equation innovation correlation therefore does not invalidate that regressor condition. A reduced -lag coefficient describes conditional prediction holding the other included history fixed. Testing tests for ; it is not generally a test of .
Break the interpretation using the same observations
Putting current back into the regression makes it look structural, but current contains part of . Conditional on history, here. The structural OLS orthogonality assumption fails.
naive_y <-lm(y ~ x + y_lag + x_lag, data = dat)naive_x <-lm(x ~ y + y_lag + x_lag, data = dat)naive_comparison <-data.frame(Current_connection =c("x into y", "y into x"),True_structural =c(0.5, 0.25),Population_association =c(Sigma[1, 2] / Sigma[2, 2], Sigma[2, 1] / Sigma[1, 1]),Naive_OLS =c(coef(naive_y)["x"], coef(naive_x)["y"]))knitr::kable(naive_comparison, digits =4,caption ="Structural-looking OLS estimates an association between mixtures")
Structural-looking OLS estimates an association between mixtures
Current_connection
True_structural
Population_association
Naive_OLS
x
x into y
0.50
0.7059
0.6841
y
y into x
0.25
0.6000
0.6143
The population association slopes are and , not and . A larger sample does not fix the failed orthogonality. Each is a separate conditional association; the two cannot simply be combined into an identified simultaneous system with uncorrelated shocks.
Reconcile: distinguish a structural coefficient, its transformed reduced counterpart, and an estimated coefficient. Explain which target a reported t-test addresses. The label “structural” does not change a regression’s target.
So what: a useful conditional predictor can be an incorrect answer to a question about a primitive structural connection.
6. Work backward under an explicit restriction
Cover the generating coefficients, including the known zero . For this exercise the hypothetical analyst receives only , treated as known population objects so sampling noise cannot explain ambiguity.
Predict: can (a) only one, (b) more than one, or (c) no structural system reproduce these reduced moments? State what information the analyst has.
Unit diagonal and diagonal positive leave four current/shock unknowns against three distinct covariance entries. The mirrored covariance adds no information. Unrestricted structural lags and intercepts can adapt through and .
Derive a recovery, not just a count
Impose , meaning y first. Then
Recover variance → current coefficient → remaining variance:
Positive-definite gives positive variances. Explain why the last subtraction removes the first shock’s contribution. Then reverse the exclusion: with , is first, giving , , and .
Reveal the generating structure only after recovering alternatives
Structure
b_yx
b_xy
phi_yx
omega_y
omega_x
Generating simultaneous
0.50000
0.25
0.00000
1.00000
1.00000
y first
0.00000
0.60
0.22857
1.63265
0.80000
x first
0.70588
0.00
-0.09412
0.94118
1.38776
The assumed zero is false for the original generator in both recursive alternatives. We recovered the structure conditional on each restriction. The fixed matrix order stays ; “x first” names economic timing, not a silent row swap.
Modify: change the assumed current exclusion while holding reduced objects fixed. Explain why structural lag coefficients change too.
So what: exact fit of reduced moments leaves room for distinct structural explanations, each conditional on its identifying assumptions.
7. Enlarge the system without losing the argument
Three quarterly outcomes
For this separate quarterly illustration, order outcomes as unemployment , inflation , and federal funds rate . Here is unemployment, not an error. Write for the intercept and one lag of all three outcomes in equation ; those terms remain unrestricted.
Predict: under unit diagonal and diagonal positive , does the whole current/shock structure need (a) one, (b) three, or (c) nine additional restrictions by the count? List current coefficients, shock variances, and distinct innovation moments.
Six current cross-coefficients plus three shock variances face three reduced innovation variances plus three covariances: . These are innovation covariances after conditioning on the past, not raw macroseries covariances.
Choose , giving
The allowed current arrows are , , and . Unemployment cannot respond to current inflation or policy within the quarter; inflation cannot respond to current policy. All lagged connections remain. Those are economic restrictions to defend, not findings about a policy rule.
Recover the third equation
Subtract conditional means given history:
The first two repeat the bivariate calculation:
For policy, take covariance with each earlier innovation:
This is the familiar row-by-column operation, now used to solve two coefficients together:
Explain why alone combines the direct connection with the route through inflation. Positive-definite makes the block invertible and leaves positive shock variances.
The following arithmetic fixture verifies the formula, with no empirical macro interpretation and no new simulated DGP. Its numbers are chosen only to make a positive-definite covariance calculation easy to inspect.
quantity value
1 first variance 4.000
2 second variance 2.000
3 third variance 3.625
4 largest covariance reconstruction error 0.000
Modify on paper: reverse the first two outcomes’ ordering. State the new zeros and their timing meanings before doing any arithmetic. Merely changing variable names without permuting the covariance’s rows and columns would mix incompatible orders.
Add GDP growth first
Let and use quarterly order . Keep the original three outcomes’ relative order:
The three new zeros are : current unemployment, inflation and policy do not enter the GDP-growth equation. Later equations may respond to current GDP growth. All four lags may enter every equation. GDP-first is an added timing assumption, not a consequence of the word GDP. Growth and rates do not automatically establish stationarity.
Twelve current coefficients plus four shock variances face ten distinct covariance entries: . The original three exclusions plus the three new variable-pair exclusions supply six recursive zeros.
Count the general m-equation structure
Maintain unit-diagonal , diagonal positive , and unrestricted structural intercepts and lags. Do not count those baseline conditions a second time.
m <-2:5count_table <-data.frame(Equations = m, Current_coefficients = m * (m -1), Shock_variances = m,Distinct_covariance_entries = m * (m +1) /2,Additional_restrictions = m * (m -1) /2)knitr::kable(count_table, caption ="Whole-system count under the stated baseline assumptions")
Whole-system count under the stated baseline assumptions
Equations
Current_coefficients
Shock_variances
Distinct_covariance_entries
Additional_restrictions
2
2
2
3
1
3
6
3
6
3
4
12
4
10
6
5
20
5
15
10
This is a necessary order count for the whole current/shock structure, not a per-equation requirement. An arbitrary collection of the same number of restrictions need not identify the system. A fixed recursive ordering puts zeros above the diagonal. With a positive-definite reduced covariance, successive recovery works and has positive shock variances. Unrestricted structural lags still adapt through .
R’s chol() returns an upper factor; transpose it for the lower factor. The recovered y-first produce this factor, not the original simultaneous matrices. Cholesky implements the chosen ordering; it cannot decide whether the economic timing assumption is true.
So what: the number of missing restrictions grows with the system, but the distinction between counting, recovering, and defending remains the same.
8. Defend the timing, then ask the next system question
Return to monthly inflation and policy rate . This application is distinct from the preceding quarterly three/four-variable illustration.
Predict and defend: which assumption is more plausible for a stated monthly measurement: (a) inflation first, (b) policy first, or (c) neither without more information? Name the economic reasoning your choice requires.
Proposed ordering
Current restriction
Timing claim
Inflation first
Measured inflation does not respond to an unexpected policy disturbance within the month; policy may respond to current inflation news
Policy first
Policy does not respond to current inflation within the month; inflation may respond to current policy
State one supporting argument and one challenge involving publication dates, information sets, aggregation, or frequency. Discuss how moving to quarterly data could affect the argument. The pack has not estimated a monetary-policy effect. Covariance fit and significant lagged Granger predictability do not choose the current ordering.
Return to the original coefficient: a structural zero became a nonzero reduced coefficient. The coefficient table has conditional predictive meaning, but it does not by itself identify a primitive effect. Even after identifying shocks, one coefficient describes only one part of the connected system.
Next question
Later tool
How does each outcome respond over time after a specified identified disturbance?
IRF, Module 12
At a given horizon, which identified disturbances account for forecast-error variance?
FEVD, Module 13
Both retain identification assumptions. FEVD is not regression or a share of every observed movement. Their formulas and inference come later. The cointegrated walkers also return through VECMs in Module 13; they are not the stationary baseline simulated here.
So what: software can implement a restriction, while the economic argument must defend the interpretation it creates.
9. Explorations — optional, outside the assessable surface
These seeds go from guided to open. They are not additional Core requirements. Keep the shipped baseline intact; put variants in new objects and record what changed. On request, an AI tutor can build later machinery as a clearly labelled preview and connect it back to Core.
Follow another entry. Derive by substitution, identify its row and column, and verify the matrix calculation. Explain its two routes.
Remove one current connection. Create B_variant with one off-diagonal entry zero, keeping the original structural lag matrix. Predict which reduced coefficients and covariances change, then compute them. This changes the DGP; distinguish it from holding reduced moments fixed while identifying.
Solvable but unstable. Leave B fixed and vary a copy of Gamma1 until a reduced eigenvalue reaches or crosses one. Check the current determinant separately. No simulation is needed to see the distinction.
Reverse the arithmetic fixture’s ordering. Permute its rows and columns consistently, recover the recursive coefficients, then reconstruct the original covariance. Explain which timing claims changed and which moments did not.
Build a timing argument. Choose two plausible measurement frequencies for an economic question and compare the implied current exclusions. State what institutional evidence would strengthen or weaken each argument.
10. Run the shared referee and close your log
The checks validate specific arithmetic and implementation claims. They do not certify an economic ordering, arbitrary student modifications, or causal identification from observational data. See CHECKS.md for their scope.
source("R/checks.R", local =new.env())
Module 11 checks
----------------
PASS 1. Scalar substitution and matrix map agree for every coefficient [largest discrepancy=2.2e-16; direct lag=0; reduced lag=0.228571]
PASS 2. Shock mixing, positive covariance and distinct stability condition [covariance=0.979592; baseline eigenvalues=0.644281/0.212862]
PASS 3. Fixed draw, dated structural equations and OLS projection targets [rows=2000; equation error=9.4e-16; estimated reduced x-lag=0.274247]
PASS 4. Both false recursive exclusions reproduce all reduced moments [largest reconstruction error=2.2e-16]
PASS 5. Three-equation joint recovery and positive remaining variances [last-row coefficients=-0.125/0.750; reconstruction error=0.0e+00]
PASS 6. Whole-system counts, recursive zeros and Cholesky orientation [counts=1/3/6/10; lower-factor error=2.2e-16]
----------------
6/6 checks passed.
Record the prediction you actually made, the calculation you ran, and what you observed. Your revised reasoning and remaining uncertainty belong in your own words. The log is private, never collected and never graded.