Stata统计分析与实验指导(视频教学版)
上QQ阅读APP看书,第一时间看更新

2.3 数据的整理

本节将介绍数据整理的相关内容,主要包括数据的标签与排序、数据拆分、数据合并和数据的长宽转换等内容。

2.3.1 数据的标签与排序

1.数据标签

为了让用户更加清楚地了解数据来源、变量含义、观测值等相关内容,Stata可以为数据、变量、观测值添加标签,其实标签就是对相关数据的解释。常用的添加标签的方法有3类:一是为数据库添加标签;二是为变量添加标签;三是为观测值添加标签。

为数据库添加标签的基本命令为:

     label data ["label"]

["label"]代表所要添加的标签内容。

为变量添加标签的基本命令为:

     label variable varname ["label"]

varname代表所要添加标签的变量名称,["label"]代表所要添加的标签内容。

对于数值型的分类变量,其含义并不直观,例如我们通常用0和1来区分性别,但如果缺乏上下文,其他用户就很难区分0是代表男性还是女性,这时如果给数值添加标签,就方便用户理解了。为数值添加标签是通过以下两步来完成的。

第一步是定义数值标签,基本命令为:

     label define lblname # "label" [# "label" ...] [, add modify nofix]

在这个命令中,lblname代表所要定义的数值标签名称,“#”代表所要定义的数值,"label"代表所要添加的标签内容。需要用户注意的是后方options的内容,其中add的作用是添加标签内容,modify的作用是对已存在的标签内容进行修改,nofix的作用是要求Stata不为标签的内容而改变原变量的存储容量。

第二步是将所定义的数据标签与相关变量结合,基本命令为:

     label values varname [lblname] [, nofix]

varname代表将要添加标签的变量名称,[lblname]代表刚刚定义的数据标签名称。

下面通过一个实例给usaauto.dta数据库添加3类标签,将详细介绍标签的使用方法。usaauto数据文件如表2.1所示。

01 为整个数据库添加标签“1978年美国汽车产业的横截面数据”,命令如下:

     label data "1978年美国汽车产业的横截面数据"

02 为变量make和mpg添加标签“品牌”和“每加仑油行使里程数”,命令如下:

     label variable make "品牌"
     label variable mpg "每加仑油行使里程数"

03 变量foreign为分类变量,0代表国产,1代表进口。为了便于观察,为0和1添加标签,具体命令为:

     label define foreignlabel 0 "Domestic" 1 "Foreign"
     label values foreign foreignlabel

其中,foreignlabel表示标签的名称,0 "Domestic" 1 "Foreign"表示定义的规则,数字0的标签是Domestic,数字1的标签是Foreign。

执行完命令之后,可以看到在数据表中显示结果从图2.12变为图2.13。

图2.12 未定义标签图

图2.13 定义标签图

标签添加完成以后,可以通过label dir命令查看已经建立标签的相关内容。

2.排序数据

为了处理数据的方便,有时需要对数据进行排序处理。在Stata中,排序的命令主要有两个:一个是sort命令;另一个是gsort命令。

sort命令的基本语句是:

     sort varlist [in] [, stable]

varlist代表将要进行排序的变量名称,[in]代表排序的范围,[, stable]的含义是如果两个观测值相同,其顺序就保持与原数据相同。

gsort命令的基本语句是:

     gsort [+|-] varname [[+|-] varname ...] [, generate(newvar) mfirst]

其中需要说明的内容有两点:一,[+]表示按升序排列,这是Stata默认的排列方式,[-]表示按降序排列;二,generate(newvar)表示排序之后生成新的变量,mfirst表示将缺失值排在最前面。

将usaauto数据文件中的观测值按变量price由小到大排列,这个操作可以用sort命令完成,具体操作如下:

     sort price

当然,也可以用gsort命令完成,具体操作如下:

     gsort + price

2.3.2 数据的拆分

1.数据的横向拆分

原始数据有时包含过多的变量,但在实际应用中可能根据需要将原始数据拆分为不同的数据表,这时就要实现数据的横向拆分。数据的横向拆分用到的两个命令为drop和keep。下面详细讲解。

drop命令是用来删除某些变量和观测值的,基本命令如下:

     drop varlist [if] [in]

keep命令是用来保留某些变量和观测值的,基本命令如下:

     keep varlist [if] [in]

例如,water数据文件包含4个变量,分别是year、capital、production、labor,将water数据文件拆分为两个数据文件:一个数据文件包含year和production两个变量,命名为wateroutput;另一个数据文件包含year、capital和labor三个变量,命名为waterinput。首先生成wateroutput文件:

     use c:/data/water,clear
     drop capital labor
     save c:/data/wateroutput, replace

以上命令使用drop命令删除变量capital和labor,然后对其进行保存。同样,我们可以用keep来决定保留变量。

     use c:/data/water,clear
     keep year capital labor
     save c:/data/waterinput, replace
2.数据的纵向拆分

原始数据有时包含过多的样本观测值,但在实际应用中可能根据需要将其按某种特征拆分为不同的数据表,这就是将要实现的数据的纵向拆分。数据的纵向拆分用到的主要命令还是drop和keep。

例如,将usaauto数据文件拆分为两个数据文件:一个数据文件为domesticauto,只包含国产车的相关内容;另一个数据文件为foreignauto,只包含进口车的相关内容,具体操作如下:

     use c:\data\usaauto,clear
     drop if foreign==1
     save c:\data\domesticauto, replace

以上命令完成了第一个数据文件的建立,将foreign变量为1的数据删除并重新命名。

第二个数据文件建立的命令如下:

     use c:\data\usaauto,clear
     keep if foreign==1
     save c:\data\foreignauto, replace

2.3.3 数据的合并

1.数据的横向合并

数据的横向合并是横向拆分的逆操作,但是其要比拆分复杂,因为合并时要实现同一个数据的对接,而不能出现对接错误的情况,所以在横向合并之前最好先对数据进行排序处理,然后实现合并。合并所使用的命令语句为merge,具体语句如下:

     merge [varlist] using filename [filename ...] [, options]

其中,[varlist]代表合并进去的新变量;using filename指的是要与原文件合并的文件路径;可选项options包含较多的功能,表2.11显示了其具体内容。

表2.11 merge选项表

例如,利用横向拆分示例中生成的数据文件waterinput和wateroutput实现数据的横向合并,匹配变量为year,生成新的数据文件命名为waternew。使用命令如下:

     use c:\data\wateroutput, clear
     sort year
     save c:\data\wateroutput, replace
     use c:\data\waterinput, clear
     sort year
     merge year using c:\data\wateroutput
     save c:\data\waternew, replace

在以上命令语句中,第1个命令语句实现了wateroutput数据文件的打开,第2个命令语句将文件按年份变量进行排序,第3个命令语句保存了排序之后的数据文件,第4个命令语句实现了waterinput数据文件的打开,第5个命令语句将此数据按年份变量进行排序,第6个命令语句按年份变量将wateroutput文件合并到waterinput文件中,第7个命令语句保存合并之后的数据文件。

操作完成以后,我们发现多了一个名称为_merge的变量,这个变量将显示合并的情况,如果数值为3,那么合并成功,如果数值为1或2,那么合并失败。

2.数据的纵向合并

数据的纵向合并同样可视为数据纵向拆分的逆操作,使用的主要命令为append,具体语句如下:

     append using filename [, options]

[, options]的内容与merge相似,但更为简化。

例如,利用纵向拆分示例中生成的数据文件domesticauto和foreignauto实现数据的纵向合并,生成的数据文件命名为usaautonew。操作命令如下:

     use c:\data\domesticauto, clear
     append using c:\data\foreignauto
     save c:\data\usaautonew, replace

2.3.4 数据的长宽转换

在面板数据中,如果包含两个以上的标识变量,数据就有两种表现形式:一种是长数据;另一种是宽数据。在长宽数据的转换中,所使用到的命令为reshape命令,具体命令语句为:

     reshape long stubnames, i(varlist) [options]
     reshape wide stubnames, i(varlist) [options]

long表示将宽数据转化为长数据,wide表示将长数据转化成宽数据,stubnames表示需要转化的变量的名称前缀,i(varlist)表示识别变量。options常用的为j(varname [values]),表示用于进行长宽变换的变量,通常为时间变量。

例如,实现表2.12和表2.13数据形式的转换,必须使用本小节讲述的reshape命令。

表2.12 widedata数据内容

表2.13 longdata数据内容

将表2.12中的宽数据转化为表2.13中的长数据的操作命令如下:

     use c:/data/widedata, clear
     reshape long english science, i(number name) j(year)

english和science为将要转化的变量名称的前缀,即将要生成的变量名称,i(number name)表示识别变量,即按学号number和名称name区分所有观测值,j(year)表示按年份进行转化。

若要将上述长数据转化为宽数据,则可使用如下操作命令:

     use c:/data/longdata, clear
     reshape wide english science, i(number name) j(year)