@@ -17,27 +17,27 @@ kernelspec:
17
17
</div>
18
18
```
19
19
20
- # 求职搜索 III: 拟合值函数迭代
20
+ # 工作搜寻 III: 拟合值函数迭代
21
21
22
22
``` {contents} 目录
23
23
:depth: 2
24
24
```
25
25
26
26
## 概述
27
27
28
- 在本讲座中,我们再次研究{doc}` 带有离职的McCall求职搜索模型 <mccall_model_with_separation>` ,但这次使用连续工资分布 。
28
+ 在本讲座中,我们再次研究{doc}` 带有离职情形的McCall工作搜寻模型 <mccall_model_with_separation>` ,但这次会使用连续工资分布 。
29
29
30
- 虽然我们在{doc}` 第一个求职搜索讲座 <mccall_model>` 的练习中已经简要考虑过连续工资分布,但在那种情况下 ,这种改变相对来说是微不足道的。
30
+ 虽然我们在{doc}` 第一个工作搜寻讲座 <mccall_model>` 的练习中已经简要讨论过连续工资分布,但在那个案例中 ,这种改变相对来说是微不足道的。
31
31
32
- 这是因为我们能够将问题简化为求解单个标量值(持续价值) 。
32
+ 这是因为我们能够将问题简化为求解单个标量值,即延续价值 。
33
33
34
- 在这里,由于分离,变化不那么简单,因为连续的工资分布导致了不可数的无限状态空间 。
34
+ 在这一讲座中,由于离职情形的存在,变化不再那么简单,因为连续工资分布会导致不可数的无限状态空间 。
35
35
36
- 无限状态空间带来了额外的挑战 ,特别是在应用值函数迭代(VFI)时。
36
+ 无限状态空间带来了额外的问题 ,特别是在应用值函数迭代(VFI)时。
37
37
38
- 这些挑战将促使我们通过添加插值步骤来修改VFI 。
38
+ 这些问题会促使我们通过添加插值这一步骤,来改进VFI方法 。
39
39
40
- VFI和这个插值步骤的组合被称为 ** 拟合值函数迭代** (fitted VFI)。
40
+ VFI和这个插值步骤的结合被称为 ** 拟合值函数迭代** (拟合 VFI)。
41
41
42
42
拟合VFI在实践中非常常见,所以我们将花一些时间来详细研究。
43
43
@@ -57,19 +57,19 @@ from numba.experimental import jitclass
57
57
58
58
## 算法
59
59
60
- 该模型与我们{doc}` 之前学习的 <mccall_model_with_separation> ` 带有工作分离的McCall模型相同,只是工资分布是连续的 。
60
+ 该模型与我们{doc}` 之前学习的 <mccall_model_with_separation> ` 带有离职情形的McCall模型相同,除了工资分布是连续的 。
61
61
62
- 我们将从{ref}` 简化转换 <ast_mcm>` 后得到的两个Bellman方程开始 。
62
+ 我们将从{ref}经 ` 简化变换 <ast_mcm>` 后得到的两个贝尔曼方程入手 。
63
63
64
- 为了适应连续的工资分布,它们采用以下形式 :
64
+ 为了适应连续工资抽样,这两个方程呈现以下形式 :
65
65
66
66
``` {math}
67
67
:label: bell1mcmc
68
68
69
69
d = \int \max \left\{ v(w'), \, u(c) + \beta d \right\} q(w') d w'
70
70
```
71
71
72
- 和
72
+ 以及
73
73
74
74
``` {math}
75
75
:label: bell2mcmc
@@ -82,29 +82,29 @@ v(w) = u(w) + \beta
82
82
83
83
这里的未知量是函数$v$和标量$d$。
84
84
85
- 这些方程与我们之前处理的一对Bellman方程的区别在于 :
85
+ 这些方程与我们之前处理的一对贝尔曼方程的区别在于 :
86
86
87
87
1 . 在{eq}` bell1mcmc ` 中,原来对有限个工资值的求和变成了对无限集合的积分。
88
88
1 . {eq}` bell2mcmc ` 中的函数$v$定义在所有$w \in \mathbb R_ +$上。
89
89
90
- 函数 $q$ 在 {eq}` bell1mcmc ` 中是工资分布的密度函数 。
90
+ 函数 $q$ 在 {eq}` bell1mcmc ` 中是工资分布的概率密度函数 。
91
91
92
92
其支撑集等于 $\mathbb R_ +$。
93
93
94
94
### 值函数迭代
95
95
96
96
理论上,我们应该按以下步骤进行:
97
97
98
- 1 . 从一个对 {eq}` bell1mcmc ` --{eq}` bell2mcmc ` 解的猜测值 $v, d$ 开始 。
99
- 1 . 将 $v, d$ 代入 {eq}` bell1mcmc ` --{eq}` bell2mcmc ` 的右侧 ,
100
- 计算左侧以获得更新值 $v', d'$
101
- 1 . 除非满足某些停止条件,否则设置 $(v, d) = (v', d')$
98
+ 1 . 对 {eq}` bell1mcmc ` --{eq}` bell2mcmc ` 的解设定初始猜测值 $v, d$ 。
99
+ 1 . 将 $v, d$ 代入 {eq}` bell1mcmc ` --{eq}` bell2mcmc ` 的右侧表达式 ,
100
+ 通过计算获得左侧更新值 $v', d'$
101
+ 1 . 若未满足某些终止条件,则令 $(v, d) = (v', d')$
102
102
并返回步骤2。
103
103
104
- 然而,在实施这个程序之前 ,我们必须面对一个问题:
105
- 值函数的迭代既不能被精确计算 ,也不能被存储在计算机中。
104
+ 然而,在实施这个算法之前 ,我们必须面对一个问题:
105
+ 值函数的迭代序列既不能被精确计算 ,也不能被存储在计算机中。
106
106
107
- 要理解这个问题,请考虑 {eq}` bell2mcmc ` 。
107
+ 要理解这个问题,请考察 {eq}` bell2mcmc ` 。
108
108
109
109
即使 $v$ 是一个已知函数,存储其更新值 $v'$ 的唯一方法
110
110
是记录其在每个 $w \in \mathbb R_ +$ 处的值 $v'(w)$。
@@ -113,36 +113,36 @@ v(w) = u(w) + \beta
113
113
114
114
### 拟合值函数迭代
115
115
116
- 我们将改用** 拟合值函数迭代** 。
116
+ 我们将改用** 拟合值函数迭代** 的方法 。
117
117
118
118
具体步骤如下:
119
119
120
- 假设已有当前的猜测值 $v$。
120
+ 假设当前给定猜测值函数 $v$。
121
121
122
122
我们只在有限个"网格"点 $w_1 < w_2 < \cdots < w_I$ 上记录函数 $v'$ 的值,然后在需要时根据这些信息重构 $v'$。
123
123
124
- 更具体地说,算法将是
124
+ 更具体地说,这个算法是
125
125
126
126
(fvi_alg)=
127
- 1 . 从一个数组 $\mathbf v$ 开始,该数组表示在某些网格点 $\{ w_i\} $ 上的初始值函数猜测值 。
128
- 1 . 基于 $\mathbf v$ 和 $\{ w_i\} $,通过插值或近似在状态空间 $\mathbb R_ +$ 上构建函数 $v$。
127
+ 1 . 从一个数组 $\mathbf v$ 开始,该数组表示值函数在某些网格点 $\{ w_i\} $ 上的初始猜测值 。
128
+ 1 . 基于 $\mathbf v$ 和 $\{ w_i\} $,通过插值法或近似法在状态空间 $\mathbb R_ +$ 上构建函数 $v$。
129
129
1 . 在每个网格点 $w_i$ 上获取并记录更新后的函数 $v'(w_i)$ 的样本。
130
- 1 . 除非满足某些停止条件,否则将此作为新数组并返回步骤1 。
130
+ 1 . 若未满足某些停止条件,则将其作为新数组并返回步骤1 。
131
131
132
132
我们应该如何处理步骤2?
133
133
134
- 这是一个函数逼近问题 ,有很多种方法可以解决。
134
+ 这是一个函数近似问题 ,有很多种方法可以解决。
135
135
136
- 这里重要的是函数近似方案不仅要对每个 $v$产生良好的近似,而且还要能够很好地配合上述更广泛的迭代算法 。
136
+ 对于函数近似方案,我们需要考虑两个关键点:一是要能够准确地近似每个 $v$,二是要能够有效地融入到整个迭代算法中 。
137
137
138
- 从这两个方面来看,分段线性插值是一个不错的选择 。
138
+ 从这两个方面来看,连续分段线性插值法是一个不错的选择 。
139
139
140
140
这种方法
141
141
142
- 1 . 能够很好地配合值函数迭代(参见{cite}` gordon1995stable ` 或{cite}` stachurski2008continuous ` )且
143
- 1 . 能保持有用的形状特性 ,如单调性和凹凸性。
142
+ 1 . 能够很好地配合值函数迭代(参见{cite}` gordon1995stable ` 或{cite}` stachurski2008continuous ` )
143
+ 1 . 能保持关键的形状特性 ,如单调性和凹凸性。
144
144
145
- 线性插值将使用 [ numpy.interp] ( https://numpy.org/doc/stable/reference/generated/numpy.interp.html ) 来实现。
145
+ 线性插值将通过 [ numpy.interp] ( https://numpy.org/doc/stable/reference/generated/numpy.interp.html ) 来实现。
146
146
147
147
下图展示了在网格点$0, 0.2, 0.4, 0.6, 0.8, 1$上对任意函数进行分段线性插值的情况。
148
148
@@ -159,8 +159,8 @@ def Af(x):
159
159
160
160
fig, ax = plt.subplots()
161
161
162
- ax.plot(f_grid, f(f_grid), 'b-', label='true function ')
163
- ax.plot(f_grid, Af(f_grid), 'g-', label='linear approximation ')
162
+ ax.plot(f_grid, f(f_grid), 'b-', label='真实函数 ')
163
+ ax.plot(f_grid, Af(f_grid), 'g-', label='线性近似 ')
164
164
ax.vlines(c_grid, c_grid * 0, f(c_grid), linestyle='dashed', alpha=0.5)
165
165
166
166
ax.legend(loc="upper center")
@@ -171,11 +171,11 @@ plt.show()
171
171
172
172
## 实现
173
173
174
- 第一步是为具有分离和连续工资分布的McCall模型构建一个即时编译类 。
174
+ 第一步,是为具有离职情况和连续工资分布的McCall模型构建一个jit类 。
175
175
176
- 在本应用中 ,我们将效用函数设定为对数函数,即$u(c) = \ln c$。
176
+ 在这个应用中 ,我们将效用函数设定为对数函数,即$u(c) = \ln c$。
177
177
178
- 我们将为工资采用对数正态分布,当$z$为标准正态分布且$\mu, \sigma$为参数时,$ w = \exp(\mu + \sigma z)$。
178
+ 我们将采用对数正态分布来描述工资水平,其具体形式为$ w = \exp(\mu + \sigma z)$,其中$z$服从标准正态分布,$\mu, \sigma$为模型参数 。
179
179
180
180
``` {code-cell} ipython3
181
181
@jit
@@ -186,15 +186,15 @@ def lognormal_draws(n=1000, μ=2.5, σ=0.5, seed=1234):
186
186
return w_draws
187
187
```
188
188
189
- 这是我们的类。
189
+ 以下是类的定义:
190
190
191
191
``` {code-cell} ipython3
192
192
mccall_data_continuous = [
193
193
('c', float64), # 失业补偿
194
- ('α', float64), # 工作分离率
194
+ ('α', float64), # 离职率
195
195
('β', float64), # 折现因子
196
196
('w_grid', float64[:]), # 用于拟合VFI的网格点
197
- ('w_draws', float64[:]) # 用于蒙特卡洛的工资抽样
197
+ ('w_draws', float64[:]) # 用于蒙特卡洛方法的工资抽样
198
198
]
199
199
200
200
@jitclass(mccall_data_continuous)
@@ -221,10 +221,10 @@ class McCallModelContinuous:
221
221
w = self.w_grid
222
222
u = lambda x: np.log(x)
223
223
224
- # 对数组表示的值函数进行插值
224
+ # 对用数组表示的值函数进行插值
225
225
vf = lambda x: np.interp(x, w, v)
226
226
227
- # 使用蒙特卡洛方法评估积分来更新d
227
+ # 使用蒙特卡洛方法进行积分估值来更新d
228
228
d_new = np.mean(np.maximum(vf(self.w_draws), u(c) + β * d))
229
229
230
230
# 更新v
@@ -261,9 +261,9 @@ def solve_model(mcm, tol=1e-5, max_iter=2000):
261
261
return v, d
262
262
```
263
263
264
- 这是一个函数 ` compute_reservation_wage ` ,它接收一个` McCallModelContinuous ` 实例并返回相应的保留工资。
264
+ 以下是一个函数 ` compute_reservation_wage ` ,它接收一个` McCallModelContinuous ` 实例并返回相应的保留工资。
265
265
266
- 如果对所有的w都有$ v(w) < h$,那么函数返回np .inf
266
+ 如果对所有的$w$都有$ v(w) < h$,那么函数返回 ` np .inf` 。
267
267
268
268
``` {code-cell} ipython3
269
269
@jit
@@ -272,7 +272,7 @@ def compute_reservation_wage(mcm):
272
272
通过寻找最小的满足v(w) >= h的w,
273
273
计算McCall模型实例的保留工资。
274
274
275
- 如果不存在这样的w,则w_bar被设为np .inf。
275
+ 如果不存在这样的w,那么w_bar就被设为np .inf。
276
276
"""
277
277
u = lambda x: np.log(x)
278
278
@@ -288,25 +288,25 @@ def compute_reservation_wage(mcm):
288
288
return w_bar
289
289
```
290
290
291
- 这些练习要求你探索解决方案以及它如何随参数变化 。
291
+ 下面的练习中我们探究保留工资随参数变化的情况 。
292
292
293
293
## 练习
294
294
295
295
``` {exercise}
296
296
:label: mfv_ex1
297
297
298
- 使用上面的代码探索当工资参数 $\mu$ 发生变化时,保留工资会发生什么变化。
298
+ 使用上面的代码来探究当工资参数 $\mu$ 发生变化时,保留工资会发生什么变化。
299
299
300
- 使用默认参数和 `mu_vals = np.linspace(0.0, 2.0, 15)` 中的 $\mu$ 值 。
300
+ 使用默认参数以及 `mu_vals = np.linspace(0.0, 2.0, 15)` 中 $\mu$ 的值 。
301
301
302
- 保留工资的变化是否如你所预期 ?
302
+ 保留工资的变化是否符合你的预期 ?
303
303
```
304
304
305
305
``` {solution-start} mfv_ex1
306
306
:class: dropdown
307
307
```
308
308
309
- 这是一个解决方案
309
+ 这是一种答案
310
310
311
311
``` {code-cell} ipython3
312
312
mcm = McCallModelContinuous()
@@ -320,41 +320,48 @@ for i, m in enumerate(mu_vals):
320
320
w_bar = compute_reservation_wage(mcm)
321
321
w_bar_vals[i] = w_bar
322
322
323
- ax.set(xlabel='mean ', ylabel='reservation wage ')
324
- ax.plot(mu_vals, w_bar_vals, label=r'$\bar w$ as a function of $\mu$')
323
+ ax.set(xlabel='均值 ', ylabel='保留工资 ')
324
+ ax.plot(mu_vals, w_bar_vals, label=r'$\bar w$ 随 $\mu$ 的变化 ')
325
325
ax.legend()
326
326
327
327
plt.show()
328
328
```
329
329
330
- 不出所料,当报价分布向右偏移时 ,求职者更倾向于等待。
330
+ 不出所料,当工资报价分布向右偏移时 ,求职者更倾向于等待。
331
331
332
332
``` {solution-end}
333
333
```
334
334
335
335
``` {exercise}
336
336
:label: mfv_ex2
337
337
338
- 让我们现在来考虑求职者如何对波动性的增加做出反应 。
338
+ 现在我们来考虑求职者在面对波动性增加时,会做出怎样的反应 。
339
339
340
- 为了理解这一点,请计算当工资报价分布在 $(m - s, m + s)$ 上均匀分布,且 $s$ 变化时的保留工资 。
340
+ 为了理解这一点,请计算当工资报价在 $(m - s, m + s)$ 上均匀分布且 $s$ 会变化时的保留工资 。
341
341
342
- 这里的想法是我们保持均值不变,但扩大分布范围 。
342
+ 这里的想法是我们保持均值不变,但扩大支撑集 。
343
343
344
- (这是一种*均值保持扩散 *。)
344
+ (这是一种*均值保留展开 *。)
345
345
346
346
使用 `s_vals = np.linspace(1.0, 2.0, 15)` 和 `m = 2.0`。
347
347
348
- 说明你预期保留工资如何随 $s$ 变化。
348
+ 在分析保留工资如何随 $s$ 变化之前,让我们先思考一下:
349
349
350
- 现在计算它。结果是否如你所预期?
350
+ 当工资分布的波动性增加时,求职者面临两个相反的影响:
351
+
352
+ 1. 更高的不确定性可能会让求职者倾向于接受当前工作机会,因为这提供了确定性收入
353
+ 2. 但另一方面,更大的波动性也意味着出现高工资的机会增加了
354
+
355
+ 你认为哪个影响会占主导地位?保留工资会随着 $s$ 的增加而上升还是下降?
356
+
357
+ 现在,请计算它。结果是否符合你的预期?
351
358
```
352
359
353
360
``` {solution-start} mfv_ex2
354
361
:class: dropdown
355
362
```
356
363
357
- 这是一个解决方案
364
+ 这是其中一种解法
358
365
359
366
``` {code-cell} ipython3
360
367
mcm = McCallModelContinuous()
@@ -371,7 +378,7 @@ for i, s in enumerate(s_vals):
371
378
w_bar_vals[i] = w_bar
372
379
373
380
ax.set(xlabel='波动性', ylabel='保留工资')
374
- ax.plot(s_vals, w_bar_vals, label=r'工资波动性函数中的 $\bar w$')
381
+ ax.plot(s_vals, w_bar_vals, label=r'将工资波动性作为自变量的 $\bar w$')
375
382
ax.legend()
376
383
377
384
plt.show()
@@ -382,7 +389,7 @@ plt.show()
382
389
383
390
人们可能会认为,更高的波动性会使求职者更倾向于接受给定的工作机会,因为接受工作代表确定性,而等待则意味着风险。
384
391
385
- 但求职就像持有期权:劳动者只面临上行风险 (因为在自由市场中,没有人可以强迫他们接受不好的工作机会)。
392
+ 但求职就像持有期权:工人只面临上行风险 (因为在自由市场中,没有人可以强迫他们接受不好的工作机会)。
386
393
387
394
更大的波动性意味着更高的上行潜力,这会鼓励求职者继续等待。
388
395
0 commit comments