39. 输入-输出模型#

39.1. 概述#

在我们学习输入-输出模型之前,本讲座需要以下导入和安装。

!pip install quantecon_book_networks
!pip install quantecon
!pip install pandas-datareader
Hide code cell output
Collecting quantecon_book_networks
  Downloading quantecon_book_networks-1.3.1-py2.py3-none-any.whl.metadata (1.5 kB)
Requirement already satisfied: numpy in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon_book_networks) (1.26.4)
Requirement already satisfied: scipy in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon_book_networks) (1.13.1)
Requirement already satisfied: pandas in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon_book_networks) (2.2.2)
Requirement already satisfied: matplotlib in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon_book_networks) (3.9.2)
Requirement already satisfied: pandas-datareader in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon_book_networks) (0.10.0)
Requirement already satisfied: networkx in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon_book_networks) (3.3)
Requirement already satisfied: contourpy>=1.0.1 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from matplotlib->quantecon_book_networks) (1.2.0)
Requirement already satisfied: cycler>=0.10 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from matplotlib->quantecon_book_networks) (0.11.0)
Requirement already satisfied: fonttools>=4.22.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from matplotlib->quantecon_book_networks) (4.51.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from matplotlib->quantecon_book_networks) (1.4.4)
Requirement already satisfied: packaging>=20.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from matplotlib->quantecon_book_networks) (24.1)
Requirement already satisfied: pillow>=8 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from matplotlib->quantecon_book_networks) (10.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from matplotlib->quantecon_book_networks) (3.1.2)
Requirement already satisfied: python-dateutil>=2.7 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from matplotlib->quantecon_book_networks) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas->quantecon_book_networks) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas->quantecon_book_networks) (2023.3)
Requirement already satisfied: lxml in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas-datareader->quantecon_book_networks) (5.2.1)
Requirement already satisfied: requests>=2.19.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas-datareader->quantecon_book_networks) (2.32.3)
Requirement already satisfied: six>=1.5 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib->quantecon_book_networks) (1.16.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests>=2.19.0->pandas-datareader->quantecon_book_networks) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests>=2.19.0->pandas-datareader->quantecon_book_networks) (3.7)
Requirement already satisfied: urllib3<3,>=1.21.1 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests>=2.19.0->pandas-datareader->quantecon_book_networks) (2.2.3)
Requirement already satisfied: certifi>=2017.4.17 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests>=2.19.0->pandas-datareader->quantecon_book_networks) (2024.8.30)
Downloading quantecon_book_networks-1.3.1-py2.py3-none-any.whl (365 kB)
Installing collected packages: quantecon_book_networks
Successfully installed quantecon_book_networks-1.3.1
Requirement already satisfied: quantecon in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (0.8.0)
Requirement already satisfied: numba>=0.49.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon) (0.60.0)
Requirement already satisfied: numpy>=1.17.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon) (1.26.4)
Requirement already satisfied: requests in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon) (2.32.3)
Requirement already satisfied: scipy>=1.5.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon) (1.13.1)
Requirement already satisfied: sympy in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from quantecon) (1.13.2)
Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from numba>=0.49.0->quantecon) (0.43.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests->quantecon) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests->quantecon) (3.7)
Requirement already satisfied: urllib3<3,>=1.21.1 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests->quantecon) (2.2.3)
Requirement already satisfied: certifi>=2017.4.17 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests->quantecon) (2024.8.30)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from sympy->quantecon) (1.3.0)
Requirement already satisfied: pandas-datareader in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (0.10.0)
Requirement already satisfied: lxml in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas-datareader) (5.2.1)
Requirement already satisfied: pandas>=0.23 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas-datareader) (2.2.2)
Requirement already satisfied: requests>=2.19.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas-datareader) (2.32.3)
Requirement already satisfied: numpy>=1.26.0 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas>=0.23->pandas-datareader) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas>=0.23->pandas-datareader) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas>=0.23->pandas-datareader) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from pandas>=0.23->pandas-datareader) (2023.3)
Requirement already satisfied: charset-normalizer<4,>=2 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests>=2.19.0->pandas-datareader) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests>=2.19.0->pandas-datareader) (3.7)
Requirement already satisfied: urllib3<3,>=1.21.1 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests>=2.19.0->pandas-datareader) (2.2.3)
Requirement already satisfied: certifi>=2017.4.17 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from requests>=2.19.0->pandas-datareader) (2024.8.30)
Requirement already satisfied: six>=1.5 in /home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas>=0.23->pandas-datareader) (1.16.0)
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import quantecon_book_networks
import quantecon_book_networks.input_output as qbn_io
import quantecon_book_networks.plotting as qbn_plt
import quantecon_book_networks.data as qbn_data
import matplotlib as mpl
from matplotlib.patches import Polygon

quantecon_book_networks.config("matplotlib")
mpl.rcParams.update(mpl.rcParamsDefault)

FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf"
mpl.font_manager.fontManager.addfont(FONTPATH)
plt.rcParams['font.family'] = ['Source Han Serif SC']

下图展示了从美国经济分析局2021年输入-输出账户数据中的15个生产部门之间的联系网络。

Hide code cell content
def build_coefficient_matrices(Z, X):
    """
   通过以下方式从Z和X构建系数矩阵A和F:

        A[i, j] = Z[i, j] / X[j]
        F[i, j] = Z[i, j] / X[i]

    """
    A, F = np.empty_like(Z), np.empty_like(Z)
    n = A.shape[0]
    for i in range(n):
        for j in range(n):
            A[i, j] = Z[i, j] / X[j]
            F[i, j] = Z[i, j] / X[i]

    return A, F

ch2_data = qbn_data.production()
codes = ch2_data["us_sectors_15"]["codes"]
Z = ch2_data["us_sectors_15"]["adjacency_matrix"]
X = ch2_data["us_sectors_15"]["total_industry_sales"]
A, F = build_coefficient_matrices(Z, X)
Hide code cell source
centrality = qbn_io.eigenvector_centrality(A)

# 去掉自循环
for i in range(A.shape[0]):
    A[i][i] = 0

fig, ax = plt.subplots(figsize=(8, 10))
plt.axis("off")
color_list = qbn_io.colorise_weights(centrality,beta=False)

qbn_plt.plot_graph(A, X, ax, codes,
              layout_type='spring',
              layout_seed=5432167,
              tol=0.0,
              node_color_list=color_list)

plt.show()
_images/a09cc809a4350b89f92871d5d0fe9e24fc415d8db079c0b0e9e1481709251a91.png

Fig. 39.1 美国15个生产部门之间的联系网络#

标签

行业

标签

行业

标签

行业

ag

农业

wh

批发

pr

专业服务

mi

采矿业

re

零售

ed

教育与健康

ut

公用事业

tr

运输

ar

艺术与娱乐

co

建筑

in

信息

ot

其他服务(不包括政府)

ma

制造业

fi

金融

go

政府

ij的箭头表示i行业的一些产出作为j行业生产的投入。

经济的特征是存在许多这样的联系。

分析这些联系的基本框架是列昂惕夫的投入产出模型。

在介绍投入产出模型之后,我们将描述它与线性规划讲座的一些联系。

39.2. 投入产出分析#

  • x0为单一外生生产要素的数量,例如劳动力

  • xj,j=1,n为最终产品j的总产出

  • dj,j=1,n为可用于最终消费的最终产品j的净产出

  • zij为用作生产产品j所投入的产品i的数量,i=1,nj=1,n

  • z0j为用于生产产品j的劳动力数量

  • aij为生产一单位产品j所需的产品i的单位数,i=0,,n,j=1,n

  • w>0为外生劳动力工资,以每单位劳动力的美元计

  • pn×1的生产品i=1,,n价格向量

生产产品j{1,,n}的技术由以下列昂惕夫函数描述

xj=mini{0,,n}(zijaij)

39.2.1. 两种产品#

为说明起见,我们首先设n=2并制定以下网络。

Hide code cell source
G = nx.DiGraph()

nodes= (1, 2, 'c')
edges = ((1, 1), (1, 2), (2, 1), (2, 2), (1, 'c'), (2, 'c'))
edges1 = ((1, 1), (1, 2), (2, 1), (2, 2), (1, 'c'))
edges2 = [(2,'c')]
G.add_nodes_from(nodes)
G.add_edges_from(edges)

pos_list = ([0, 0], [2, 0], [1, -1])
pos = dict(zip(G.nodes(), pos_list))

fig, ax = plt.subplots()
plt.axis("off")

nx.draw_networkx_nodes(G, pos=pos, node_size=800,
                       node_color='white', edgecolors='black')
nx.draw_networkx_labels(G, pos=pos)
nx.draw_networkx_edges(G,pos=pos, edgelist=edges1,
                       node_size=300, connectionstyle='arc3,rad=0.2',
                       arrowsize=10, min_target_margin=15)
nx.draw_networkx_edges(G, pos=pos, edgelist=edges2,
                       node_size=300, connectionstyle='arc3,rad=-0.2',
                       arrowsize=10, min_target_margin=15)

plt.text(0.055, 0.125, r'$z_{11}$')
plt.text(1.825, 0.125, r'$z_{22}$')
plt.text(0.955, 0.1, r'$z_{21}$')
plt.text(0.955, -0.125, r'$z_{12}$')
plt.text(0.325, -0.5, r'$d_{1}$')
plt.text(1.6, -0.5, r'$d_{2}$')

plt.show()
_images/c9c282cdc521360a6f44f1e3ec33143bdb1a166a775e621dbd013479195b960f.png

可行分配必须满足

(1a11)x1a12x2d1a21x1+(1a22)x2d2a01x1+a02x2x0

这可以用图形表示如下。

Hide code cell source
fig, ax = plt.subplots()
ax.grid()

# 绘制约束线
ax.hlines(0, -1, 400)
ax.vlines(0, -1, 200)

ax.plot(np.linspace(55, 380, 100), (50-0.9*np.linspace(55, 380, 100))/(-1.46), color="r")
ax.plot(np.linspace(-1, 400, 100), (60+0.16*np.linspace(-1, 400, 100))/0.83, color="r")
ax.plot(np.linspace(250, 395, 100), (62-0.04*np.linspace(250, 395, 100))/0.33, color="b")

ax.text(130, 38, r"$(1-a_{11})x_1 + a_{12}x_2 \geq d_1$", size=10)
ax.text(10, 105, r"$-a_{21}x_1 + (1-a_{22})x_2 \geq d_2$", size=10)
ax.text(150, 150, r"$a_{01}x_1 +a_{02}x_2 \leq x_0$", size=10)

# 绘制可行区域
feasible_set = Polygon(np.array([[301, 151],
                                 [368, 143],
                                 [250, 120]]),
                       color="cyan")
ax.add_patch(feasible_set)

# 绘制最优解
ax.plot(250, 120, "*", color="black")
ax.text(260, 115, "解", size=10)

plt.show()
_images/2dc6782b8763b78563d6ecf7745c8733c4aecfff5466cf1798cb4e29736c172b.png

生产的约束条件是

(39.1)#(IA)xda0xx0

其中 A 是一个 n×n 的矩阵,其每个值为 aij,而 a0=[a01a0n]

如果我们解 (39.1) 的第一组方程,得到总产出 x,我们得到

(39.2)#x=(IA)1dLd

其中矩阵 L=(IA)1 有时被称为 列昂惕夫逆矩阵

为确保 (39.2) 的解 X 是一个正向量,以下 霍金斯-西蒙条件 就足够了:

det(IA)>0 且(IA)ij>0 对所有 i=j

Example 39.1

例如,一个包含两种商品的经济体

(39.3)#A=[0.1400.010] 和 d=[502]
A = np.array([[0.1, 40],
             [0.01, 0]])
d = np.array([50, 2]).reshape((2, 1))
I = np.identity(2)
B = I - A
B
array([[ 9.e-01, -4.e+01],
       [-1.e-02,  1.e+00]])

让我们检查一下霍金斯-西蒙条件

np.linalg.det(B) > 0 # 检查霍金斯-西蒙条件
True

现在我们计算列昂惕夫逆矩阵

L = np.linalg.inv(B) # 得到列昂惕夫逆矩阵
L
array([[2.0e+00, 8.0e+01],
       [2.0e-02, 1.8e+00]])
x = L @ d   # 求解毛产出
x
array([[260. ],
       [  4.6]])

39.3. 生产可能性边界#

(39.1)的第二个等式可以写成

a0x=x0

(39.4)#A0d=x0

其中

A0=a0(IA)1

对于 i{1,,n}A0 的第 i 个分量是生产一单位第 i 种商品的最终产出所需的劳动量。

等式 (39.4) 描绘了一个生产可能性边界,表示在给定外生劳动投入 x0 的情况下,可以生产的最终消费束 d

Example 39.2

考虑(39.3)中的例子。

假设我们现在给出

a0=[4100]

然后我们可以通过以下方式找到 A0

a0 = np.array([4, 100])
A0 = a0 @ L
A0
array([ 10., 500.])

因此,这个经济体的生产可能性边界是:

10d1+500d2=x0

39.4. 价格#

[Dorfman et al., 1958] 认为,n 种商品的相对价格必须满足

p1=a11p1+a21p2+a01wp2=a12p1+a22p2+a02w

更一般地,

p=Ap+a0w

这表明每种最终商品的价格等于生产的总成本,包括中间投入品的成本 Ap 和劳动力成本 a0w

这个方程可以写成

(39.5)#(IA)p=a0w

这意味着

p=(IA)1a0w

注意 (39.5)(39.1) 通过相互转置的算子形成了一个共轭对

这种联系在经典线性规划及其对偶问题中再次出现。

39.5. 线性规划#

原始问题

minxwa0x

约束条件为

(IA)xd

相关的对偶问题

maxppd

约束条件为

(IA)pa0w

原始问题选择一个可行的生产计划,以最小化交付预先指定的最终商品消费向量 d 的成本。

对偶问题选择价格,以最大化预先指定的最终商品向量 d 的价值,同时受制于价格覆盖生产成本。

根据强对偶定理, 原始问题和对偶问题的最优值相同:

wa0x=pd

其中 表示原始和对偶问题的最优解。

对偶问题可以用图形表示如下。

Hide code cell source
fig, ax = plt.subplots()
ax.grid()

# 绘制约束线
ax.hlines(0, -1, 50)
ax.vlines(0, -1, 250)

ax.plot(np.linspace(4.75, 49, 100), (4-0.9*np.linspace(4.75, 49, 100))/(-0.16), color="r")
ax.plot(np.linspace(0, 50, 100), (33+1.46*np.linspace(0, 50, 100))/0.83, color="r")

ax.text(15, 175, r"$(1-a_{11})p_1 - a_{21}p_2 \leq a_{01}w$", size=10)
ax.text(30, 85, r"$-a_{12}p_1 + (1-a_{22})p_2 \leq a_{02}w$", size=10)

# 绘制可行区域
feasible_set = Polygon(np.array([[17, 69],
                                 [4, 0],
                                 [0,0],
                                 [0, 40]]),
                       color="cyan")
ax.add_patch(feasible_set)

# 绘制最优解
ax.plot(17, 69, "*", color="black")
ax.text(18, 60, "对偶解", size=10)

plt.show()
_images/85efc432dcad748ec3f6db1b05bb6822f95caad24c6cf41fe9ac4dd9d5d93567.png

39.6. 列昂惕夫逆矩阵#

我们已经讨论过,总产出 x 由公式 (39.2) 给出,其中 L 被称为列昂惕夫逆矩阵。

回顾 诺伊曼级数引理,它指出如果谱半径 r(A)<1,则 L 存在。 事实上

L=i=0Ai

39.6.1. 需求冲击#

现在我们考虑需求冲击 Δd 的影响,它将需求从 d0 转变为 d1=d0+Δd。 总产出从 x0=Ld0 转变为 x1=Ld1

如果 r(A)<1,则存在解,且

Δx=LΔd=Δd+A(Δd)+A2(Δd)+

这说明 L 的一个元素 lij 显示了对商品 j 的需求单位变化对部门 i 的总影响。

39.7. 图论的应用#

我们可以通过应用图论来进一步研究投入产出网络。

投入产出网络可以通过邻接矩阵 A 导出的加权有向图来表示。

节点集 V=[n] 是部门列表,边集由以下给出:

E={(i,j)V×V:aij>0}

Fig. 39.1 中,权重由箭头的宽度表示,与相应的投入产出系数成正比。

现在我们可以使用中心性度量来对部门进行排序,并讨论它们相对于其他部门的重要性。

39.7.1. 特征向量中心性#

节点 i 的特征向量中心性由以下公式衡量:

ei=1r(A)1jnaijej

我们为 Fig. 39.1 中表示的部门绘制了基于枢纽的特征向量中心性条形图。

Hide code cell source
fig, ax = plt.subplots()
ax.bar(codes, centrality, color=color_list, alpha=0.6)
ax.set_ylabel("特征向量中心性", fontsize=12)
plt.show()
_images/c1866a9f90e53156bf20259ce984cf6a49a80688532625a21404b971388a6f0e.png

较高的指标表示作为供应商的重要性更高。

因此,大多数行业的需求冲击将显著影响具有高特征向量中心性的行业的活动。

上图表明制造业是美国经济中最主导的行业。

39.7.2. 产出乘数#

在投入产出网络中对行业进行排名的另一种方法是通过产出乘数。

行业 j产出乘数,记为 μj,通常定义为行业 j 需求单位变化所产生的整个行业范围内的总影响。

早些时候在讨论需求冲击时,我们得出结论:对于 L=(lij),元素 lij 表示行业 j 需求单位变化对行业 i 的影响。

因此,

μj=j=1nlij

这可以写成 μ=1L

μ=1(IA)1

请注意,这里我们用 1 表示一个全为1的向量。

在这个指标中排名较高的行业是中间品的重要购买者。

这些行业的需求冲击将对整个生产网络造成巨大影响。

下图显示了 Fig. 39.1 中表示的各行业的产出乘数。

Hide code cell source
A, F = build_coefficient_matrices(Z, X)
omult = qbn_io.katz_centrality(A, authority=True)

fig, ax = plt.subplots()
omult_color_list = qbn_io.colorise_weights(omult,beta=False)
ax.bar(codes, omult, color=omult_color_list, alpha=0.6)
ax.set_ylabel("产出乘数", fontsize=12)
plt.show()
_images/45a743574eb03ec287795b1400e12436839c80eb15983e262bf4ea566c47e484.png

我们观察到制造业和农业是排名最高的行业。

39.8. 练习#

Exercise 39.1

[Dorfman et al., 1958] 第9章讨论了一个具有以下参数设置的例子:

A=[0.11.460.160.17] 和 a0=[.04.33]
x=[250120] 和 x0=50
d=[5060]

描述他们如何从以下关于农业和制造业的假设”数据”中推断出Aa0中的投入-产出系数:

z=[251754020] 和 z0=[1040]

其中z0是每个行业使用的劳动服务的向量。

Exercise 39.2

推导上一练习中所描述经济的生产可能性边界。