39. 输入-输出模型#
39.1. 概述#
在我们学习输入-输出模型之前,本讲座需要以下导入和安装。
!pip install quantecon_book_networks
!pip install quantecon
!pip install pandas-datareader
Show 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个生产部门之间的联系网络。
Show 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)
Show 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()

Fig. 39.1 美国15个生产部门之间的联系网络#
标签 |
行业 |
标签 |
行业 |
标签 |
行业 |
---|---|---|---|---|---|
ag |
农业 |
wh |
批发 |
pr |
专业服务 |
mi |
采矿业 |
re |
零售 |
ed |
教育与健康 |
ut |
公用事业 |
tr |
运输 |
ar |
艺术与娱乐 |
co |
建筑 |
in |
信息 |
ot |
其他服务(不包括政府) |
ma |
制造业 |
fi |
金融 |
go |
政府 |
从
经济的特征是存在许多这样的联系。
分析这些联系的基本框架是列昂惕夫的投入产出模型。
在介绍投入产出模型之后,我们将描述它与线性规划讲座的一些联系。
39.2. 投入产出分析#
设
为单一外生生产要素的数量,例如劳动力 为最终产品 的总产出 为可用于最终消费的最终产品 的净产出 为用作生产产品 所投入的产品 的数量, , 为用于生产产品 的劳动力数量 为生产一单位产品 所需的产品 的单位数, 为外生劳动力工资,以每单位劳动力的美元计 为 的生产品 价格向量
生产产品
39.2.1. 两种产品#
为说明起见,我们首先设
Show 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()
可行分配必须满足
这可以用图形表示如下。
Show 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()
生产的约束条件是
其中
如果我们解 (39.1) 的第一组方程,得到总产出
其中矩阵
为确保 (39.2) 的解
Example 39.1
例如,一个包含两种商品的经济体
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)的第二个等式可以写成
或
其中
对于
等式 (39.4) 描绘了一个生产可能性边界,表示在给定外生劳动投入
Example 39.2
考虑(39.3)中的例子。
假设我们现在给出
然后我们可以通过以下方式找到
a0 = np.array([4, 100])
A0 = a0 @ L
A0
array([ 10., 500.])
因此,这个经济体的生产可能性边界是:
39.4. 价格#
[Dorfman et al., 1958] 认为,
更一般地,
这表明每种最终商品的价格等于生产的总成本,包括中间投入品的成本
这个方程可以写成
这意味着
注意 (39.5) 与 (39.1) 通过相互转置的算子形成了一个共轭对。
这种联系在经典线性规划及其对偶问题中再次出现。
39.5. 线性规划#
原始问题是
约束条件为
相关的对偶问题是
约束条件为
原始问题选择一个可行的生产计划,以最小化交付预先指定的最终商品消费向量
对偶问题选择价格,以最大化预先指定的最终商品向量
根据强对偶定理, 原始问题和对偶问题的最优值相同:
其中
对偶问题可以用图形表示如下。
Show 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()
39.6. 列昂惕夫逆矩阵#
我们已经讨论过,总产出
回顾 诺伊曼级数引理,它指出如果谱半径
39.6.1. 需求冲击#
现在我们考虑需求冲击
如果
这说明
39.7. 图论的应用#
我们可以通过应用图论来进一步研究投入产出网络。
投入产出网络可以通过邻接矩阵
节点集
在 Fig. 39.1 中,权重由箭头的宽度表示,与相应的投入产出系数成正比。
现在我们可以使用中心性度量来对部门进行排序,并讨论它们相对于其他部门的重要性。
39.7.1. 特征向量中心性#
节点
我们为 Fig. 39.1 中表示的部门绘制了基于枢纽的特征向量中心性条形图。
Show source
fig, ax = plt.subplots()
ax.bar(codes, centrality, color=color_list, alpha=0.6)
ax.set_ylabel("特征向量中心性", fontsize=12)
plt.show()
较高的指标表示作为供应商的重要性更高。
因此,大多数行业的需求冲击将显著影响具有高特征向量中心性的行业的活动。
上图表明制造业是美国经济中最主导的行业。
39.7.2. 产出乘数#
在投入产出网络中对行业进行排名的另一种方法是通过产出乘数。
行业
早些时候在讨论需求冲击时,我们得出结论:对于
因此,
这可以写成
请注意,这里我们用
在这个指标中排名较高的行业是中间品的重要购买者。
这些行业的需求冲击将对整个生产网络造成巨大影响。
下图显示了 Fig. 39.1 中表示的各行业的产出乘数。
Show 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()
我们观察到制造业和农业是排名最高的行业。
39.8. 练习#
Exercise 39.1
[Dorfman et al., 1958] 第9章讨论了一个具有以下参数设置的例子:
描述他们如何从以下关于农业和制造业的假设”数据”中推断出
其中
Solution to Exercise 39.1
For each
Exercise 39.2
推导上一练习中所描述经济的生产可能性边界。
Solution to Exercise 39.2
A = np.array([[0.1, 1.46],
[0.16, 0.17]])
a_0 = np.array([0.04, 0.33])
I = np.identity(2)
B = I - A
L = np.linalg.inv(B)
A_0 = a_0 @ L
A_0
array([0.16751071, 0.69224776])
因此,生产可能性边界由以下给出