*! version 1.0.0 March 2026

Title

tca -- Transmission Channel Analysis for structural VAR models

Syntax

Direct specification:

tca ,
phi0(matname)
ar(matname)
horizon(#)
from(#)
intermediates(numlist)
[options]

After var or svar estimation:

tca_from_var ,
from(#)
intermediates(numlist)
[options]

* phi0(matname) structural impact matrix (K x K)

* ar(matname) AR coefficient matrix (K x K*p), A_1|A_2|...|A_p

* horizon(#) maximum impulse response horizon

* from(#) shock variable number (1-based)

* intermediates(numlist) intermediate variables for channel decomposition

options

order(numlist) transmission ordering; default is 1 2 ... K

mode(string) decomposition mode: overlapping, exhaustive_3way, or exhaustive_4way

target(#) response variable to display; default is first intermediate

varnames(string) variable names for display

graph produce bar chart of channel decomposition

validate run binary additivity test

store(string) prefix for stored Stata matrices

allhorizons display all horizons (not just selected ones)

* Required for tca; not needed for tca_from_var.

Description

tca implements Transmission Channel Analysis (TCA) for structural
vector autoregressive (SVAR) models following the methodology of Wegner, Lieb,
and Smeekes (2025). TCA decomposes impulse response functions (IRFs) into
contributions from distinct transmission channels using a systems form
representation and directed acyclic graph (DAG) path analysis.

The key equation is x = Bx + Omega*epsilon, where B is a K*(h+1) x K*(h+1)
block lower-triangular matrix and Omega encodes structural shocks. By selectively
zeroing entries in B and Omega, different transmission paths can be isolated.

Three decomposition modes are supported:

overlapping — Each channel represents through(j) = total - not_through(j).
Channels may overlap, so their sum may exceed the total.

exhaustive_3way — (Requires 2 intermediates) Non-overlapping decomposition:
(1) through variable 1 (inclusive), (2) through variable 2 only, (3) direct.
Sum equals total exactly.

exhaustive_4way — (Requires 2 intermediates) Full inclusion-exclusion:
(1) variable 1 only, (2) variable 2 only, (3) both variables, (4) direct.
Sum equals total exactly.

Options

phi0(matname) specifies the K x K structural impact matrix. For Cholesky
identification, this is the lower Cholesky factor of the residual covariance
matrix: matrix Phi0 = cholesky(Sigma).

ar(matname) specifies the AR coefficient matrix as K x (K*p), where
A_1, A_2, ..., A_p are concatenated column-wise. Row i contains the
coefficients for equation i.

horizon(#) specifies the maximum impulse response horizon h.

from(#) specifies which structural shock to analyze (1-based variable
number).

intermediates(numlist) specifies the intermediate variables through which
transmission channels are defined. For exhaustive modes, exactly 2 variables
are required.

order(numlist) specifies the transmission ordering. Default is natural
ordering 1 2 ... K. This determines the causal ordering in the DAG.

mode(string) specifies the decomposition mode. Default is
overlapping.

target(#) specifies which variable's response to display. Default is the
first intermediate variable.

varnames(string) provides names for display. Default is Var1 Var2 ....

graph produces a stacked bar chart of the channel decomposition with
the total IRF overlaid.

validate runs the binary additivity test for all variables before the
main analysis, verifying that total = through(j) + not_through(j) at machine
precision.

allhorizons displays all horizons instead of only selected ones
(0, 1, 2, 4, 8, 12, 16, 20, h).

Examples

Example 1: Direct specification with monetary policy model

. // Define VAR parameters

. matrix A1 = (0.7,-0.1,0.05,-0.05 \ -0.3,0.6,0.10,-0.10 \ -0.2,0.1,0.70,0.05 \ -0.1,0.2,0.05,0.65)

. matrix A2 = (0.1,0,0,0 \ -0.1,0.1,0,0 \ -0.1,0,0.1,0 \ 0,0,0,0.1)

. matrix A = A1, A2

. // Residual covariance and Cholesky

. matrix Sigma = (1,0.3,0.2,0.1 \ 0.3,1.5,0.25,0.15 \ 0.2,0.25,0.8,0.1 \ 0.1,0.15,0.1,0.6)

. matrix Phi0 = cholesky(Sigma)

. // Run TCA: interest rate shock, channels via GDP(2) and Wages(4)

. tca , phi0(Phi0) ar(A) horizon(20) from(1) intermediates(2 4) target(3) mode(exhaustive_4way) varnames(IntRate GDP Inflation Wages) validate graph

{\bf:Example 2: After VAR estimation}

. webuse lutkepohl2, clear

. var dln_inv dln_inc dln_consump, lags(1/2)

. tca_from_var , from(1) intermediates(2) target(3) horizon(20) validate

Example 3: Overlapping channels

. tca , phi0(Phi0) ar(A) horizon(20) from(1) intermediates(2 4) mode(overlapping) target(3) varnames(IntRate GDP Inflation Wages)

Stored results

tca stores the following in r():

Scalars

r(K) number of variables

r(horizon) maximum horizon

r(from) shock variable number

r(n_channels) number of channels

Macros

r(mode) decomposition mode

r(ch1name) name of channel 1

r(ch2name) name of channel 2, etc.

Matrices

r(irf_total) total IRF matrix (h+1 x K)

r(irf_ch1) channel 1 IRF matrix (h+1 x K)

r(irf_ch2) channel 2 IRF matrix, etc.

Global macros $tca_mode, $tca_nch, $tca_chname1, etc. are
also stored.

Stata matrices tca_total, tca_ch1, tca_ch2, etc. are stored
for use in subsequent commands or graphing.

Reference

Wegner, E., L. Lieb, and S. Smeekes. 2025.
Transmission Channel Analysis in Dynamic Models.
arXiv:2405.18987.
https://github.com/enweg/tca-matlab-toolbox

Author

This Stata implementation is a parallel port of the MATLAB tca-matlab-toolbox.