第十六章 STATA编程基础,主要内容,基本概念与工具 程序文件的基本格式 程序控制语句,实验16-1:基本概念与工具,实验基本原理 如果我们需要反复执行一些命令,就可以将相关命令存放在一个do文件中,然后保存并运行相应的do文件即可相比起一遍一遍地输入命令,这种方式既方便又不容易出错而另一些时候,我们会需要编写程序,从而能用一个命令来实现某种结果 一个程序应以program开头,以end结束也就是说,应呈现如下的形式: program 程序名 相应的命令 end我们可以采取交互的方式定义程序(即,在Stata命令窗口中输入程序的各行命令),但实际应用中,程序经常是被保存到一个do文件或ado文件中去,从而方便以后的应用 在程序或do文件中,我们可能需要加入注释,从而方便以后或他人的阅读通常,我们还会声明版本,从而使得程序能够在以后更高版本的Stata中继续使用此外,局部宏、全局宏、临时变量、临时矩阵和临时文件等也会经常被使用实验内容及数据来源 本实验中,我们会讲解do文件的创建和执行方法、定界符的修改、程序和do文件的联系、ado文件的创建和保存、注释的添加方法、版本的声明、局部宏和全局宏的定义及引用以及临时变量、临时矩阵和临时文件的定义和使用等内容。
本实验主要讲解编写程序的一些基本操作,不需要使用数据文件实验操作指导 1 Do文件 do文件是一种文本文件,其扩展名为“.do”要创建一个do文件,可以通过菜单栏中Window的下拉选项Do-file Editor来打开Do文件编辑器,也可以直接点击工具栏的图标 而要执行一个do文件,可以键入以下命令: do filename 这里,filename指相应的do文件的文件名但需要注意的一点是,这个filename.do文件需要放在当前目录下,只有这样,才可以不写文件的路径;否则,需要在文件名前写出完整路径(而如果路径中有中文字符,一定要将全部路径和文件名置于英文双引号之间) 要查看当前目录,我们可输入命令: cd 当然,我们也可以先将当前目录更改到我们偏好的一个文件夹下,然后再将do文件存放其中例如,如下命令可以将当前目录更改到d盘data文件夹下: cd “D:\data” 这里,需要注意的一点是,cd命令要求其后的文件夹原来就存在对于do文件中的命令,值得注意的是,每一行命令都需要结束于一个硬回车(包括最后一行);除非通过“#delimit”命令设置其他符号为换行符例如,输入命令: #delimit . 则我们设置以英文的句号作为换行符,也就是说,Stata只有遇到英文句号才会认为这一句命令结束。
设置其他的换行符对于将很长的命令分成几行很有帮助,因为这时我们可以在想分行的地方输入回车符,而Stata又不会认为这是一句命令的结束 而如果我们想重新以硬回车(carriage return)为换行符,可输入以下命令: #delimit cr,2 Stata程序和Do文件 Stata处理程序和处理do文件的方式是一样的,包括参数的传递、结果的表达等但do文件和程序也存在一些小的差别例如,要激发一个do文件,我们需要键入“do filename”,而要激发一个程序,我们只需要键入程序名称就可以此外,键入“do filename”之后,Stata会显示do文件中的命令以及执行结果;而键入程序名之后,Stata只会显示其执行结果 下面,我们重点讲一下,通常情况下,将程序放到do文件中去需要注意的问题 例如,我们编写了一个简单的程序: program examp display “this is an example” end 并把它保存到名为“examp.do”的文件中,且把文件置于当前目录下下面,我们要执行这个do文件,就在Stata命令窗口输入如下的命令: do examp,下面,我们再在命令窗口输入命令: examp 也就是说,我们要执行程序examp。
这时,Stata就会显示: this is an example 在随后的时间里,我们如果还想显示“this is an example”,直接输入命令“examp”就可以 这里,我们展示了共同使用do文件和程序的一种方式,即,先在do文件中写出程序的命令并保存,再键入“do filename”,然后就可以在随后的时间使用该程序命令了当然,我们也可采取一种更为简洁的方式,即在do文件的最后一行加上程序名,这样,当键入“do filename”的时候,Stata就会在加载完程序后就执行程序但需要注意的是,程序一旦被定义,Stata就不允许对其重新定义这样,如果我们随后又输入一遍“do filename”,Stata就会显示错误提示要解决这个问题,我们可以在do文件的第一行输入这样的命令: program drop 程序名 这样,在定义该程序之前,如果内存中已有这个程序,我们会先将其从内存中删掉但这种解决方案也存在一个问题:在打开Stata的期间第一次运行这个do文件,Stata会显示错误提示因为这时还没有定义程序,所有没有办法将其删除我们继续修正该命令为: capture program drop 文件名 将命令“capture”置于其他命令之前,就表示无论该命令是否作用,Stata也不显示错误提示,且能继续执行下面的命令。
事实上,在包含程序的do文件中,我们经常可以看到程序的定义之前有这样的命令综合了以上几点,我们前面的do文件可以修改为这样的形式: capture program drop examp program examp display “this is an example” end examp 这里,第一行先检查是否有已定义的examp程序,如果有就将其从内存中删除第二到四行是定义程序examp,最后一行是执行程序examp3 Ado文件 如果想自动加载并运行程序内容,我们可以将程序保存到ado(automatically do)文件中(同样是利用do文件编辑器,保存时选择扩展名为ado),以后,直接输入程序名就可以使用该程序但需要注意的是,ado文件的文件名和其中的程序名必须一致 值得注意的是,如果在Stata运行的过程中改变了某个ado文件的命令语句,则在重新运行这个ado文件前,要先将Stata内存中的ado文件清除即,输入命令: discard 否则,Stata还是会运行原来的那个ado文件 个人编写的ado文件通常被存放在两个地方,一个是当前目录,另一个是个人ado目录个人ado目录通常位于“C:\ado\personal”,要查看其具体位置,可输入命令: personal 而要查看或改变当前目录,可使用命令“cd”。
4 版本 随着Stata版本的变化,相应的命令也会有些变化这样,较早版本的命令可能就没法在现在的版本中使用,而现在的某些命令可能也没法在以后的版本中使用为了让现在的程序能够在其他的版本中继续使用,我们可以在程序中声明所使用的版本;这样,在更新版本的Stata中运行这个程序,Stata就会做相应的调整,按当前版本的方式来翻译程序的命令要声明版本,可输入命令: version 10.1 这里,我们使用的是10.1版的Stata对于其他版本的Stata,在version后面输入相应的版本编号即可5 注释 有时,我们想在命令中加入注释,从而方便以后或他人的阅读要在do文件或ado文件中加入注释,可以采取如下几种方式: 1.以“*”来开始一行这样,该行就会被当做注释 2.将注释放在“/*”和“*/”之间该种格式可以置于句中的任何位置此外,在行末使用“/*”,并在下一行行首使用“*/”,可以将很长的命令分成两行 3.将注释置于双斜线“//”之后如果双斜线之前有命令,则双斜线与命令之间至少要有一个空格 4.将注释置于三斜线“///”之后如果三斜线之前有命令,斜线与命令之间也是至少要有一个空格此外,对于“///”,其下一行的命令会被认为是前面命令的继续。
三斜线也可单独置于行尾,从而将很长的命令分成几行例如,我们可以写这样一段命令: *this is an example use /*get data*/ “C:\Stata10\data\sample.dta“ summarize age education /// occupation tab region // obtain summary statistics如果去掉注释,上面的命令即为: use “C:\Stata10\data\sample.dta“ summarize age education occupation tab region 此外,对于交互方式的命令,注释只可采取第一种方式,即在句首加上“*”6 宏 宏是Stata程序的变量,它用一个字符串(宏的名称)来代表另一个字符串(宏的内容)宏分为局部宏(local macro)和全局宏(global macro)局部宏只属于其所定义的程序,不能从其他程序中调用而全局宏一旦被定义,就会留在内存,且可以被其他程序使用 局部宏的名称最多有31个字符,它的定义方式为: local 宏的名称 宏的内容 或: local 宏的名称=表达式 例如,我们输入命令: local nv “this is a newvar” 就定义了一个叫做nv的局部宏,其内容为this is a newvar。
如果我们要引用这个局部宏的内容,其格式为:`nv’注意,左边的引号为标准键盘左上角的重音符(数字1左边的键),右边的引号为通常的单引号(回车键左边的键)定义完毕之后,如果我们输入: `nv’ 我们就相当于输入了: this is a newvar,例如,我们可以输入如下的命令来显示这个宏的内容: display “`nv’” 注意,这里,宏`nv’外面的双引号必不可少,因为如果不加引号,我们相当于输入了如下的命令: display this is a newvar Stata会显示错误提示:this not found只有加上外面的双引号,才表示我们要显示一个字符串否则,Stata会将其当做变量来处理当然,如果宏的内容确实为存在的变量名,而我们要显示这个变量,就不必加上双引号 对于定义局部宏的命令,宏内容上的引号可以省略也就是说,我们在定义时,可以采用如下的命令: local nv this is a newvar 这与前面是等价的当然,加上引号能使命令的可读性更强下面,我们来看一下定义宏的两种形式的区别例如,对于如下两种形式: local one 3+2 或等价地,local one “3+2” local two=3+2 第一种形式中,局部宏`one’的内容为字符串3+2;而第二种形式中,Stata会先计算表达式的结果(3+2=5),然后将5保存到宏`two’中。
在第二种形式中,表达式可以是数值表达式或字符串表达式这里,3+2是数值表达式(如果想令其为字符串型,在外面加双引号就可以)此外,局部宏(以及全局宏)可以组合使用例如,局部宏`i'为数值6,宏`x6' 为字符newvar,则宏`x`i''就指代字符newvar另外,在组合时,我们可以通过大括号来设定运算的优先级如果要清除一个局部宏,可将其内容设置为空这可以通过如下三种方式实现: ①local macname ②local macname ““ ③local macname = ““ 这里,macname指宏的名称 而如果我们在程序中直接使用了一个没有被定义的宏,则Stata会将其当做一个内容为空的宏来处理对于全局宏而言,其名字最多可以有32个字符长全局宏的定义方法与局部宏类似,只需要将local改为global即可此外,引用全局宏时,在其名字前加上美元符号$此外,即便程序中的全局宏和局部宏有相同的名称也没有关系,因为他们的引用方法不同,Stata可以将其区分 值得注意的一点是,如果我们要显示的内容第一个字符为美元符号,为了和全局宏进行区分,我们可以在该字符前加上反斜线例如: display “\$that” 就表示要显示字符串$that,而不是全局宏that的内容。