第4章 数据处理的组织方法
1、可执行程序的编写与执行
方法1:do文件
do文件是一个文本文件,里面包含了相关的Stata命令。执行do文件时,Stata会逐条执行do
文件里面的命令。do文件可以运用各种文字编辑器编辑,可以使用Windows自带的记事本,或Stata自带的文本编辑器(可以用doedit命令调用),最好不要使用Word等加格式的编辑器。比如一个简单的do文件:hello.do,内容如下:
*Begin hello.do display “Hello, world” exit
*End hello.do
在Stata命令输入窗口输入
.do hello
Stata就会运行do文件里面的命令,其中带*的是注释语句,Stata会自动忽略,直接执行
display “Hello, world”, 在Stata显示区将结果输出。
方法2:交互式-program-命令
另一种方式是在Stata命令窗口直接交互式的使用program命令定义程序,比如在命令窗口输
入:
.program hello
1. display “Hello, world” 2. end
当我们想运行该程序时,直接在命令窗口输入
.hello
则Stata即可运行刚才输入的程序hello
36
在实际使用中,我们很少直接使用交互式定义程序。另外,如果我们想修改该程序,比如我们
在display “Hello, world”之后再加一条命令display “Hi, back”。你在命令窗口输入 .program hello Hello already defined r(110)
Stata会返回错误,因为Stata会记住程序定义。如果你想重新定义一个程序,必须先利用命令
program drop 把同名程序清除: .program drop hello .
.program hello
1. display “Hello, world” 2. display “Hi, back” 3. end
使用program命令定义程序的另一个问题是program不知道Stata内部命令的名称,如果你定义
的程序名称和Stata内容命令同名,当你运行该程序时,实际将执行Stata的内容命令。比如你定义d程序 .program d
1. display “hello, world” 2. end
当执行上述命令时,实际运行的将是describe命令。
第3个问题是program不检测语法,因而如果定义的program中命令有错误,在运行该程序时将出错。如果program定义的程序命令行很长,可以打开Stata的跟踪功能寻找可能发生的错误。 .set trace on .set trace off
打开跟踪时不要忘记关掉,不然你将发现Stata的输出内容会很多。当修改比较复杂的程序
时,可以利用
.set trace on /*打开跟踪*/ .set more off /*将分屏显示关闭*/
.log using junk, replace /*开始一个名为junk.smcl的日志文件*/
37
.运行程序
.log close /*关闭日志文件*/ .set more on /*将分屏显示打开*/
第4个问题是一个单个program文件包含不能超过3500行命令,并且在Stata/SE要小于
135600个字符。
第5个问题不能编辑修改程序。
方法3:在do文件中使用program命令
在do文件中使用program的好处是随时可以修改你的程序,比如我们建议一个hello.do文件
*BEGIN hello.do program hello end exit
*END hello.do
让我们运行一个该do文件,
.do hello .program hello hello already defined r(110); end of do file
出错了,为什么,因为刚才我们利用充互方式已经定义了一个同名的hello程序,因此要运行
我们的do文件,必须先将内存中的同名程序清除,利用 .program drop hello
.do hello <-我们输入的 .program hello <-Stata输入的 1. display “Hello, world” 2. end
display “Hello, world”
38
.exit end of do-file
我们执行hello.do文件时,才把程序hello调入系统,但Stata并没有执行该程序。这时,我们
在命令窗口直接输入程序名,Stata才会执行程序,如下: .hello Hello, world
我们也可以用run hello.do命令将do文件中的程序调入系统,run和do相同,但run不会将do
文件中的命令行显示出来。
方法4:do文件合并
do文件可以做更多,交互式能做的,都可以放在do文件中,因而,我们可以将program
程序定义,及程序执行全部放在同一个do文件中,比如 *BEGIN hello.do program hello end hello exit
*END hello. Do
用do hello执行该do文件,系统会提示错误,因为我们系统中刚才已经定义了hello程
序,所以要先用program drop hello清除掉, 我们可以直接在do文件中将该条命令加入第1行,但如果系统中没有hello程序,运行清除命令时又会提示出错,我们可以在清除命令前加入
capture,表示capture后面的命令出错时,Stata不会报错,也不会停下来,会直接执行后面的语句,但它会将错误保存下来。修改后的程序如下: *BEGIN hello.do capture program drop hello program hello end hello
39
display \display \
exit
*END hello. Do
方法5:ado 文件
ado文件实际上是以do文件形式写program程序方式的扩展,称为自执行文件,其运行类
似于Stata内部命令。加到文件hello.do *BEGIN hello.do program hello end
*END hello.do
直接将do文件保存为hello.ado,内容不变,即
*BEGIN hello.ado program hello end
*END hello.ado
运行该ado文件时,先用program drop hello清除系统内的hello程序,然后在命令窗口直
接输入 .hello
注意:在修改ado文件后,运行之前要用discard清除原ado文件,从而刷新ado文件,
否则你可能发现修改很多次的ado文件运行结果一直没有改变。
display \display “Hello, world”
2、do文件的组织
3、数据导入
Stata数据格式文件,直接用use 可以打开,如果是利用电子表格文件转化来的文本文件,可以使用insheet using 命令导入。如果数据具有固定格式,需要用infile命令导入。假设我们要处理一个包含家庭信息及个人信息的数据,基本数据信息如下:
40