视频合集

附件:

  • 录屏文件和do文件下载链接:https://pan.baidu.com/s/1LNlyOOa5LPzinmYT2dbm4Q?pwd=mb2i

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
/* Do File Note:
主题: 公开数据库的数据清理
1. 变量管理(CFPS、CLDS) —— 截面
2. 数据管理(CFPS、CMDS) —— 截面
3. 整理成面板数据(CFPS) —— 截面——>面板
生成时间: 2022年11月13日
更新日期: 2023年1月8日, 修订内容: 修正生成CX变量的命令中if条件未考虑「不适用」的问题。 */

* 清理思路: 1.逐期清理; 2.逐个数据库清理
* 清理原则: 1.尽量保留变量原始信息; 2.尽量做最小的改动; 3.尽量不要删除数据和样本

* do 文件中不会展示的命: tab、tabstat
/*常用的命令:
1.变量管理: gen replace egen ereplace label drop keep rename
2.数据管理: merge append reshape use save
*/

**********************************一、变量管理**********************************
cd "C:\Users\wugan\Desktop\DATA\CFPS中国家庭追踪调查" // macOS-"/"; windows-"\"
use "CFPS2018\cfps2018famecon",clear
ssc install ereplace,replace
* 1. 变量生成
** 1.1 居住地属性
tabstat fa1,stat(mean) by(fa1) //不适用=-8,9999,9998,9999,888,-1,-10
tabstat fa101,stat(mean) by(fa101)
// 关注不适用、不知道的情况
/* 备注: 2023年1月8日更新CX变量生成命令, 原命未考虑到「不适用」的情况。感谢 BiliBili 网友「fjjlclw」指出的问题。 */
gen CX=1 if fa1==1 | ((fa1==77 | fa1==-8) & fa101==1) // 居委会
replace CX=0 if fa1==5 | ((fa1==77 | fa1==-8) & fa101==5) // 村委会

***数据矫正与补充:
// (1)使用其他数据补充(例 fl10 fl10 fl10_max fl10_min fl10_est)
tab fl10
// (2)使用其他数据矫正: 参见do文件末尾
// 收入数据:家庭净收入=工资性收入+经营净收入+财产性收入+转移净收入
// (3)基于经验矫正

* 2. 离散变量
// 关注二分类变量的取值问题
gen
** 2.1 生成地区变量
//地区变量
gen diqu=""
label variable diqu "地区"
replace diqu="东部地区" if pcode==11 | pcode==12 | pcode==13 | pcode==31 | pcode==32 | pcode==33 | pcode==35 | pcode==37 | pcode==44 | pcode==46
replace diqu="中部地区" if pcode==14 | pcode==34 | pcode==36 | pcode==41 | pcode==42 | pcode==43
replace diqu="西部地区" if pcode==15 | pcode==45 | pcode==50 | pcode==51 | pcode==52 | pcode==53 | pcode==54 | pcode==61 | pcode==62 | pcode==63 | pcode==64 | pcode==65 | pcode==66
replace diqu="东北地区" if pcode==21 | pcode==22 | pcode==23
// 编码问题
// 省+市+县(伪码)——6位
* 3. 连续变量
// 极大值、极小值: 最大最小值的极端值问题、可能存在的负值问题
// 数据的逻辑跳转问题
// 做人均处理、加总处理(工作时长)
// 处理极端值时,stata的数据存储问题导致的小数点问题
tab X if X>999999 & X<1000001

save "数据清洗\cfps2018cfps2018famecon",replace



**********************************二、数据管理**********************************
* 1. reshape演示 —— CMDS数据
cd "C:\Users\wugan\Desktop\DATA"
use "CMDS流动人口动态监测数据\2017\2017_Migrant_A_desensitized.dta",clear
keep newID C1 C2 C3 C6 C7 Q100 q101*
forvalues i=1/10 {
rename (q101c`i'y q101c`i'm q101j`i'a q101j`i'b q101m`i'y q101m`i'm) (q101cy`i' q101cm`i' q101ja`i' q101jb`i' q101my`i' q101mm`i')
}
** 1.1 wide data to long data
reshape long q101id q101a q101b q101cy q101cm q101d q101e q101f q101g q101h q101i q101ja q101jb q101k q101l q101my q101mm q101n, i(newID) j(list) // 字符型添加string选项: q101id_1
drop if q101a==. // 这里等同于: drop if list>Q100
** 1.2 生成变量: 以年龄、学历为例
// 年龄
gen age=2017-q101cy
label var age "年龄"
// 学历
tabstat q101e,stat(mean n) by(q101e)
gen edu=.
replace edu=0 if q101e==1 // 未上过
replace edu=6 if q101e==2 // 小学
replace edu=9 if q101e==3 // 初中
replace edu=12 if q101e==4 // 高中/中专
replace edu=15 if q101e==5 // 专科
replace edu=16 if q101e==6 // 本科
replace edu=19 if q101e==7 // 研究生
// 劳动力
gen labor=1
replace labor=0 if age>60 | age<18
replace labor=0 if health==7 // 假设7为残疾
** 1.3 计算家庭均值
ssc install ereplace,replace
ereplace age=mean(age),by(newID) //如果计算劳动力的,加上 if labor==1
ereplace edu=mean(edu),by(newID)
** 1.4 生成用于匹配的数据
duplicates drop newID,force
keep newID age edu
save "数据清洗\CMDS2017_merge.dta",replace
** 1.5 数据匹配
use "CMDS流动人口动态监测数据\2017\2017_Migrant_A_desensitized.dta",clear
merge 1:1 newID using "数据清洗\CMDS2017_merge.dta",nogen // 不熟悉merge操作不要用nogen
save "数据清洗\2017_Migrant_A",replace
rm "数据清洗\CMDS2017_merge.dta"

* 2.匹配家庭和成员数据 (CFPS)
cd "C:\Users\wugan\Desktop\DATA"
/*
use "CFPS中国家庭追踪调查\CFPS2018\cfps2018person",clear
keep fid18 X1 X2
save "数据清洗\merge.dta",replace
use "CFPS中国家庭追踪调查\CFPS2018\cfps2018famecon",clear
merge 1:m fid18 using "数据清洗\merge.dta"
*/
use "CFPS中国家庭追踪调查\CFPS2018\cfps2018famecon",clear
merge 1:m fid18 using "CFPS中国家庭追踪调查\CFPS2018\cfps2018person"
keep if _merge==3
/* drop if _merge==2 */
drop _merge
save "数据清洗\cfps2018famecon",replace
/* 多期数据可以使用这种方式实现(不推荐)
forvalues i=10(2)18 {
use "CFPS20`i'\cfps20`i'famecon",clear
merge 1:m fid`i' using "CFPS20`i'\cfps20`i'person"
keep if _merge==3
drop _merge
save "数据清洗\cfps20`i'famecon",replace
}
*/

* 3. 数据乱码问题
clear
cd "C:\Users\wugan\Desktop\DATA\转码\CLDS2016(Stata13)" // 转码中遇到的问题
unicode encoding set gb18030
unicode analyze *
unicode translate *, invalid

**********************************三、面板数据**********************************
// 2014-2018年数据家庭支出面板数据
* 1. 提取数据
cd "C:\Users\wugan\Desktop\DATA\CFPS中国家庭追踪调查"
forvalues i=14(2)18 {
use "CFPS20`i'\cfps20`i'famecon.dta",clear
keep fid* daily dress eec eptran epwelf expense food house med mortage other pce trco
save "数据清洗\cfps20`i'",replace
}
use "数据清洗\cfps2014",clear
/*
* 2. 编码唯一性检查
use "数据清洗\cfps2016",clear
egen list=seq(),to(1000000) by(fid14)
egen XXX=function(), option // 根据需要计算
duplicates drop newID,force
save "数据清洗\cfps2016",replace
*/
* 3. 数据接驳——使用append命令将各期数据拼接成面板数据
/* 备注: 2023年1月8日更新, 生成面板数据应当使用append命令将数据接驳在一起, 视频中相关部分有错误。 */
use "数据清洗\cfps2018",clear
append using "数据清洗\cfps2016"
append using "数据清洗\cfps2014"
save "数据清洗\cfps14-18",replace




*-----------------------------------分 割 线-----------------------------------*
/* Note: 以下命令仅供参考, 内容是: 分省份、分城乡、分消费收入组计算各类消费的均值。在计算过程中, 根据各家庭往年收入, 对数据进行了矫正。 */
cd "/~/CFPS分省分收入组各项支出/计算消费支出"
forvalues yy=14(2)18 {
use "校正支出数据/CFPS/CFPS20`yy'",clear

** 一、生成城乡区分码
gen CX=.
replace CX=1 if fa1==1 | fa101==1
replace CX=2 if fa1==5 | fa101==5
label var CX "城乡识别码:1=城镇;2=农村"

** 二、家庭、人均可支配收入
** 1.家庭可支配收入
egen disposable_inc=rowtotal(fwage_1 foperate_1 fproperty_1 ftransfer_1 felse_1)
** 2.人均可支配收入
gen dis_inc=disposable_inc/familysize`yy'

** 三、调整样本、计算分位数
** 1.省码
tostring provcd`yy',g(pcode)
** 2.筛选变量
gen select=1
replace select=0 if (pcode=="." | pcode=="15" | pcode=="46" | pcode=="54" | pcode=="63" | pcode=="64" | pcode=="65") | CX==.
** 3.调整样本
local var "daily dress eec food house med trco other eptran epwelf mortage"
foreach j of local var {
replace `j'=0 if `j'==.
replace `j'=. if select==0
}
replace dis_inc=0 if dis_inc==.
** 4.可支配收入分位数
gen type5=.
//收入组划分标准----分城乡
forvalues j=1/2 {
egen p0_`j'=min(dis_inc) if select==1 & CX==`j',by(pcode)
forvalues i=20(20)80 {
egen p`i'_`j'=pctile(dis_inc) if select==1 & CX==`j',p(`i') by(pcode)
}
egen p100_`j'=max(dis_inc) if select==1 & CX==`j',by(pcode)
//替换type5取值
replace type5=1 if dis_inc>=p0_`j' & dis_inc<p20_`j'
replace type5=2 if dis_inc>=p20_`j' & dis_inc<p40_`j'
replace type5=3 if dis_inc>=p40_`j' & dis_inc<p60_`j'
replace type5=4 if dis_inc>=p60_`j' & dis_inc<p80_`j'
replace type5=5 if dis_inc>=p80_`j' & dis_inc<=p100_`j'
}

** 四、收入数据校正
/* 注:1.CFPS比较了当期和上一期调查的收入数据,取两者的较大值得到了家庭净收入数据,
这里使用的家庭可支配收入数据是校正后的CFPS家庭净收入数据;
2.偏差较大的数据,偏差使用【分城乡的人均可支配收入的五分类-不分城乡CFPS家庭
人均净收入】,差距是-3或-4时,替换使用CFPS纠正的数据进行计算。
原因:(1)这个收入的偏差主要是高收入者故意汇报较低的收入导致的偏差,因此这个差值
是负数的时候,可能存在较大偏误;
(2)从2018年的数据来看,差距是-2、-1的样本比较多(合计大约有1970户),大批量
的样本出现偏误的可能性不大。 */
** 1.计算收入组分类差距
destring type5,replace
gen typegap=type5-fincome1_per_p
egen new_disposable_inc=rowtotal(fincome1) if (typegap==-3 | typegap==-4) & fincome1!=.
** 2.校正家庭可支配收入
replace disposable_inc=new_disposable_inc if (typegap==-3 | typegap==-4) & fincome1!=.
drop new_disposable_inc typegap
** 3.校正人均可支配收入
drop dis_inc
gen dis_inc=disposable_inc/familysize`yy'
replace dis_inc=0 if dis_inc==.
** 4.校正人均可支配收入分组
drop type5 p*_*
gen type5=.
//收入组划分标准----分城乡
forvalues j=1/2 {
egen p0_`j'=min(dis_inc) if select==1 & CX==`j',by(pcode)
forvalues i=20(20)80 {
egen p`i'_`j'=pctile(dis_inc) if select==1 & CX==`j',p(`i') by(pcode)
}
egen p100_`j'=max(dis_inc) if select==1 & CX==`j',by(pcode)
//替换type5取值
replace type5=1 if dis_inc>=p0_`j' & dis_inc<p20_`j'
replace type5=2 if dis_inc>=p20_`j' & dis_inc<p40_`j'
replace type5=3 if dis_inc>=p40_`j' & dis_inc<p60_`j'
replace type5=4 if dis_inc>=p60_`j' & dis_inc<p80_`j'
replace type5=5 if dis_inc>=p80_`j' & dis_inc<=p100_`j'
}

** 五、分组依据、统计
tostring CX,replace
tostring type5,replace
gen group=pcode+"0"+CX+"0"+type5
local var "daily dress eec food house med trco other eptran epwelf mortage"
foreach i of local var {
gen new_`i'=.
forvalues j=1/5 {
ereplace new_`i'=mean(`i') if select==1 & CX=="1" & type5=="`j'" & new_`i'==., by(pcode)
ereplace new_`i'=mean(`i') if select==1 & CX=="2" & type5=="`j'" & new_`i'==., by(pcode)
}
}
//分省份、城乡、收入组的平均家庭规模
egen famsize=mean(familysize`yy') if select==1,by(group)

** 六、生成结果变量
** 1.筛选样本
keep if select==1 //剔除样本小于100、无法判断城乡的样本
sort group
keep fid`yy' fid14 pcode CX type5 group new_* dis_inc daily dress eec food house med trco other eptran epwelf mortage famsize familysize`yy' disposable_inc dis_inc fincome1_per_p
** 3.导出数据
destring pcode CX type5 group,replace
keep fid`yy' fid14 pcode CX type5 group new_* daily dress eec food house med trco other eptran epwelf mortage familysize`yy' disposable_inc dis_inc fincome1_per_p
save "校正支出数据/使用数据/1028-CFPS20`yy'",replace

** 七、生成校正数据做统计(将分户的加总——基于fid14)
use "校正支出数据/使用数据/1028-CFPS20`yy'",clear
** 城乡、收入组划分
tostring CX type5,replace
//城乡识别码
replace CX="城镇" if CX=="1"
replace CX="农村" if CX=="2"
//收入组划分指标
replace type5="低收入户(20%)" if type5=="1"
replace type5="中间偏下户(20%)" if type5=="2"
replace type5="中间收入户(20%)" if type5=="3"
replace type5="中间偏上户(20%)" if type5=="4"
replace type5="高收入户(20%)" if type5=="5"
//省份识别码
merge m:1 pcode using "/~/CFPS分省分收入组各项支出/计算消费支出/城乡分组消费数据/省份识别码"
keep if _merge==3
drop _merge
** 计算分组统计数值
egen expense=rowtotal(daily dress eec food house med trco other eptran epwelf mortage)
gen count=1
egen count_num=total(count),by(group)
drop count
egen new_expense=mean(expense),by(group)
egen min_expense=min(expense), by(group)
egen max_expense=max(expense), by(group)
** 校正支出数据
egen expense_`yy'=total(expense),by(fid14)
local varname "daily dress eec food house med trco other eptran epwelf mortage familysize`yy'"
foreach v of local varname {
ereplace `v'=total(`v'),by(fid14)
}
// 设置支出占比最大的样本的省份作为主要省份
sort fid14 expense
egen list=seq(),to(100) by(fid14)
egen list_max=max(list),by(fid14)
gen check=1 if list_max==list
keep if check==1
gen fenhu`yy'=0 //是否分户
replace fenhu`yy'=1 if list_max>=2 & list_max<=100
drop list expense check list_max
** label variables
label var type5 "收入组划分"
label var group "分类识别码(省码+城乡识别码+收入组划分码)"
label var pcode "省份识别码"
label var province "省份名称"
label var daily "原-家庭设备及日用品"
label var dress "原-衣着"
label var eec "原-文化教育娱乐"
label var food "原-食品"
label var house "原-居住(房租、水电等,不含房贷)"
label var med "原-医疗保健"
label var trco "原-交通通讯"
label var other "原-其他消费支出"
label var eptran "原-转移性支出"
label var epwelf "原-保障性支出"
label var mortage "原-建房购房贷款支出"
label var expense "原-家庭总支出"
label var new_daily "1.家庭设备及日用品"
label var new_dress "2.衣着"
label var new_eec "3.文化教育娱乐"
label var new_food "4.食品"
label var new_house "5.居住(房租、水电等,不含房贷)"
label var new_med "6.医疗保健"
label var new_trco "7.交通通讯"
label var new_other "8.其他消费支出"
label var new_eptran "9.转移性支出"
label var new_epwelf "10.保障性支出"
label var new_mortage "11.建房购房贷款支出"
label var new_expense "家庭总支出(分组均值)"
label var count_num "样本数"
label var fenhu`yy' "是否分户(1=是,0=否)"
label var min_expense "家庭总支出(分组最小值)"
label var max_expense "家庭总支出(分组最大值)"
** 排序
order fid`yy' province pcode CX type5 group daily dress eec food house med trco other eptran epwelf mortage expense new_* fenhu`yy'
sort group
** 原始数据
save "校正支出数据/校正20`yy'",replace
export excel using "校正支出数据/三期数据表.xlsx", sheet("CFPS20`yy'",modify) firstrow(varlabels)
** 分组统计
egen list=seq(),to(1000) by(group)
keep if list==1
drop fid`yy' list
export excel using "校正支出数据/三期数据表.xlsx", sheet("20`yy'分组统计",modify) firstrow(varlabels)
** 生成待匹配数据
use "校正支出数据/校正20`yy'",clear
keep fid`yy' fid14 province pcode CX type5 group daily dress eec food house med trco other eptran epwelf mortage expense new_expense count_num min_expense max_expense familysize`yy' fenhu`yy'
local varname "province pcode CX type5 group daily dress eec food house med trco other eptran epwelf mortage expense new_expense count_num min_expense max_expense"
foreach v of local varname{
rename `v' `v'`yy'
}
save "校正支出数据/校正20`yy'",replace
}