第四章变量的生成与处理导论•Stata对数据的处理是以变量为前提的•若没有需要分析的变量,则Stata将一无用处•熟悉变量的内容和分布、生成新变量、改变旧变量等是处理数据的第一步4.1.新变量的生成、规则及注意事项Stata的变量类型•Stata软件生成三类变量:numeric(数值型)变量,string(字符型)变量(相当于定性变量)和date(日期)变量。虽然日期变量以数值型变量的技术记录、存储,但二者的用途却不同•数值型变量包括定距和定比变量。可以是整数、小数、负数和正数。数值型变量可以有多种存储方式(StorageTypes)•用str类型保存的定性等分类变量也可区分为多种形式,从str1-str244Stata的日期变量•日期(date)变量是数值型变量的一个特例。它们通常以字符的形式输入(如:01JAN1992or01/01/92),但必须以数值型数据存储才能有用•Stata有几个命令可以工作于日期和时间依赖(time-dependent)数据•Stata将所有的日期保存为从1960年1月1日以来的天数或月份、季节等。此前的日期是负值,此后的是正值。SAS使用同样的日期方式,但其起始时间是1582年的10月14日。Excel使用1900年1月1日为默认起始日。如果读入Excel数据,则以字符型变量输入日期,并重新格式日期生成变量的路径Data—Createorchangevariables生成变量的窗口Data—Createorchangevariables—Createnewvariable基本命令Stata有四个基本的生成和修改变量的命令:gen、egen、replace和recode•.gen和egen分别是generate和extendedgenerate的缩写,它们用于生成新变量•.replace和recode用来改变现存变量的属性或数值•.replace需要与gen一起使用;二者的区别在于,gen用于生成新变量,replace用于重新定义已经存在的变量•.recode也可以与gen一起使用基本语法.gen[变量名]=[表达式1]①②③.replace[变量名]=[表达式2]if[条件]①②③④①:生成新变量或替代现存变量取值的基本命令②:新变量或其取值将被替换的变量的名称③:在gen命令的取值不同于在replace命令的取值④:替换原有变量的取值必须满足if指定的条件*yrofschoolingrecoded(这是一个注释;*代表注释)genedu=0replaceedu=1ifyrsch==11replaceedu=2ifyrsch==12replaceedu=3ifyrsch==13replaceedu=4ifyrsch==14replaceedu=5ifyrsch==15replaceedu=6ifyrsch==16replaceedu=7ifyrsch==21replaceedu=8ifyrsch==22replaceedu=9ifyrsch==23replaceedu=10ifyrsch==24|yrsch==27replaceedu=11ifyrsch==25|yrsch==28replaceedu=12ifyrsch==26|yrsch==29replaceedu=13ifyrsch==31replaceedu=14ifyrsch==32replaceedu=15ifyrsch==33replaceedu=16ifyrsch==34replaceedu=17ifyrsch==35replaceedu=18ifyrsch==36replaceedu=.ifyrsch==.|yrsch==-9tab1yrschedu*查看变量的生成是否成功变量生成的规则(I)生成新变量、重新定义旧变量时需遵循的一些基本规则:•变量的名称可长达32个字符,必须以字母、汉字或字符(@,_,#,$等)开头(不能使用空白字符或!、?等特殊字符)。变量最后一个字符不能是句号•变量的名称必须唯一,不能有两个相同的变量名•Stata区分大小写,对大写、小写敏感:Variable不能写成variable,反之亦然•使用描述性的变量名字:“变量a”这个名称没有任何意义。调查问题是变量名称的很好选择变量生成的注意事项•尽量避免使用同一变量名称。换言之,不要使用新变量取代旧变量。保持原始变量有助于检验我们的命令是否正确•充分了解原始变量的分布以及每个数值代表的含义•遵循不重不漏(exhaustiveandmutuallyexclusive)原则(详见“生成分组变量”一节)•在变量生成后,将原始变量和新变量的取值进行对比,检查是否有误•注意原始变量的缺失值4.2.利用系统变量或下划线变量(_n和_N)生成新变量Stata有几个下划线变量(_variables,读为“underscorevariables”),因包含下划线而得名。这类变量并不出现在Stata的Variables(变量)窗口中,故又称系统变量。其中,经常使用的有_n和_N。系统变量_n和_N对于数据的管理和处理十分有用,尤其是与特殊选项by同时使用时系统变量_n•_n是指当前的观察值,即独一无二的观测序号,从1到_N(_N=总样本)•_n是Stata系统内部独特的辨识器,标志从第一个观察值开始直到最后一个观察值(_N)的序列•_n=1为第一个观测,_n=2为第二个观测,…,_n=_N是最后一个观测•该系统变量适于(1)指示观察值;(2)生成系列数值;(3)生成其他变量使用系统变量_n指示观察值•系统变量_n表示每个观察值的位置(numberingobservations)。其原则是:当前观察值:[_n]总观察值(最后一个观察值[_n]):[_N]第一个观察值:[1]最后一个观察值:[_N]滞后一个(lag)观察值:[_n-1]前移一个(lead)观察值:[_n+1]第27个观察值:[27]•假如现有以下数据:+----------------------------------------------------------+|provincepersonidhomesizeagegirlsiblings|(省份)(个人ID)(家庭规模)(年龄)(女孩)(姊妹数量)|----------------------------------------------------------|1.|212106018504505girl1|2.|35350515410310018boy0|3.|3232050937032468boy0|4.|373708156203609boy0|5.|454452082404206girl3|6.|3535011173052513girl2|7.|4545260576069010girl3|8.|323209163903252boy0|9.|373702093304687boy1|10.|3737040575038020boy3|+----------------------------------------------------------+•现在想看看每个孩子在省内的排序使用系统变量_n生成新变量•步骤1:对province(即“关键变量”)进行排序.sortprovince•步骤2:生成感兴趣的变量.byprovince:genorder=_n①②③④①:按province的分类进行排序和计算②:生成新变量的基本命令③:新变量的名称④:新变量的取值等于同一province内观察值的序次•步骤3:使用频数分布查看生成的结果是否正确.taborder使用系统变量_N生成新变量•系统变量_N代表样本总数。最后一个样本_n即是_N•使用前面的数据,看看每个省共有几个孩子在样本中•步骤1:对province进行排序•步骤2:生成感兴趣的变量。其命令是:.byprovince:genceb=_N•步骤3:查看结果正确与否.tabceb生成滞后(lag)变量或移前变量(lead)•在分析某些类型数据(包括常用的家庭成员数据和纵向数据)的过程中,常常需要根据研究问题将一个样本的取值转移到上一个(或下一个)观察值中。•.gena=b[_n-1].gena=b[_n+1]①②③①:需要生成的新变量的名称②:现有变量的名称③:将现有变量的取值下移一行([_n-1])或前移一行([_n+1])的基本命令.gena=age[_n-1](1missingvaluegenerated).genb=age[_n+1](1missingvaluegenerated).list+----------------------------------------------------------------------------+|provincepersonidhomesizeagegirlsiblingsorderab||----------------------------------------------------------------------------|1.|212106018504505girl11.2|2.|323209163903252boy0158|3.|3232050937032468boy02218|4.|35350515410310018boy01813|5.|3535011173052513girl22189|10.|4545260576069010girl326.|+----------------------------------------------------------------------------+4.3.生成数值型变量使用recode,…,gen命令生成新变量.recode[原变量]([原变量取值]=[新变量取值])①②③④*=[其他取值],gen[新变量]⑤⑥⑦①:给变量重新赋值的命令②:现有变量的名称③:现有变量的取值④:新变量的取值;③和④是一个整体⑤:*符号表示所有其他没有列出的数值,包括缺失值;recode与gen之间有逗号(,)隔开⑥:生成新变量的命令⑦:新变量的名称•以本章数据中的变量“yrsch”为例。前面使用gen…replace的方法在“yrsch”的基础上生成变量“edu”;现在使用另一种简便的方法生成“edu”–由于变量edu已经存在,首先需要删除该变量:.dropedu.recodeyrsch0=011=112=213=314=415=516=621=722=823=92427=102528=112629=1231=1332=14*=.,gen(edu)–该命令在原变量yrsch的基础上生成一个新变量(edu)–新变量对原变量的取值重新编码。原变量照旧保存着–若无gen(edu)部分,则仅取代原有变量的取值使用数学表达式生成新变量•任何有效的数学表达式在生成变量时都适用。既可以是加、减、乘、除的单独表达式,也可以是混合表达式:.gena=b+c+d•加法:将变量b,c,d的数值累加起来,生成新变量a.gena=b-c•减法:将变量b的数值减去变量c的数值,得到变量a.gena2=a*a•乘法:该命令生成新变量a2;a*a是axa的表达方式.gendoublea=b/c•除法:用变量b的数值除以变量c的数值,得到新变量a。该变量定义为double类型.gena=b/(c^2)•新变量a的取值等于变量b的取值除以变量c取值的平方4.4.生成分类变量*agegroup.genagegrp=0.replaceagegrp=1ifage=0&age=4.replaceagegrp=2ifage=5&age=9.replaceagegrp=3ifage=10&age=14.replaceagegrp=4ifage=15.replaceagegrp=.ifage==..egenagegrp=cut(age),at(0,5,10,15,20)4.5.生成虚拟变量(d