Surahammars Ironworks/Surahammars Järnbruk, Sweden, 1919.
From Sweden’s Tekniska Museet photo collection.

In input-output economics, the Leontief inverse (i.e. [I-A]^-1) is ubiquitous. Named after the father of input-output economics, Wassily Leontief, the matrix is a compact representation of the ripple effects in an economy where industries are interconnected. A lone matrix coefficient conveys all direct and indirect effects on output in one sector required by a unit of output from another sector.

Below is Part 1 of a two part tutorial on deriving the Leontief inverse using R. This first part is a “toy” example to motivated the pieces of the input-output analysis and the workflow in R. Part 2 describes how to calculate the Leontief inverse from a full scale input-output table.

A Toy Input-Output Model.

Consider a baby example. I’ll use Table 1 as a guide to calculating a simple Leontief inverse using R. The table represents the essential ingredients of common input-output tables using only two sectors.

Table 1. A Small Input-Output Table

Intermediates
From / To Good 1 Good 2 Final Goods Total Output
Good 1 150 500 350 1000
Good 2 200 100 1700 2000

The above example borrows from the canonical examples in chapter 2 of Miller and Blair’s Input-Output Analysis (1985) as well as chapter 2 of Leontief’s Input-Output Economics (1986).

The heart of the table is a two-by-two matrix representing the intermediate good flows between the two sectors: sector 1 and sector 2. A row represents the value of output sent from a goods sector for productive use in a column sector. Above, a row sector sends goods to itself and sector 2.

After the two columns of intermediate good sales, the “Final Goods” column shows the value of a row’s output used as final products–output not used in production. If we add up a row’s output used as intermediate goods and as final products, we get the last column: total output.

Calculating the Matrix

The Leontief inverse is calculated in the following way. We start with an IO table like the one above. Using this basic IO table, we generate a “technical coefficient matrix,” which we then use to solve for the Leontient inverse matrix, L.

First we’ll build the input-output table in Table 1 using R. We generate the two-by-two flow of interindustry sales (flowtable). Then I create the vector of finaldemand.

# Intermediate flow matrix.
flowtable <- rbind( c( 150 , 500 ), c( 200 , 100 ) )
# Final demand.
finaldemand <- rbind( c( 350 ), c( 1700 ) )

We combined these pieces into a data.frame object. Once combined, we sum across the intermediate input columns and final demand column to produce a new variable: total demand. The result is a data.frame version of Table 1.

# Bind into input-output table.
inputoutputtable <- cbind( flowtable , finaldemand )

# Convert object to data.frame.
inputoutputtable <- as.data.frame( inputoutputtable )

# Name columns of table (dataframe)
names( inputoutputtable ) <- c("x1" , "x2" , "finaldemand")

# Calculate total output, add final demand and intermediate columns:
inputoutputtable$totaloutput <- inputoutputtable$x1 +
                                inputoutputtable$x2 +
                                inputoutputtable$finaldemand

# Show the small IO table.
inputoutputtable
>   x1  x2 finaldemand totaloutput
>1 150 500         350        1000
>2 200 100         1700       2000

# Save total output vector as a separate object. Use later.
totaloutput <- inputoutputtable$totaloutput

Now we can derive a technical coefficient matrix, also called matrix A. A column of this matrix represents an industrial recipe used to produce a single industry good.

Matrix A is calculated by dividing intersectoral flows by the total output of each column’s sector. Specifically, sector 1 ships 500 dollars of good 1 to sector 2, which produces 1000 dollars of total output. Thus, one dollar of good 1 is absorbed to produce 25 cents of sector 2’s output.

To calculate matrix A in R: first take the inverse of the total output vector and multiply it with an identity matrix. The resulting object, z, is multiplied again with the flowtable matrix.

## Calcate coefficient matrix:
z <- ( totaloutput )^-1 * diag( 2 )
A <- flowtable %*% z

# Show A
A
     [,1] [,2]
[1,] 0.15 0.25
[2,] 0.20 0.05

Alternatively, we can use R’s sweep() function to calculate A directly from the flowmatrix and the totaloutput vector. sweep() takes the input matrix and divides each column by the corresponding entry of the vector. The argument margin = 2 tells us we’re “sweeping” over the columns of the input matrix, as opposed to rows (for row-wise calculations, margin = 1).

# Using "Sweep"
A.alternative <- sweep( flowtable , 
						margin = 2 , 
						totaloutput , 
						'/' )
A.alternative
     [,1] [,2]
[1,] 0.15 0.25
[2,] 0.20 0.05

Finally, the Leontief matrix is calculated in the following way.

Using R, we first calculate I-A, substracting the technical coefficient matrix from the identity matrix. We then invert the I-A matrix by using thesolve() function. The result, L, is the Leontief coefficient matrix.

# Identity matrix minus technical coefficient matrix.
IminusA <- diag( 2 ) - A

## Calculate inverse.
L <- solve( IminusA ) 

# Show Leontief matrix.
L
          [,1]     [,2]
[1,] 1.2541254 0.330033
[2,] 0.2640264 1.122112

Substantively, the matrix L summarizes the network effects generated when final output changes. A single coefficient of matrix L, surprisingly, summarizes all direct and indirect effects created in sector i to supply a single unit of final demand for sector j.