在以家庭为单位的微观调查中,常使用家庭 fid 作为家庭识别码,并使用 pid 作为家庭成员的识别码。在通常情况下,一个家庭对应多个家庭成员的关系是稳定的。但是在微观调查中,由于对「家庭」和「家庭成员」的定义并不相同(例:视频代码),在某些定义下,一些成员可能会脱离家庭,组建新的家庭,这种情况一般称作「家庭分户」问题。截面数据不存在分户问题,但在追踪家庭微观调查中,常存在这类分户问题

这里不再讨论如何定义「家庭」和「家庭成员」,仅讨论如何解决分户问题。

1. 连续变量的分户问题

根据问卷中相关变量设置,CFPS 官方提供了一些综合收入综合指标。我们以 CFPS 的收入数据为例,解决从 2010 年来的连续变量的分户问题。

1
2
3
4
5
6
7
8
* 收入相关综合变量及其含义
* 家庭工资性收入 fwage_1
* 家庭经营性收入 foperate_1
* 家庭财产性收入 fproperty_1
* 家庭转移性收入 ftransfer_1
* 家庭其他收入 felse_1
* 家庭纯收入 fincome1
* 家庭人均收入 fincome1_per

根据变量的含义不同,家庭分户问题的处理方式也不同。工资性收入、经营行收入、财产性收入、转移性收入、其他收入、家庭纯收入等六个指标应当进行加总,家庭人均收入可以考虑取均值。

因此,可以做如下操作:

1
2
3
4
5
6
7
** 均值: 家庭人均收入
ereplace fincome1_per = mean(fincome1_per), by(fid10)

** 加总
foreach v in fwage_1 foperate_1 fproperty_1 ftransfer_1 felse_1 fincome1 {
ereplace `v' = total(`v'), by(fid10)
}

需要注意的是,上述命令中的分组依据变量是 fid10,与研究基期2010年对应。如果研究基期为2014年,可以改为 fid14

上面命令中,针对需要加总的六个变量,使用循环语句以精简代码。

2. 离散变量的分户问题

对于二值变量,以变量 fm1 「是否有人从事个体私营」为例,其取值包括三种情况:1=是,5=否,-8=不适用。现将该变量处理成0-1二值变量。

1
2
g nfm1 = fm1 if inlist(fm1,1,5)  // 删除不适用情况
replace nfm1 = 0 if fm1==5 // 1=是,0=否

然后,以2010年为基期,处理 nfm1 这个二值变量的针对家庭分户问题。处理方式仍然是使用均值法,由于上面计算得到的 nfm1 变量是一个 0-1 变量,按照 fid10 求均值后,取值应该在区间 [0,1] 上。只要分户后的家庭中至少有一个从事个体私营(取值为1),使用均值法计算后的取值应该落在区间 (0,1] 上。因此可以将区间 (0,1] 上的取值改为1。

1
2
3
** 取均值
ereplace nfm1 = mean(nfm1), by(fid10)
replace nfm1 = 1 if nfm1>0 & nfm1<=1

对于多分类变量,大多可以使用二值变量和连续变量的方法处理,这里不再赘述。

3. 组合命令的使用

对于分户问题而言,均值和加总是最常用的方法。但是也有一些研究可能也会用到其他函数,例如最大值 max,最小值 min 等。它们与上面使用均值和加总的函数基本上没有差别,只是需要根据研究需要调整函数类型。

需要注意的是,按照分户前的家庭编码计算出数值,只是解决分户问题的第一步。该步骤通常在逐年清洗数据时使用,在完成这一步后,需要删除掉因分户出现的重复样本。待完成所有变量的计算和样本的处理后,再来拼接成面板数据。

假设某项研究需要使用到 2010-2020 年 CFPS 家庭经济库中的收入数据,以下是组合命令的一个示范。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
******************* 2012年 *******************
use cfps2012famecon.dta, clear
** 均值: 家庭人均收入
ereplace fincome1_per = mean(fincome1_per), by(fid10)
** 加总
foreach v in fwage_1 foperate_1 fproperty_1 ftransfer_1 felse_1 fincome1 {
ereplace `v' = total(`v'), by(fid10)
}
** 删除重复样本
duplicates drop fid10, force
** 保存数据
save cfps2012famecon.dta, replace

******************* 2014年 *******************
use cfps2014famecon.dta, clear
** 均值: 家庭人均收入
ereplace fincome1_per = mean(fincome1_per), by(fid10)
** 加总
foreach v in fwage_1 foperate_1 fproperty_1 ftransfer_1 felse_1 fincome1 {
ereplace `v' = total(`v'), by(fid10)
}
** 删除重复样本
duplicates drop fid10, force
** 保存数据
save cfps2014famecon.dta, replace

******************* 2016年 *******************
use cfps2016famecon.dta, clear
** 均值: 家庭人均收入
ereplace fincome1_per = mean(fincome1_per), by(fid10)
** 加总
foreach v in fwage_1 foperate_1 fproperty_1 ftransfer_1 felse_1 fincome1 {
ereplace `v' = total(`v'), by(fid10)
}
** 删除重复样本
duplicates drop fid10, force
** 保存数据
save cfps2016famecon.dta, replace

******************* 2018年 *******************
use cfps2018famecon.dta, clear
** 均值: 家庭人均收入
ereplace fincome1_per = mean(fincome1_per), by(fid10)
** 加总
foreach v in fwage_1 foperate_1 fproperty_1 ftransfer_1 felse_1 fincome1 {
ereplace `v' = total(`v'), by(fid10)
}
** 删除重复样本
duplicates drop fid10, force
** 保存数据
save cfps2018famecon.dta, replace

******************* 2020年 *******************
use cfps2020famecon.dta, clear
** 均值: 家庭人均收入
ereplace fincome1_per = mean(fincome1_per), by(fid10)
** 加总
foreach v in fwage_1 foperate_1 fproperty_1 ftransfer_1 felse_1 fincome1 {
ereplace `v' = total(`v'), by(fid10)
}
** 删除重复样本
duplicates drop fid10, force
** 保存数据
save cfps2020famecon.dta, replace

******************* 构建面板数据 *******************
use cfps2010famecon.dta, clear
foreach y in 2012 2014 2016 2018 2020 {
append using cfps`y'famecon
}
save cfps_famecon.dta, replace

上面代码有几个需要注意的地方:

  • 2010 年为基期,所以 2010 年不存在分户问题。2012-2020 年可能存在分户问题。
  • 2012-2020 年分户问题可以使用循环语句简化代码,但是考虑到文件名称不一致、各年变量名称可能有所差异,实际数据清洗中不会使用循环语句完成,需要对数据进行逐年清理
  • 研究基期是 2010 年,所以 2012-2020 年用均值和加总解决分户问题时都是使用 fid10 作为分组依据,这个分组依据一般与删除重复样本的依据相对应,即 duplicates drop

相关链接: