1、第二章第二章 Stata中的数据处理中的数据处理主要内容:1.数据的类型、压缩与转化2.数据的导入3.数据的整理2.1数据的类型、压缩与转化2.1.1打开本地或网络数据文件打开本地或网络数据文件Stata一般识别的数据文件的后缀名为.dta,打开这些数据文件的命令为use命令,首先讲解一下use命令的基本语句,具体格式如下:use varlist if in using filename,clear nolabel这个命令中,use是打开数据的命令语句,varlist代表变量名称,if是条件语句,in是范围语句,using filename代表数据文件路径。下面将详细介绍常用的五种情形,所使用
2、到的数据文件名称为usaauto.dta,是根据统计资料得到的美国汽车产业的横截面数据(1978年),完整的数据在本书附带光盘的data文件夹的“usaauto.dta”工作文件中。2.1数据的类型、压缩与转化(1)打开数据文件中的全部数据如果想要打开usaauto数据文件中的全部数据,输入的标准命令如下:use“C:datausaauto.dta”use是代表打开的命令语句,引号中“C:datausaauto.dta”则给出了数据文件的路径,说明数据文件是C盘中data文件夹下的usaauto.dta数据文件。(2)打开数据文件中的部分变量有时,并不需要将数据文件中的所有变量全部打开,因为原
3、始数据内容丰富,含有很多变量,而研究可能只涉及其中的几个变量。所以若只打开usaauto文件中的make和price这两个变量,应该使用如下命令:use make price using“C:datausaauto.dta”这个命令中use make price部分表示需要打开make和price两个变量,using“C:datausaauto.dta”部分表示打开的数据文件路径及名称,如果用户使用此命令打开其他数据文件,所应用的命令相似,只需要把表示文件名称和变量的具体内容修改即可。2.1数据的类型、压缩与转化(3)打开数据文件中的部分样本有时,原始数据文件的样本数量过于庞大,例如人口普查的
4、数据动辄千百万,可是一般的研究大部分不需要全部的样本,只需要部分样本即可,所以这时候只需要打开部分样本。例如,只需要打开usaauto数据文件中第五到第十个样本的数据,可以使用如下命令:use“C:datausaauto.dta”in 510其中use“C:datausaauto.dta”部分表示打开的数据文件名称及路径,in510部分表示选取的样本序号,即选取第5到第10个样本。如果用户使用此命令打开其他数据文件,所应用的命令相似,只需要把表示文件名称和样本序号的具体内容修改即可。2.1数据的类型、压缩与转化(4)打开数据文件中具有某些特征的样本有时,原始数据将不同特征的样本混杂在一起,而现
5、实的研究却要求将不同的样本分开研究,例如分别研究男性、女性的情况,城市、农村的经济问题,等等。这时就需要只打开具有这些特征的样本数据进行分析,在这个试验中,打开usaauto文件中进口车样本数据的命令为:use“C:datausaauto.dta”if foreign=1这个命令语句中最重要的就是if语句,该命令执行的结果就是让stata仅仅读入符合条件的样本数据。在本例中,foreign=1就表示是进口车,所以打开的数据就是进口车的数据。(5)打开网络数据如果想使用Stata官方网站或其他网站所提供的数据,而这些数据又没有直接下载到本地电脑上,Stata也有专门的命令供用户使用,以便打开这种
6、途径得到的数据。例如nlswork是Stata官方网站提供的有关美国年轻女性年龄工资等的数据,要想通过网络打开,可以运行如下命令:use http:www.stata-datar9nlswork2.1数据的类型、压缩与转化2.1.2Stata常用数据类型与压缩常用数据类型与压缩Stata常用的数据类型主要有三类:即数值型、字符型和日期型,下面将会逐一进行介绍。(1)数值型变量,主要是由数字、正负号、小数点来组成的数据,按其精度和存储大小不同,又可以分为五类,具体内容见表2.2。其中double是所有变量当中所需存储空间最大的一个,与此相应的其精度也最高,所以当用户在使用的时候,应根据变量的特征
7、来设置变量的类型。在Stata中默认的数值型变量类型为float型的。2.1数据的类型、压缩与转化(2)字符型变量,主要是用来说明样本的一些特征信息的变量,可以由字母、特殊符号和数字组成,但是这里的数字已经退化成了一种符号,不再具有数值特征。字符型数据一般会被保存为str#格式,str后面的数字代表最大的字符长度,如str6表示可容纳最大长度为6个字母的字符型变量。字符型变量一般用英文状态下的引号”进行标注,且引号一般不被视为字符型变量的一部分。2.1数据的类型、压缩与转化(3)日期型变量,是Stata软件中用来表示时间的变量,有多种表达方式,例如1987年8月15日,可以写为19870815
8、,也可以写为15081987等等。在Stata中将1960年1月1日看做分界线,为第0天,之前的天数都加上一个负号,例如1959年12月30日为第-2天。数据类型的设置如果不恰当,则会带来一系列的麻烦,若类型设置过小则会使得一些数据无法正常输入,这一类问题较为容易发现,反之若类型设置过大,则会造成存储空间的浪费,这一问题的避免需要使用compress命令对数据进行压缩。compress命令能在很大程度上减少数据占用的存储空间,但不会改变数据的内容和精度,从而使用起来较为方便。数据压缩的命令语句为:compress varlist在这个命令语句中compress是进行数据压缩的命令语句,varl
9、ist是将要压缩的变量的名称,若不指明将要压缩的变量名称,Stata默认将对整个数据文件进行相应的压缩。2.1数据的类型、压缩与转化例如,我们生成一个样本,变量的名称为a,数值大小为1,这时Stata默认的类型为float。命令如下:clearset obs 1gen a=1 describe在这组命令中,clear命令进行了内存的清空,set obs 1是指样本容量设置为1(set obs是进行样本容量设定的命令语句),gen a=1是指生成一个变量名称为a,它的值为1,describe命令用来描述变量的基本情况,则会显示如图2.2所示的执行结果。从图中,可以看到这时候a的类型确实为floa
10、t,这时为了压缩变量a所占用的存储空间,使用如下命令:compressdescribe执行结果如图2.3所示,可以发现这时a的类型已经变成了byte。2.1数据的类型、压缩与转化2.1.3数据类型的转化数据类型的转化(1)将字符型变量转化成数值型变量字符型变量之间不能进行数值计算,所以如果对字符型变量进行数值计算,Stata则会提醒出现系统错误,这时必须将字符型变量转化成数值型变量,才能进行正确的计算。这种转化要用到的基本命令语句如下:destring varlist,generate(newvarlist)|replace options这个命令语句中,destring是表示数据类型转化的语
11、句,varlist是进行数据转化的变量名称,generate(newvarlist)|replace表示生成新的变量或者替换原来的变量,options的具体内容如表2.3所示。2.1数据的类型、压缩与转化例如,打开数据文件water,用describe命令,如图2.4所示发现所有的数据类型均为字符型。如果想要进行计算,必须将所有数据转化成数值型,具体命令如下:use c:datawater,cleardestring year production capital labor,replace第一个命令语句是打开water数据文件,第二个命令语句destring是进行数据转化的命令语句,year
12、、production、capital、labor是被转化的变量名称,replace表示用转化后的数据替换原有数据。这个命令执行完之后,可以再用describe命令看到如图2.5所示的结果,所有的字符型变量已经转化成数值型变量了。2.1数据的类型、压缩与转化如果字符型变量中含有空格,如date.dta数据文件中的日期变量,此数据文件的格式如表2.4的格式所示,若想转化成表2.5所示的格式,应该使用如下命令:use c:datadate,cleardestring date,replace ignore(“”)在这个命令语句中,destring date表示对date变量进行转化,replace
13、表示替换原有数据,ignore(“”)表示转化时忽略空格。注意,两个引号之间必须有一个空格,否则不能正确执行,执行后,结果就顺利从表2.4所示转向表2.5所示了。2.1数据的类型、压缩与转化如果字符型变量中包含特殊字符,如货币单位$、¥或%,也不能实现顺利转化。例如在price.dta数据文件中,price变量中包含美元符号“$”,如表2.6的格式所示,若要实现到表2.7的转化就属于这一种情形。实现这种转化,不仅要消去$这一符号,还需要生成新的一列,具体命令如下:use c:dataprice,cleardestring price,gen(price_1)ignore(“$”)其中,dest
14、ring price表示对变量price进行转化,gen(price_1)这一部分的含义就是生成一个新的变量用来存储转化后的数据,新的变量名称为price_1,这不同于replace命令直接用新数据替换旧数据。ignore(“$”)这一部分的含义就是指在转化过程中忽略特殊符号“$”的影响。2.1数据的类型、压缩与转化(2)将数值型变量转化成字符型变量这一部分的转换其实是上面内容的一个逆运算,只有命令语句不同由destring转变成了tostring,其他部分基本一致,语句如下:tostring varlist,generate(newvarlist)|replace options例如,将co
15、nsumption_china.dta数据文件中的数据全部转化成字符型变量,所使用到的命令语句为:use c:dataconsumption_china,cleartostring year c y c_ratio,replace第一个命令语句打开了数据文件,第二个命令将所有的数值型变量全部转化成了字符型变量,前后都用describe命令描述一下,可以看到如图2.6向2.7的转化。2.2数据的导入2.2.1创建新的数据库创建新的数据库在现实的经济学研究中,大部分数据都是由用户自行输入创建的,所以本节将会介绍两种创建数据库的方法:一种是通过菜单方式创建,另一种是通过命令方式创建。(1)菜单式操作
16、利用Stata的菜单,若要创建名为chengji.dta,内容如表2.8所示的的数据表,其操作方法如下展示。2.2数据的导入(2)命令式操作若要通过命令方式,实现表2.7所示内容的输入,首先必须要了解数据输入的基本命令,具体语句如下:input type varname type varname 这个命令语句中,input表示输入的命令语句;type表示输入的变量的类型,若省略,则为Stata默认的float型;varname表示变量的名称。在这句命令之后,依次输入数据即可完成。若要输入表2.7所示的内容,具体的命令语句如下:clearinput str10 name remarksMike
17、98John 78Ryan 86Tom 67Kite 96endsave chengji(将数据文件保存在默认文件夹data中,文件名为chengji)2.2数据的导入在这些命令语句中,clear表示清除内存;input str10 name remarks表示输入两个变量name和remarks,其中要将变量的类型写在名称前面,如str10表示name的类型为长度为10的字符型,而remarks前面没写数据类型,表示其类型为默认的浮点型;Mike 98Kite 96表示数据的内容,一定要按照前面命令语句中变量name和remarks的顺序填写;end表示数据输入结束的命令语句;save ch
18、engji是将数据文件保存在默认文件夹data中,文件名为chengji.dta。用户可以发现,用命令方式实现数据的输入较为繁琐,所以一般并不使用,这里只是为完善本书知识才做介绍的。2.2数据的导入2.2.2使用已经保存的使用已经保存的Stata数据数据Stata默认的数据格式是.dta,若是这种格式的文件可以直接打开应用,命令为use,具体内容已在本章2.1.1节做了详细介绍,这里不再赘述。2.2.3导入其他格式的数据导入其他格式的数据当数据文件为其他格式时,也可以导入Stata软件中进行处理,常用的命令主要有insheet、infile、infix命令,下面将通过实例详细介绍。2.2数据的
19、导入(1)使用insheet命令,读取ASCII数据。ASCII数据是指原始的文本数据,是由由电子表格和数据库程序生成的数据文件中,每一行代表一个观测值,数值由逗号或制表符隔开,第一行可以包含变量名称。用insheet读取时的基本命令语句如下:insheet varlsit using filename,options这个语句中,insheet代表导入数据的命令,varlsit using filename代表数据文件中的某个变量,这里的options的具体内容显示在表2.9中,主要包括选项的内容和所代表的含义。2.2数据的导入例如,将数据citywater.csv导入Stata中,就不能直接
20、使用use命令了,因为此数据文件的后缀名不是.dta,而是.csv,这种数据类型表示使用逗号分隔的一种数据类型,其具体格式如图2.10所示。将其导入Stata的命令如下:insheet using C:datacitywater.csv这个命令语句中insheet是导入此类数据的命令,using C:datacitywater.csv指明了其他格式数据的路径,此时数据文件citywater.csv就被正确导入Stata中,可以进行各种操作了。2.2数据的导入(2)使用infile命令,读取没有固定格式的ASCII数据。infile在某种程度上可以完成与insheet命令相同的功能,而用infi
21、le命令读取数据的基本命令语句如下:infile varlist _skip(#)varlist _skip(#).using filename if in,options例如,同样将数据citywater.csv导入Stata中,infile命令与insheet命令的最大区别是前者必须指明变量名称,尤其是字符型变量。这个例子的操作命令为:infile year production capital labor using C:datacitywater.csv这个命令的操作结果与insheet命令相同。2.2数据的导入(3)使用infix命令,读取固定格式的ASCII数据。这种固定格式的数据
22、有固定的位数,当位数不够时,前面用0补齐,对于这种数据是用infix命令读入的,具体形式如下:infix using dfilename if in,using(filename2)clearinfix specifications using filename if in,clear例如,将下列一组数据(数据文件chengji.csv)转化成如表2.10所示的数据形式。chengji这组数据为用逗号隔开的数据类型,如图2.11所示,其中gender(性别)只有0和1两个数字组成,number(学号)这一栏必须由三位数组成,math和english的成绩必须由两位数组成,所以这是一个固定格式的
23、数据,应该使用infix命令。2.2数据的导入具体的命令语句为:infix gender 1 number 3-5 math 7-8 english 10-11 using C:datachengji.csv,clear在这个命令语句中,infix gender 1说明第一位数据位性别,number 3-5表示第3至5位表示学号,math 7-8表示第7至8位表示数学成绩,english 10-11表示第10至11为表示英语成绩,using C:datachengji.csv表示原始数据文件的路径。2.3数据的整理2.3.1数据的标签与排序数据的标签与排序(1)为了让用户更加清楚地了解数据的来
24、源、变量的含义、观测值的解释等相关内容,Stata可以为数据、变量、观测值添加标签,其实标签就是对相关数据的解释。最常用的标签方法有三类:一是为数据库添加标签,二是为变量添加标签,三是为观测值添加标签。为数据库添加标签的基本命令为:label data label在这个命令语句中,label data是为数据库添加标签的命令语句,label代表所要添加的标签的内容。为变量添加标签的基本命令为:label variable varname label在这个命令语句中,label variable是为变量添加标签的命令语句,varname代表所要添加标签的变量名称,label代表所要添加的标签的内
25、容。2.3数据的整理对于数值型的分类变量,单纯通过数值很难判断其含义,例如用0和1区分性别,但是很难区分0是代表男性还是女性,这时如果给数值添加标签,就方便用户理解了。为数值添加标签是通过两步来完成的,第一步是定义数值标签,基本命令为:label define lblname#label#label.,add modify nofix在这个命令中,label define是定义数值标签的命令语句,lblname代表所要定义的数值标签的名称,#代表所要定义的数值,label代表所要添加的标签的内容。需要用户注意的是后方options的内容,其中add的作用是添加标签内容,modify的作用是对已
26、存在的标签内容做修改,nofix的作用是要求Stata不为标签的内容而改变原变量的存储容量。2.3数据的整理第二步是将所定义的数据标签与相关变量结合,基本命令为:label values varname lblname,nofix在这个命令语句中,label values是将定义的数据标签与相关变量结合的语句,varname代表将要添加标签的变量名称,lblname代表刚刚定义的数据标签名称。通过下面的例子给usaauto.dta数据库添加三类标签,将会给用户详细介绍标签的使用方法,usaauto数据文件如表2.1所示。2.3数据的整理为整个数据库添加标签“1978年美国汽车产业的横截面数据”
27、,其命令如下:label data“1978年美国汽车产业的横截面数据”这个命令语句中label data表示为数据库添加标签,“1978年美国汽车产业的横截面数据”指明了标签的内容。为变量make和mpg添加标签“品牌”和“每加仑油行使里程数”,其命令如下:label variable make“品牌”label variable mpg“每加仑油行使里程数”label variable表示为变量添加标签,make“品牌”表示将要添加标签的变量和标签的内容。2.3数据的整理变量foreign为分类变量,0代表国产,1代表进口,为了便于观察,为0和1添加标签,具体命令为:label defin
28、e foreignlabel 0“Domestic”1“Foreign”label values foreign foreignlabellabel define表示定义标签的内容,foreignlabel表示标签的名称,0“Domestic”1“Foreign”表示定义的规则,数字0的标签是Domestic,数字1的标签是Foreign。label values表示将定义的标签与变量结合的命令,所要结合的变量为foreign,结合的标签为foreignlabel。标签添加完成以后,可以通过label dir命令,查看已经建立标签的相关内容。2.3数据的整理(2)为了处理数据的方便,有时需要对
29、数据进行排序处理,排序的命令有主要有两个,一个是sort命令,一个是gsort命令。sort命令的基本语句是:sort varlist in,stable在这个命令语句中,sort是基本命令,varlist代表将要进行排序的变量名称,in代表排序的范围,,stable的含义是如果两个观测值相同,其顺序保持与原数据相同。gsort命令的基本语句是:gsort+|-varname+|-varname.,generate(newvar)mfirst其中需要说明的内容有两点:一是+表示按升序排列,这也是Stata默认的排列方式,-表示按降序排列;二是generate(newvar)表示排序之后生成新的
30、变量,mfirst表示将缺失值排在最前面。将usaauto数据文件中的观测值按变量price由小到大排列,这个操作可以用sort命令完成,具体操作如下:sort price当然也可以用gsort命令完成,具体操作如下:gsort+price2.3数据的整理2.3.2数据的拆分数据的拆分(1)数据的横向拆分。原始数据有时包含过多的变量,但在实际应用中可能根据需要将原始数据拆分为不同的数据表,这时就要实现数据的横向拆分。数据的横向拆分用到的两个命令为drop和keep,下面做一下详细的讲解。drop命令是用来删除某些变量和观测值的,基本命令如下:drop varlist if inkeep命令是用
31、来保留某些变量和观测值的,基本命令如下:keep varlist if in2.3数据的整理water数据文件包含四个变量,分别是year、capital、production、labor,将water数据文件拆分为两个数据文件,一个数据文件包含year和production两个变量,命名为wateroutput,一个数据文件包含year、capital和labor三个变量,命名为waterinput。这个操作的具体命令如下:use c:datawater,cleardrop capital laborsave c:datawateroutput,replace以上命令,第一个命令实现了原数据
32、文件的打开,第二个命令删除了变量capital和labor,第三个命令实现了存储,新文件的名字为wateroutput,并用replace命令替换了原有数据。2.3数据的整理use c:datawater,clearkeep year capital laborsave c:datawaterinput,replace以上命令,第一个命令实现了原数据文件的打开,第二个命令保留了变量capital和labor,第三个命令实现了存储,新文件的名字为waterinput,并用replace命令替换了原有数据。2.3数据的整理(2)数据的纵向拆分。原始数据有时包含过多的样本观测值,但在实际应用中可能根
33、据需要将其按某种特征拆分为不同的数据表,这是就要实现数据的纵向拆分。数据的纵向拆分用到的主要命令还是drop和keep。例如将usaauto数据文件拆分为两个数据文件,一个数据文件叫domesticauto,只包含国产车的相关内容,一个数据文件叫foreignauto,只包含进口车的相关内容,具体操作如下:use c:datausaauto,cleardrop if foreign=1save c:datadomesticauto,replace以上命令完成了第一个数据文件的建立,第一个命令完成了原始数据文件的打开,第二个命令删除foreign变量为1的数据,第三个命令存储新的数据文件,名称为
34、domesticauto,并用replace命令替换了原有数据。2.3数据的整理第二个数据文件建立的命令如下所示:use c:datausaauto,clearkeep if foreign=1save c:dataforeignauto,replace以上命令完成了第二个数据文件的建立,第一个命令完成了原始数据文件的打开,第二个命令保留了foreign变量为1的数据,第三个命令存储新的数据文件,名称为foreignauto,并用replace命令替换了原有数据。2.3数据的整理2.3.3数据的合并数据的合并(1)数据的横向合并。数据的横向合并是横向拆分的逆操作,但是其要比拆分复杂,因为合并时
35、要实现同一个体数据的对接,而不能出现对接错误的情况。所以在横向合并之前最好先对数据进行排序处理,然后实现合并。合并所使用的命令语句为merge,具体语句如下所示:merge varlist using filename filename.,options其中,merge为合并的命令语句,varlist代表合并进去的新变量,using filename指的是所要与原文件合并的文件路径,options包含较多的功能,表2.11显示了其具体内容。2.3数据的整理2.3数据的整理例如,利用横向拆分实验中生成的数据文件waterinput和wateroutput实现数据的横向合并,匹配变量为year,生
36、成新的数据文件命名为waternew。这个操作的命令为:use c:datawateroutput,clearsort yearsave c:datawateroutput,replaceuse c:datawaterinput,clearsort yearmerge year using c:datawateroutputsave c:datawaternew,replace在以上命令语句中,第一个命令语句实现了wateroutput数据文件的打开,第二个命令语句将文件按年份变量进行排序,第三个命令语句保存了排序之后的数据文件,第四个命令语句实现了waterinput数据文件的打开,第五个命
37、令语句将此数据按年份变量进行排序,第六个命令语句按年份变量将wateroutput文件合并到waterinput文件中,第七个命令语句保存合并之后的数据文件。2.3数据的整理(2)数据的纵向合并。数据的纵向合并为数据纵向拆分的逆操作,使用的主要命令为append命令,具体语句如下:append using filename,options在这个命令语句中,append是进行纵向合并的命令语句,using filename是进行纵向合并的文件路径,,options的内容与merge相似,但更为简化。例如,利用纵向拆分实验中生成的数据文件domesticauto和foreignauto实现数据的纵
38、向合并,生成的数据文件命名为usaautonew。这个操作的命令为:use c:datadomesticauto,clearappend using c:dataforeignautosave c:datausaautonew,replace在以上命令中,第一个命令语句打开了原始数据文件,第二个命令将foreignauto文件合并到domesticauto文件中,第三个命令语句存储了合并后的数据文件。2.3数据的整理2.3.4长宽数据的转换长宽数据的转换在面板数据中,如果包含两个标识变量,则数据又两种表现形式,一种是长数据,一种是宽数据。在长宽数据的转换中,所使用到的命令为reshape命令,
39、具体命令语句为:reshape long stubnames,i(varlist)optionsreshape wide stubnames,i(varlist)options在这个命令语句中,reshape是代表数据转换的命令,long表示将宽数据转化为长数据,wide表示将长数据转化成宽数据,stubnames表示需要转化的变量的名称前缀,i(varlist)表示识别变量。options最常用的为j(varname values),它表示用来进行长宽变换的变量名称,通常为时间变量。例如实现如表2.12和表2.13数据形式的转换,则必须使用本小节讲述的reshape命令。表2.12为数据文件
40、widedata.dta所显示的内容,表2.13为数据文件longdata.dta所显示的内容。2.3数据的整理将宽数据转化为长数据的操作命令如下:use c:datawidedata,clearreshape long english science,i(number name)j(year)在以上命令中,reshape long表示将宽数据转化成长数据的命令语句,english和science表示将要转化的变量名称的前缀,也即将要生成的变量的名称,i(number name)表示识别变量,即按学号number和名称name区分所有观测值,j(year)表示将要长宽转换的变量,一般是按年份进
41、行转化。2.3数据的整理将长数据转化为宽数据的操作命令如下:use c:datalongdata,clearreshape wide english science,i(number name)j(year)在以上命令中,reshape wide表示将长数据转化成宽数据的命令语句,english和science表示将要转化的变量名称的前缀,也即将要生成的变量的名称,i(number name)表示识别变量,即按学号number和名称name区分所有观测值,j(year)表示将要长宽转换的变量,一般是按年份进行转化。习题习题1.将如表2.14所示的数据内容输入到Stata中,命名为zuoye2.
42、1,并将此数据文件进行压缩。习题习题2.将数值型变量math和chinese转换成字符型变量,然后再将其转换成数值型变量。3.为数据库zuoye2.1添加标签“学生成绩”,为math变量添加标签“数学成绩”,为分类变量gender添加标签,1为“male”,0为“female”。4.使用两种命令将数据库zuoye2.1按照数学成绩进行排序。习题习题5.将数据库横向拆分为如表2.15和表2.16所示的两个数据表,然后再将其横向合并。习题习题6.将数据库纵向拆分为如表2.17和表2.18所示的两个数据表,然后将其纵向合并。习题习题7.将如表2.19所示的数据内容输入到Stata中,命名为zuoye2.2,并将其转换成长数据,然后再将其转换成宽数据。