Stata数据处理:一些技巧和建议

发布时间:2023-02-25 阅读 2824

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:陈卓然 (中山大学)
邮箱chenzhr25@mail2.sysu.edu.cn

编者按:本文摘译自 UW-Madison 的数据处理课程,特此致谢!


目录


1. 一些技巧

当你面对一个数据集的时候,你的第一目标便是理解这一个数据集,然后尝试去清洗它。从逻辑上讲,这是两个独立的过程,但是在实际操作的过程中,这两步往往是相互交错的。在没有完全理解之前是不可能清洗干净数据的,同样在清洗干净数据之前你也无法完全理解这份数据。

我们下面以 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

在观察到上述的描述性统计结果之后,我们不禁想要问如下的问题:

  • 首先 income 中哪些是缺失值?
. 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
  • income 是否是正态分布的?
. 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

对于类别变量而言,比如 edutab 命令是一个很好的理解其分布的工具。

. 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 岁的时候才会缺失。

2. 一些建议

从后开始思考:在我们写任何代码之前一定仔细思考数据需要是什么样的数据我们才能够分析。一个观测值应该代表什么?每一笔观测值需要包含那些变量?

不要试图一次性做完全部工作:在完成一个项目的过程中,要注意不要一次性地写完全部的分析过程的 do-file,然后在最终运行一遍,那样的话很有可能出现很多 bug。因此一个好习惯是写一部分便运行一部分。

将代码分割到多个 do files 中:如果一个 do file 过长,每一次运行的时候都需要很长时间,因此我们可能需要将其拆分为多个子 do 文件,然后分别执行。但是需要注意的一点是我们需要寻找好合适的分割点,并且在每一个子 do 文件中保存好中间数据,但是千万不要将生成的中间数据覆盖掉原始数据。

检查你的工作:编程往往会遇到很多细小并且很难察觉到的问题,一般而言,我们将时间花费到比较所得的结果和理论上正确的结果,但是这需要你知道理论上正确的结果是什么。

检查描述性统计结果和频率分布往往是一个很有效的手段,留心观察结果是否合理,如果这些结果不太合理,我们需要弄清楚背后的原因。

注意结果的可复制性:在我们获得数据之后,我们的第一个 do 文件将其读入进来,做出一些改变,然后将结果存储在另外一个文件中。我们的第二个 do 文件读入第一个 do 文件生成的结果,进一步做出改变,然后将结果存储在另外一个单独的文件当中。如此反复下去直至完成了数据清洗工作。接下来所有的分析工作都将依赖于这份 do 文件。

如果你日后发现了错误需要进行调整,拥有一个有条理可复制的项目将会节省你大量的时间。就一个项目而言,除了编写一个主 do 文件和若干子 do 文件之外,考虑写一个 readme 文件来包括其中涉及到的详细信息。这样的 do file 不仅对于想要查阅你代码的人来讲是有帮助的,而且对于很久之后的你自己而言也是大有裨益的。

3. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 数据处理, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh