Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:陈卓然 (中山大学)
邮箱:chenzhr25@mail2.sysu.edu.cn
编者按:本文摘译自 UW-Madison 的数据处理课程,特此致谢!
目录
当你面对一个数据集的时候,你的第一目标便是理解这一个数据集,然后尝试去清洗它。从逻辑上讲,这是两个独立的过程,但是在实际操作的过程中,这两步往往是相互交错的。在没有完全理解之前是不可能清洗干净数据的,同样在清洗干净数据之前你也无法完全理解这份数据。
我们下面以 2000_acs_sample.dta
数据集为例。这是 2000 年美国社区调查数据的一个无加权样本,但是我们这里只是随机取出 1% 的样本用以展示。
阅读文件:当我们面对一个未知的数据集的时候,如果这份数据集中存在一个解释文档,那么我们就应该多花一些时间在这份解释文档中,这份文档往往对你理解这份数据至关重要。但是如果没有这样的解释文档,我们就应该仔细审视这份数据集已获得关键信息。
识别变量:describe
能够为我们提供基本但是很有用的数据集信息。其主要作用在于观察你有什么样的变量以及变量的名字,变量的标签能够帮助你理解他们是什么意思。
. lxhuse 2000_acs_sample.dta, clear
. describe
Observations: 28,172
Variables: 16 8 Apr 2019 16:43
---------------------------------------------------------------------------------------------
Variable Storage Display Value
name type format label Variable label
---------------------------------------------------------------------------------------------
year int %8.0g year_lbl Census year
datanum byte %8.0g Data set number
serial double %8.0g Household serial number
hhwt double %10.2f Household weight
gq byte %43.0g gq_lbl Group quarters status
us2000c_seria~o str7 %9s Housing/Group Quarters (GQ) Unit Serial Number
pernum int %8.0g Person number in sample unit
perwt double %10.2f Person weight
us2000c_pnum str2 %9s Person Sequence Number
us2000c_sex str1 %9s Sex
us2000c_age str2 %9s Age (original)
us2000c_hispan str2 %9s Hispanic or Latino Origin
us2000c_race1 str1 %9s Race Recode 1
us2000c_marstat str1 %9s Marital Status
us2000c_educ str2 %9s Educational Attainment
us2000c_inctot str7 %9s Person's Total Income in 1999
--------------------------------------------------------------------------------------------
Sorted by: serial pernum
另外一个值得注意的事情是那些变量有着值标签。对于这些变量,你在输出结果中看到的将是标签而不是值,为了看到值和标签的对应,我们可以使用 label list
。
. label list gq_lbl
gq_lbl:
0 Vacant unit
1 Households under 1970 definition
2 Additional households under 1990 definition
3 Group quarters--Institutions
4 Other group quarters
5 Additional households under 2000 definition
6 Fragment
观察值个数:观察值的个数可以通过系统变量 _n
来追踪,但是采用 _n
来追踪观测值的个数有着一些问题,比如说排序之后,删除掉一些值或者增加一些值之后, _n
都会改变。为了解决这一问题,我们可以生成一个识别变量的变量:gen id = _n
,这样 id
便不会发生改变。
如果你想要观察第5个观测值,就需要运行 list if _n == 5
。
删除数据:我们可以使用 drop
命令来删除一个变量或者观测值。命令 keep
的用法和 drop
的用法恰好相反。
变量重命名:要善于将变量重命名,变量重命名的方式主要有两种:骆驼式(如 householdIncome),蛇式(如household_income)。但是注意不管使用那种方式,一定要注意命名的一致性,不要让 householdIncome 和 household_income 混着出现。如果我们希望将变量重命名,我们可以采用 rename oldname newname
。
字符变量转化为数值变量:我们可以使用 destring
很容易地将字符变量转化为数值变量。除了 destring
这一命令之外,我们还可以采用 real()
的命令来进行转换。
识别变量类型:常见的变量类型包括连续型变量、类别型变量,字符变量、和标识变量。识别各种变量的类型的一个有用的命令是 codebook
。
设置标签:标签可以使得一个数据集更加容易使用和理解。例如 label var female "Person is female"
。值标签是将类别变量的各个不同水平附上一段表明各个水平的文字。为此首先需要定义一个映射:
. lxhuse first_steps1.dta, clear
. label define maritalStatusLabel ///
> 1 "Now married" ///
> 2 "Widowed" ///
> 3 "Divorced" ///
> 4 "Separated" ///
> 5 "Never married"
第二步是将这一映射与某一个变量对应起来
. label values maritalStatus maritalStatusLabel
. tab maritalStatus
Marital |
Status | Freq. Percent Cum.
--------------+-----------------------------------
Now married | 11,643 42.48 42.48
Widowed | 1,405 5.13 47.60
Divorced | 2,177 7.94 55.55
Separated | 435 1.59 57.13
Never married | 11,750 42.87 100.00
--------------+-----------------------------------
Total | 27,410 100.00
检验变量的分布:理解变量的分布对于数据清洗和分析都是至关重要的。对于一个类似 income 的连续变量,我们首先可以使用 sum
命令,例如:
. sum income
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
income | 21,266 27724.1 39166.4 -10000 720000
在观察到上述的描述性统计结果之后,我们不禁想要问如下的问题:
. sum age if income==.
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
age | 6,144 7.245117 4.315471 0 14
. sum income if age<15
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
income | 0
. sum income, detail
Person's Total Income in 1999
-------------------------------------------------------------
Percentiles Smallest
1% 0 -10000
5% 0 -10000
10% 0 -10000 Obs 21,266
25% 6000 -10000 Sum of wgt. 21,266
50% 18000 Mean 27724.1
Largest Std. dev. 39166.4
75% 35800 536000
90% 60000 545000 Variance 1.53e+09
95% 82200 572000 Skewness 4.954469
99% 179000 720000 Kurtosis 41.3295
可以看出,偏度为 4.95,均值远高于中位数,因此很明显收入是一个右偏的变量。直方图是一个很方便理解连续变量分布的工具。
. hist income, freq
考虑到极端值的存在,我们可以仅仅观察一个子集的分布。
. hist income if income < 100000, freq
对于类别变量而言,比如 edu,tab
命令是一个很好的理解其分布的工具。
. tab edu, miss
Educational |
Attainment | Freq. Percent Cum.
------------+-----------------------------------
0 | 1,123 4.10 4.10
1 | 1,290 4.71 8.80
2 | 2,500 9.12 17.92
3 | 1,284 4.68 22.61
4 | 1,590 5.80 28.41
5 | 891 3.25 31.66
6 | 1,021 3.72 35.38
7 | 875 3.19 38.58
8 | 860 3.14 41.71
9 | 5,763 21.03 62.74
10 | 1,495 5.45 68.19
11 | 3,031 11.06 79.25
12 | 1,202 4.39 83.64
13 | 2,920 10.65 94.29
14 | 1,057 3.86 98.15
15 | 343 1.25 99.40
16 | 165 0.60 100.00
------------+-----------------------------------
Total | 27,410 100.00
对于类别变量的分布而言,柱状图是理解其分布的一个有力武器。
. graph bar, over(edu)
. graph hbar inc, over(edu)
将实际缺失值重编码为缺失值:以我们的数据集为例,我们注意到 income 变量中的 "BBBBBBB" 意味着缺失,对于这样的缺失值,Stata 会自动识别为缺失值。但是仍然有很多 Stata 所不能识别的缺失值,比如说年龄中标有 "-9" 的值,Stata 便不会自动识别。
因此我们需要手动识别缺失值,然后将其重编码为 Stata 格式的缺失值。比如说对于变量 edu:
. replace edu = . if edu==0
一旦所有的缺失值都已经被编码为 Stata 格式的缺失值之后,我们便可以使用 misstable sum
的命令来给出一个很有用的描述性分析结果
. misstable sum
Obs<.
+------------------------------
| | Unique
Variable | Obs=. Obs>. Obs<. | values Min Max
-------------+--------------------------------+------------------------------
edu | 1,123 26,287 | 16 1 16
income | 6,144 21,266 | >500 -10000 720000
income2 | 6,144 21,266 | >500 -10000 720000
-----------------------------------------------------------------------------
上表之外的所有变量都不存在缺失值。但是上表所无法提供给你的信息是为什么数据是缺失的,特别是这些缺失值是否是随机缺失的,如果答案是否定的话,那么他们的存在很有可能会造成你的分析是有偏误的。
一种检验缺失原因的方式是观察缺失变量和其他变量之间的关系,比如说我们发现变量 edu 很明显不是随机缺失的,因为它只有当一个人小于 3 岁的时候才会缺失。
从后开始思考:在我们写任何代码之前一定仔细思考数据需要是什么样的数据我们才能够分析。一个观测值应该代表什么?每一笔观测值需要包含那些变量?
不要试图一次性做完全部工作:在完成一个项目的过程中,要注意不要一次性地写完全部的分析过程的 do-file,然后在最终运行一遍,那样的话很有可能出现很多 bug。因此一个好习惯是写一部分便运行一部分。
将代码分割到多个 do files 中:如果一个 do file 过长,每一次运行的时候都需要很长时间,因此我们可能需要将其拆分为多个子 do 文件,然后分别执行。但是需要注意的一点是我们需要寻找好合适的分割点,并且在每一个子 do 文件中保存好中间数据,但是千万不要将生成的中间数据覆盖掉原始数据。
检查你的工作:编程往往会遇到很多细小并且很难察觉到的问题,一般而言,我们将时间花费到比较所得的结果和理论上正确的结果,但是这需要你知道理论上正确的结果是什么。
检查描述性统计结果和频率分布往往是一个很有效的手段,留心观察结果是否合理,如果这些结果不太合理,我们需要弄清楚背后的原因。
注意结果的可复制性:在我们获得数据之后,我们的第一个 do 文件将其读入进来,做出一些改变,然后将结果存储在另外一个文件中。我们的第二个 do 文件读入第一个 do 文件生成的结果,进一步做出改变,然后将结果存储在另外一个单独的文件当中。如此反复下去直至完成了数据清洗工作。接下来所有的分析工作都将依赖于这份 do 文件。
如果你日后发现了错误需要进行调整,拥有一个有条理可复制的项目将会节省你大量的时间。就一个项目而言,除了编写一个主 do 文件和若干子 do 文件之外,考虑写一个 readme 文件来包括其中涉及到的详细信息。这样的 do file 不仅对于想要查阅你代码的人来讲是有帮助的,而且对于很久之后的你自己而言也是大有裨益的。
Note:产生如下推文列表的 Stata 命令为:
lianxh 数据处理, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh