STATA硕士研究生班计量经济软件及应用对外经济贸易大学金融学院谢海滨InternationalBusinessSchool,UIBE第五讲、命令语句结构与运算符STATA是当前最为流行的统计计量分析之一STATA的广泛应用:-1.运算符及运算-2.命令语句结构-1命令(command)-2变量(varlist)-3分类变量(byvarlist)-4赋值(=exp)-5条件(ifexp)-6范围(inrange)-7加权(weight)-8可选(option)第五讲、命令语句结构与运算符•运算符与运算–对数据进行加工,不可避免的会涉及到数据的运算。STATA共有四种运算:代数运算、字符运算、逻辑运算和关系运算。各种运算的运算符见右表。–运算的优先级(从高到低):!(或~),^,-(负号),/,*,-(减),+,!=(或~=),,,=,=,==,&,|当忘记或者无法确定优先序的时候,最好用括号将优先序表达出来,在最里层括号中的表示式将被优先执行代数运算逻辑运算关系运算+“加”或“字符相加”&“与”或“和”大于-“减”或“负号”|或小于*乘~“非”或“不”=大于等于/除!“非”或“不”=小于等于^指数==等于sqrt()开方~=或!=不等于第五讲、命令语句结构与运算符•代数运算–代数运算是最基本的数据处理,它包括包括加(+)、减(-)、乘(*)、除(/),幂(^)和负数(-)。在进行代数运算时,如果遇到缺失值、运算不可行时(比如除数为零)或运算不用执行时均会得到缺失值。–如只给女生成绩进行开方在乘以10进行调整,则可以用如下命令–useMath_score.dta,clear//将数学成绩文件打开–genmath_female=sqrt(math)*10ifgender==0//将女生数学成绩进行调整,并将调整后的成绩记为math_female第五讲、命令语句结构与运算符•字符运算–当需要把两个字符进行连接时,同样可以用加号(+)来完成。比如,把“我”和“爱你”合并在一起,命令为:–scalara=“I”+“LoveU”//将字符I和LoveU连接并赋予a。注意:引号必须是在英文半角状态,否则出错。–scalarlista//显示a的内容–不可以将不同类型的数据进行相加,否则将出错。例如,把数值型数据2和字符型数据3相加就会出错。–scalara=5+“3”//将数值2和字符3相加,结果出错–typemismatch–r(109);第五讲、命令语句结构与运算符•关系运算–关系运算包括大于、小于、等于;大于等于、小于等于、不等于等多种比较关系。特别要注意的是,STATA中的等于符号为“==”,是两个等号连写在一起,表示比较两边的关系式是否相等,它不同于“=”。“=”的含义是将等号右边的值赋予左边的变量,这是一个赋值号。当关系式满足是,显示结果为1(表示关系式正确),否则显示结果为0(表示关系式错误)–dis35//dis是display的简写,显示结果为0,表示关系式不对–dis35//显示结果为1,表示关系式正确–dis4==4//显示结果为1,表示关系式正确–在进行关系运算中一定要注意缺失值,因为在STATA中,系统缺失值大于任何一个数据。•例–下面举例说明忽略缺失值的严重后果。假定有如下的学生成绩数据,由于John缺考,因此成绩缺失。–现在假定学校想了解数学成绩在80~90分和90分以上的人数,有人写出如下命令进行统计–genMath_9=(Math=90)//成绩在90及以上的–genMath_8=(Math90)&(Math=80)//成绩在80~90之间–listMathMath_9Math_8//显示结果–显然这种统计方式是错误的,因为他将缺考的John的数学成绩当成超过90分来处理。Stu_idNameChineseMath1John..2Marry80903Jack78604Tom77855Jerry87866Jim8760第五讲、命令语句结构与运算符•逻辑运算–逻辑运算符包括非(!或者~),和(&)、或(|)三种,大量运用在条件和判断语句中。–sysuseauto.dta,clear//导入系统自带的汽车数据文件–listif(price5000)&(foreign==1)//显示价格超过5000的国外车的基本特征–listturnif((price5000)|(price10000))&(foreign==1)//显示价格小于5000或者价格超过10000的国外车的转速–注意,在STATA中,和(&)优先于或(|)。问下面的命令代表什么含义?–listturnif(price5000)|(price10000)&(foreign==1)第五讲、命令语句结构与运算符•命令语句的格式–通过前面几讲的学习,相信大家对命令多少有了点自己的了解。本讲将介绍STATA命令语句的一般性格式:–[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]–一般性格式中包含有如下几个组成部分:命令(command)、变量列表(varlist)、分类(by)、赋值(=exp)、条件(ifexp)、范围(inrange)、权重(weight)、可选项(options)。其中,[]表示可有可无的项,否则为必选项,显然只有command是必不可少的。下面我们将结合具体的例子来讲解各个组成部分的含义及功能。第五讲、命令语句结构与运算符•命令(command)–[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]–命令(command)是命令语句中的核心,他告诉计算机应该执行怎样的操作,是实现人和机器沟通的语言。–cdd:/mystata//cd:工作路径设定在d盘的mystata文件夹下–useauto.dta,clear//use:打开数据文件;clear:清空原有内存–summarize_all//summarize:显示内存中所用变量的基本统计特征–summarize//很多命令可以单独使用,这时一般指针对所用变量进行该命令操作。该结果与上一条命令功能一样。–sum//与上一条命令等价,是summarize的缩略形式–su//与上一条命令等价,是summarize的最简形式–s//简写前提是不引起混淆。执行这个命令将出现错误信息–unrecognizedcommand:s–r(199);第五讲、命令语句结构与运算符•命令(command)–命令的简化规则–在不引起歧义条件下,命令可以尽量只写前几个字母。如summarize只需要前两个字母su;而describe只需要写第一个字母d。在帮助文件中,命令下面的小划线表明了命令的可以省略到什么程度。如–describe[varlist][if][in][,options]–summarize[varlist][if][in][weight][,options]–练习:请用list命令进行仿照练习。第五讲、命令语句结构与运算符•变量(varlist)–[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]varlist:变量列表,表示一个或者多个变量,多个变量之间用空格隔开。变量一般紧跟command命令之后,表示命令执行对象。如–cdd:/mystata//工作路径设定在d盘的mystata文件夹下–useauto.dta,clear//打开数据文件并清空原有内存–suprice//显示价格变量的基本统计特征–sup//由于auto文件中只有变量price首字母为p,因此与suprice相同–sut//数据中有两个变量的开首字母为t(trunk和turn),所以STATA认为t为模糊的省略,并给出如下的错误信息–tambiguousabbreviation–sutrunkturn//显示trunk和turn的基本统计特征–sut*//与上一条命令相同,显示首字母为t的所有变量的基本统计特征第五讲、命令语句结构与运算符•分类变量(byvarlist)–[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]该语句的含义是根据变量列表,varlist来执行相应的命令。请比较下面的两个例子:例1:对所有汽车数据进行命令操作–cdd:/mystata//设定工作路径为d盘的mystata文件夹–usemyauto.dta,clear//打开d盘文件夹mystata中的文件myauto.dta,并清空原有内存–sumpricempglength//对变量进行基本统计分析–例2:*对国产车和进口车进行分类命令操作–byforeign:sumpricempglength//对国产车和进口车分别进行基本的数据统计分析–注意:用by语句时,一定要确保内存中的数据是按照by后面的变量排序的,否则将会报错。请看下面的例子:–sortprice//将内存中的数据按照价格进行排序–byforeign:sumpricempglength–notsorted第五讲、命令语句结构与运算符•赋值操作(=exp)–[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]该语句主要用于生成新变量(gen)或覆盖原有变量(replace)。–例:假定销售商相对所有的车进行降价处理,降价的方式是在原有价格基础之上打9折在扣除100美元。我们可以用下面的命令实现:–cdd:/mystata–usemyauto.dta,clear–genadj_price=price*0.9-100//新的变量adj_price由原始价格*0.9减去100来生成–listpriceadj_price//显示price和adj_price的内容–如果要覆盖已存在的变量,要用replace命令,不可以用gen命令。第五讲、命令语句结构与运算符•条件语句(ifexp)–[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]当我们只想对满足某些条件的数据进行某类操作时,则应当考虑使用条件语句。–例1:假定某客户只想查看进口车的价格–cdd:/mystata–usemyauto.dta,clear–listpriceifforeign==1–例2:假定某客户只想查看价格高过10000的进口汽车信息–listif(price10000)&(foreign==1)–例3:假定某客户想分类查看价格高过10000或低于6000的进口汽车和国产汽车信息–byforeign:listif(price10000)|(price6000)第五讲、命令语句结构与运算符•范围筛选(inrange)–[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]如果用户只想对某一范围的数据进行处理,则可以考虑使用in语句。–例1:列出前10辆价格最低的汽车的基本信息–cdd:/mystata–usemyauto.dta,clear–sortprice–listin1/10–注:1/10中的反斜杠“/”的的含义是从1到10–例2:只显示前20辆最低价格汽车中国产车的基本信息–listin1/20ifforeign==0第五讲、命令语句结构与运算符•加权(weight)–[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]假定有如右的成绩表,其中score表示成绩,num表示得到