@@ -25,10 +25,7 @@ kernelspec:
25
25
```
26
26
27
27
``` {epigraph}
28
- "询问一个McCall工人就像与一个失业的朋友对话:
29
- '也许你的期望值定得太高了',或者'为什么你在找到新工作之前就辞掉了原来的工作?'这就是真正的社会科学:试图通过观察人们所处的情况、他们面临的选择来建模,以理解人类行为
30
-
31
- "以及他们自己所认为的优缺点。" -- 罗伯特·卢卡斯(小)
28
+ "询问一个McCall工人就像与一个失业的朋友对话:'也许你的期望值定得太高了',或者'为什么你在找到新工作之前就辞掉了原来的工作?'这就是真正的社会科学:试图通过观察人们所处的情况、他们面临的选择、以及他们自己所认为的优缺点来建模,以理解人类行为。" -- 小罗伯特·卢卡斯
32
29
```
33
30
34
31
除了Anaconda中已有的内容外,本讲座还需要以下库:
@@ -46,15 +43,15 @@ McCall 搜索模型 {cite}`McCall1970` 帮助改变了经济学家思考劳动
46
43
47
44
为了阐明"非自愿"失业等概念,McCall 从以下因素建模了失业工人的决策问题:
48
45
49
- * 当前和可能的未来工资
50
- * 不耐心程度
46
+ * 当前工资和可能的未来工资
47
+ * 耐心程度
51
48
* 失业补助
52
49
53
50
为了解决这个决策问题,McCall 使用了动态规划。
54
51
55
- 在这里 ,我们将建立 McCall 的模型并使用动态规划来分析它。
52
+ 在本讲中 ,我们将建立 McCall 的模型并使用动态规划来分析它。
56
53
57
- 我们将看到,McCall 的模型不仅本身很有趣,而且也是学习动态规划的绝佳载体 。
54
+ 我们将看到,McCall 的模型不仅本身很有趣,而且是学习动态规划的绝佳载体 。
58
55
59
56
让我们从一些导入开始:
60
57
@@ -65,7 +62,7 @@ FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf"
65
62
mpl.font_manager.fontManager.addfont(FONTPATH)
66
63
plt.rcParams['font.family'] = ['Source Han Serif SC']
67
64
68
- plt.rcParams["figure.figsize"] = (11, 5) #set default figure size
65
+ plt.rcParams["figure.figsize"] = (11, 5) #设置默认图片尺寸
69
66
import numpy as np
70
67
from numba import jit, float64
71
68
from numba.experimental import jitclass
@@ -78,35 +75,35 @@ from quantecon.distributions import BetaBinomial
78
75
``` {index} single: Models; McCall
79
76
```
80
77
81
- 一个失业者在每个时期都会收到工资为 $w_t$的工作机会。
78
+ 一个失业者在每个时期都会收到一个工资为 $w_t$的工作机会。
82
79
83
80
在本讲中,我们采用以下简单环境:
84
81
85
82
* 工资序列$\{ w_t\} _ {t \geq 0}$是独立同分布的,其中$q(w)$是在有限集合$\mathbb{W}$中观察到工资$w$的概率。
86
- * 代理人在 $t$期开始时观察到 $w_t$。
87
- * 代理人知道 $\{ w_t\} $是具有共同分布$q$的独立同分布序列,并可以利用这一点计算期望值。
83
+ * 失业者在 $t$期的开始观察到 $w_t$。
84
+ * 失业者知道 $\{ w_t\} $是具有共同分布$q$的独立同分布序列,并可以利用这一点计算期望值。
88
85
89
86
(在后续讲座中,我们将放宽这些假设。)
90
87
91
- 在时间$t$,我们的代理人有两个选择 :
88
+ 在时间$t$,失业者有两个选择 :
92
89
93
- 1 . 接受工作机会并以固定工资 $w_t$永久工作。
90
+ 1 . 接受工作机会,并以固定工资 $w_t$永久工作。
94
91
1 . 拒绝工作机会,获得失业补助$c$,并在下一期重新考虑。
95
92
96
- 代理人具有无限生命,目标是最大化预期的折现收益总和
93
+ 假设失业者具有无限长的生命,其目标是最大化折现收益总和的期望值
97
94
98
95
$$
99
96
\mathbb{E} \sum_{t=0}^{\infty} \beta^t y_t
100
97
$$
101
98
102
99
常数$\beta$位于$(0, 1)$之间,被称为** 折现因子** 。
103
100
104
- $\beta$ 越小,代理人对未来效用的折现程度相对于当前效用就越高 。
101
+ $\beta$ 越小,未来效用的折现值越高 。
105
102
106
- 变量 $y_t$ 是收入,等于
103
+ 变量 $y_t$ 是收入,
107
104
108
- * 就业时的工资 $w_t$
109
- * 失业时的失业补助金 $c$
105
+ * 当就业时,它等于工资 $w_t$
106
+ * 当失业时,它等于失业补助金 $c$
110
107
111
108
112
109
### 权衡取舍
@@ -136,15 +133,15 @@ $\beta$ 越小,代理人对未来效用的折现程度相对于当前效用就
136
133
137
134
为此,让$v^* (w)$表示当工资为$w \in \mathbb{W}$时,一个失业工人在当前时期开始时的总生命周期* 价值* 。
138
135
139
- 具体来说,该个体手头有工资offer $w$。
136
+ 具体来说,我们考虑这样一种情况:一个失业者现在面临一个工资为 $w$ 的工作机会 。
140
137
141
- 更准确地说 ,$v^* (w)$表示当处于这种情况下的个体在当前和未来所有时间点做出 * 最优* 决策时,目标函数{eq}` objective ` 的价值。
138
+ 那么 ,$v^* (w)$表示的是该失业者在当前和未来所有时间点做出 * 最优* 决策时,目标函数{eq}` objective ` 的价值。
142
139
143
140
当然,计算$v^* (w)$并不简单,因为我们还不知道哪些决策是最优的,哪些不是!
144
141
145
- 但是可以将$v^* $看作一个函数,它为每个可能的工资$s$分配在手头有该offer时可获得的最大生命周期价值 。
142
+ 但是可以将$v^* $看作一个函数,它为每个可能的工资$w$分配在持有该工作机会时可获得的最大终身价值 。
146
143
147
- 一个关键的观察是 ,这个函数$v^* $必须满足以下递归关系
144
+ 一个关键点是 ,这个函数$v^* $必须满足以下递归关系: 对于 $\mathbb{W}$ 中的每一个可能的 $w$,我们有
148
145
149
146
``` {math}
150
147
:label: odu_pv
@@ -156,33 +153,29 @@ v^*(w)
156
153
\right\}
157
154
```
158
155
159
- 对于 $\mathbb{W}$ 中的每一个可能的 $w$。
160
-
161
156
这个重要的方程是** 贝尔曼方程** 的一个版本,这个方程在经济动态学和其他涉及长期规划的领域中无处不在。
162
157
163
158
其背后的直观理解如下:
164
159
165
- * max运算中的第一项是接受当前报价的终身收益 ,因为
160
+ * max运算中的第一项是接受当前工作机会的终身收益 ,因为
166
161
167
162
$$
168
163
\frac{w}{1 - \beta} = w + \beta w + \beta^2 w + \cdots
169
164
$$
170
165
171
- * max运算中的第二项是** 延续价值 ** ,即拒绝当前报价并在随后所有时期做出最优行为的终身收益
166
+ * max运算中的第二项是** 延续值 ** ,即拒绝当前工作机会并在随后所有时期做出最优行为的终身收益。
172
167
173
- 如果我们优化并从这两个选项中选择最佳选项,我们就能获得当前报价 $w$ 下的最大终身价值。
168
+ 通过从这两个选项中选择最优的一个,我们就能得到在当前工资报价 $w$ 下的最大终身价值。
174
169
175
- 但这恰恰就是 {eq}` odu_pv ` 左边的 $v^* (w)$。
170
+ 而这恰恰就是 {eq}` odu_pv ` 左边的 $v^* (w)$。
176
171
177
172
### 最优策略
178
173
179
174
假设现在我们能够求解 {eq}` odu_pv ` 得到未知函数 $v^* $。
180
175
181
- 一旦我们掌握了这个函数,我们就可以做出最优行为(即做出
176
+ 一旦我们掌握了这个函数,我们就可以做出最优行为(即在接受和拒绝之间做出正确选择)。
182
177
183
- 在右侧选择最大值(在接受和拒绝之间)。
184
-
185
- 我们只需要在{eq}` odu_pv ` 右侧选择最大值即可。
178
+ 我们只需要在{eq}` odu_pv ` 的右侧选择最大值即可。
186
179
187
180
最优行动最好被理解为一个** 策略** ,它通常是一个从状态到行动的映射。
188
181
218
211
219
212
这里的 $\bar w$(称为* 保留工资* )是一个取决于 $\beta, c$ 和工资分布的常数。
220
213
221
- 代理应当当且仅当当前工资报价超过保留工资时接受 。
214
+ 失业者当且仅当当前工作机会的工资超过保留工资时接受该工作 。
222
215
223
216
根据{eq}` reswage ` ,如果我们能计算出价值函数,就能计算出这个保留工资。
224
217
@@ -270,7 +263,7 @@ v'(i)
270
263
v(j) q (j)
271
264
\right\}
272
265
\quad
273
- \text{for } i = 1, \ldots, n
266
+ \text{对于 } i = 1, \ldots, n
274
267
```
275
268
276
269
第3步:计算 $v$ 和 $v'$ 之间的差异度量,例如 $\max_i |v(i)- v'(i)|$。
@@ -279,13 +272,13 @@ v'(i)
279
272
280
273
第5步:返回 $v$。
281
274
282
- 对于较小的容差,返回的函数 $v$ 是值函数 $v^* $ 的近似值。
275
+ 对于较小的容差,返回的函数 $v$ 是价值函数 $v^* $ 的近似值。
283
276
284
277
下面的理论将详细说明这一点。
285
278
286
279
### 不动点理论
287
280
288
- 这些想法背后的数学原理是什么 ?
281
+ 这个算法背后的数学原理是什么 ?
289
282
290
283
首先,通过以下方式定义从 $\mathbb R^n$ 到自身的映射 $T$:
291
284
@@ -308,19 +301,19 @@ v'(i)
308
301
309
302
* 这是从初始猜测 $v$ 开始,应用 $k$ 次 $T$ 的结果
310
303
311
- 可以证明,$T$ 在 $\mathbb R^n$ 上满足[ 巴拿赫不动点定理] ( https://en.wikipedia.org/wiki/Banach_fixed-point_theorem ) 的条件。
304
+ 可以证明,$T$ 在 $\mathbb R^n$ 上满足[ 巴拿赫不动点定理] ( https://baike.baidu.com/item/%E5%B7%B4%E6%8B%BF%E8%B5%AB%E4%B8%8D%E5%8A%A8%E7%82%B9%E5%AE%9A%E7%90%86/9492042 ) 的条件。
312
305
313
- 其中一个推论是 $T$ 在 $\mathbb R^n$ 中有唯一的不动点。
306
+ 一个推论是 $T$ 在 $\mathbb R^n$ 中有唯一的不动点。
314
307
315
308
* 即存在唯一的向量 $\bar v$ 使得 $T \bar v = \bar v$。
316
309
317
- 此外 ,从 $T$ 的定义可以直接得出这个不动点就是 $v^* $。
310
+ 而且 ,从 $T$ 的定义可以直接得出这个不动点就是 $v^* $。
318
311
319
312
巴拿赫收缩映射定理的第二个推论是,无论 $v$ 取何值,序列 $\{ T^k v \} $ 都会收敛到不动点 $v^* $。
320
313
321
314
### 实现
322
315
323
- 对于状态过程的分布 $q$,我们的默认选择是[ Beta-二项分布] ( https://en.wikipedia .org/wiki/Beta-binomial_distribution ) 。
316
+ 对于状态过程的分布 $q$,我们的默认选择是[ Beta-二项分布] ( https://docs.scipy .org.cn/doc/scipy/tutorial/stats/discrete_betabinom.html ) 。
324
317
325
318
``` {code-cell} ipython3
326
319
n, a, b = 50, 200, 100 # 默认参数
@@ -347,7 +340,7 @@ plt.show()
347
340
348
341
我们将使用Numba来加速我们的代码。
349
342
350
- * 特别参见 [ 我们关于Numba的讲座] ( https://python-programming.quantecon.org/numba.html ) 中对` @jitclass ` 的讨论。
343
+ * 参见 [ 我们关于Numba的讲座] ( https://python-programming.quantecon.org/numba.html ) 中对` @jitclass ` 的讨论。
351
344
352
345
以下内容通过提供一些类型来帮助Numba
353
346
@@ -360,9 +353,7 @@ mccall_data = [
360
353
]
361
354
```
362
355
363
- 这是一个用于存储数据并计算状态-动作对值的类,
364
- 即计算贝尔曼方程 {eq}` odu_pv2p ` 右侧最大括号中的值,
365
- 基于当前状态和任意可行动作。
356
+ 这是一个用于存储数据并计算状态-行动对的值的类,即基于当前状态和任意可行的行动,计算贝尔曼方程 {eq}` odu_pv2p ` 右侧最大值括号中的值。
366
357
367
358
类中包含了默认参数值。
368
359
@@ -381,8 +372,8 @@ class McCallModel:
381
372
"""
382
373
# 简化名称
383
374
c, β, w, q = self.c, self.β, self.w, self.q
384
- # 评估每个状态-动作对的值
385
- # 考虑动作 = 接受或拒绝当前报价
375
+ # 评估每个状态-行动对的值
376
+ # 考虑行动 = 接受或拒绝当前报价
386
377
accept = w[i] / (1 - β)
387
378
reject = c + β * np.sum(v * q)
388
379
@@ -430,7 +421,7 @@ plot_value_function_seq(mcm, ax)
430
421
plt.show()
431
422
```
432
423
433
- 你可以看到收敛正在发生 :连续的迭代值越来越接近。
424
+ 你可以看到收敛的发生 :连续的迭代值越来越接近。
434
425
435
426
这里有一个更严谨的迭代计算极限的方法,它会持续计算直到连续迭代之间的测量偏差小于容差值。
436
427
@@ -469,7 +460,7 @@ def compute_reservation_wage(mcm,
469
460
return (1 - β) * (c + β * np.sum(v * q))
470
461
```
471
462
472
- 下一行计算在默认参数下的保留工资
463
+ 现在我们计算在默认参数下的保留工资
473
464
474
465
``` {code-cell} ipython3
475
466
compute_reservation_wage(mcm)
@@ -522,7 +513,7 @@ plt.show()
522
513
523
514
但对于我们的McCall搜索模型来说,还有一个更简单的方法,可以避免计算价值函数。
524
515
525
- 让 $h$ 表示继续值 :
516
+ 让 $h$ 表示延续值 :
526
517
527
518
``` {math}
528
519
:label: j1
581
572
582
573
我们可以再次使用巴拿赫不动点定理来证明这个过程总是收敛的。
583
574
584
- 这里的一个重大区别是,我们是在对一个标量 $h$ 进行迭代,而不是对一个 $n$ 维向量 $v(i), i = 1, \ldots, n$ 进行迭代。
575
+ 与之前的方法相比,这里有一个重要区别:我们现在是对单个标量 $h$ 进行迭代,而不是像之前那样对 $n$ 维向量 $v(i), i = 1, \ldots, n$ 进行迭代,这使得计算过程更加简单 。
585
576
586
577
以下是实现代码:
587
578
@@ -614,7 +605,7 @@ def compute_reservation_wage_two(mcm,
614
605
return (1 - β) * h
615
606
```
616
607
617
- 你可以使用以下代码来解决下面的练习 。
608
+ 你可以使用以上代码来完成下面的练习 。
618
609
619
610
## 练习
620
611
@@ -625,7 +616,7 @@ def compute_reservation_wage_two(mcm,
625
616
626
617
> `c_vals = np.linspace(10, 40, 25)`
627
618
628
- 也就是说,让代理人从失业状态开始 ,根据给定参数计算其保留工资,然后模拟看需要多长时间才能接受工作。
619
+ 也就是说,让失业者从失业状态开始 ,根据给定参数计算其保留工资,然后模拟看需要多长时间才能接受工作。
629
620
630
621
重复多次并取平均值。
631
622
@@ -636,7 +627,7 @@ def compute_reservation_wage_two(mcm,
636
627
:class: dropdown
637
628
```
638
629
639
- 这是一个解决方案
630
+ 参考答案
640
631
641
632
``` {code-cell} ipython3
642
633
cdf = np.cumsum(q_default)
@@ -689,7 +680,7 @@ plt.show()
689
680
690
681
本练习的目的是展示如何将上文使用的离散工资分布替换为连续分布。
691
682
692
- 这是一个重要的主题 ,因为许多常用的分布都是连续的(即具有密度函数)。
683
+ 这是一个重要内容 ,因为许多常用的分布都是连续的(即具有密度函数)。
693
684
694
685
幸运的是,在我们的简单模型中理论变化很小。
695
686
742
733
:class: dropdown
743
734
```
744
735
745
- 这是一个解决方案 :
736
+ 参考答案 :
746
737
747
738
``` {code-cell} ipython3
748
739
mccall_data_continuous = [
@@ -771,7 +762,7 @@ def compute_reservation_wage_continuous(mcmc, max_iter=500, tol=1e-5):
771
762
772
763
c, β, σ, μ, w_draws = mcmc.c, mcmc.β, mcmc.σ, mcmc.μ, mcmc.w_draws
773
764
774
- h = np.mean(w_draws) / (1 - β) # 初始猜测
765
+ h = np.mean(w_draws) / (1 - β) # 初始值猜测
775
766
i = 0
776
767
error = tol + 1
777
768
while i < max_iter and error > tol:
@@ -791,7 +782,7 @@ def compute_reservation_wage_continuous(mcmc, max_iter=500, tol=1e-5):
791
782
792
783
现在我们研究保留工资如何随着 $c$ 和 $\beta$ 变化。
793
784
794
- 我们将使用等高线图来进行这项研究 。
785
+ 我们将使用等值线图来分析这个问题 。
795
786
796
787
``` {code-cell} ipython3
797
788
grid_size = 25
0 commit comments