Chapter5——STATA程序
Chapter5——STATA程序
0. 创造自己的命令:与STATA互致问候
我们可以自己创造一个叫 hello 的命令,当你运行这个命令的时候,STATA就会向你问好“你好 世界”
hello //报错command hello is unrecognized
capture program drop hello //删去此前生成的hello程序
program hello //建立hello程序
display "你好 世界" //hello程序是展示“你好 世界”
end
hello
*如果想让hello程序说什么就在hello说什么
capture program drop hello
program hello
display as error "`l'"
end
hello 吃了吗?
hello 吃了,你呢?
hello 我也吃了
*说hola
capture program drop hola
program hola
di as error "`a'"
end
hola 写了没?
hola 读了没?
如果退出 stata 后还想执行这个程序,可以将这个文件存起来,最好是存在
STATA 的默认路径下,文件名为 hello.do(注意后缀为.do),退出 STATA
并重启: do hello
capture
命令用法
标准的程序中通常要加上一个灵活选择性命令capture
。意思是,如果有hello
这个命令,则执行删除命令,如果没有,则跳过这条命令,执行下一条命令。
*当再次运行该程序时,系统马上会提醒
program hello //hello already defined
capture program drop hello
program hello
display “你好,老兄”
end
hello
1. 暂元 Macros:local/global
Macro是程序中的临时变量,由Macro的名称和内容两部分组成,类似于变量名和变量值。Macro有局部宏和全局宏两种。局部宏只存在于定义它的程序之内,并且不能在其他程序中被引用;而全局宏一旦被定义,就会保留在当前Stata内存中,可以被当前STATA会话期间的其他程序所使用。
宏的方便之处之一在于,你可以在宏里面加入多个内容。尤其是你需要多次输入同一内容时,定义和调用宏是最简单的方法。比如你要做多个回归进行比较,需要reg Y X1 X2 X3 X4 Xa
,reg X1 X2 X3 X4 Xb
, reg X1 X2 X3 X4 Xc
。你可以定义X1 X2 X3
X4为一个宏,定义宏以后,你回归的时候就可以不用多次输入。
- 使用
local
来定义暂元
sysuse auto,clear
list price length weight in 1/5
local v3 "price length weight" //将price length weiht 这组字符赋给暂元名v3
*其实把"price length weight"看成一个变量,然后v3="price length weight",之后就一直用v3
list `v3' in 1/5
local cmd "list" //将list这组字符赋给暂元名cmd
`cmd' `v3' in 1/5 //等价于list price length weight in 1/5
local pre "price" //将price这组字符赋给暂元名pre
local suf "ce"
`cmd' `pre' `suf'
tab rep`=26*3' //等价于tab rep78 ,78=26*3
list price in 1/`=2*2' //等价于list price in 1/4
- 使用
global
来定义暂元
sysuse auto,clear
list price length weight in 1/5
global v3 "price lenght weight" //将price length weight这组字符赋给暂元名v3
list $v3 in 1/5 //等价于list price length weight in 1/5
global cmd "list" //将list这组字符赋给暂元名cmd
$cmd $v3 in 1/5 //等价于list price length weight in 1/5
/*暂元定义 等价于
global a "myvar" gen myvar=oldvar
gen $a=oldvar gen a=oldvar
gen a=oldvar
local a "myvar" gen myvar=oldvar
gen `a'=oldvar gen a=oldvar
gen a=oldvar
global a "newvar" gen newvar2=oldvar
global i=2
gen $a$i=oldvar
local a "newvar" gen newvar2=oldvar
local i=2
gen ``a' i'= oldvar
global b1 "newvar" gen newvar=oldva
global i=1
gen ${b$i}=oldvar
local b1="newvar" gen newvar=oldvar
local i=1
gen `b`i''=oldvar
global b1 "newvar" gen newvar=oldvar
global a "b"
global i=1<br />gen ${$a$i}=oldvar
local b1 "newvar" gen newvar=oldvar
local a "b"<br />local i=1
gen ``a'`i''=oldvar */
global
和local
的区别
capture program drop myprog
program myprog
local i="主程序局域"
global i="主程序全域"
di as txt "`i'"
di as txt "$j"
mysub
di as error "`i'"
di as error "$j"
end
capture program as mysub
program mysub
local i="子程序局域"
global i="子程序全域"
di as result "`i'"
di as result "$j"
end
myprog
在上述程序的执行过程中,首先显示主程序所定义的暂元内容。然后调用子程序,显示子程序中的命令规定的暂元内容。再回到主程序,此时在主程序中用local
所定义的暂元并没有因为子程序的重新定义或调用而改变,仍然保持着在主程序中所定义的内容,即“主程序局域”,但是由
global
所定义的全局暂元却发生了改变,变为由子程序所更新定义后的“子程序全局暂元”。
local是局部暂元,局部引用;global是全局暂元,贯穿整个代码都有效,局部暂元执行完一次命令后就失效了,而全局暂元保证stata关闭之前暂元一直存在
2. 自带命令参数
capture prog drop listargs
program listargs
di "第一个参数为:`1'"
di "第二个参数为:`2'"
di "第三个参数为:`3'"
di "第四个参数为:`4'"
end
listargs
listargs I love stata
listargs "I love stata"
local i "I love stata"
listargs `i'
listargs this is a test
listargs "this is a test"
listargs "this is" "a stata test"
- 通过参数申明的方式
capture program drop listargs
program listargs
args a b c d
di "第一个参数为:`a'"
di "第二个参数为:`b'"
di "第三个参数为:`c'"
di "第四个参数为:`d'"
end
listargs this is a test
listargs "this is a test"
3. scalar
标量
scalar a=2
dis a+2
scalar b=a+3
di b
scalar s="hello"
di s
clear
set obs 3
input a
1
2
3
end
scalar b=3
gen v1=a*b //该命令相当于对 a 的每个值乘 b
list
input b
2
3
4
end
gen v2=a*b
list
gen v3=a*scalar(b)
list
说明:当变量名和标量名相同时,STATA
将优先使用变量名,如果要强制使用标题,需要用
scalar(varlist)
,为标量变量,即存储一个数字数据的变量。
sysuse auto,clear
sum price
return list
/*scalars:
r(N) = 74
r(sum_w) = 74
r(mean) = 6165.256756756757
r(Var) = 8699525.974268788
r(sd) = 2949.495884768919
r(min) = 3291
r(max) = 15906
r(sum) = 456229*/
local mean=r(mean)
di `mean'
local sum=r(sum)
local max=r(max)
local v0 "mean sum max"
di `v0'
4.
临时变量和临时数据文件:tempvar
和tempfile
在我们的数据处理过程中,会产生一些中间的临时性变量,如果随着退出 STATA,这些临时的中间性变量能自动消失,既不会破坏原始数据,也不会因为这些干扰变量妨碍我们查看结果性的变量。
sysuse auto,clear
preserve //表明下面的代码操作将不会破坏当前数据中的文件
keep price weight
save master,replace //把只有price和weight的新临时数据文件保存
drop weight
save part1,replace //保存只有price的新临时数据文件
sysuse master,clear
drop price
rename weight price
append using part1
erase master.dta
erase part1.dta
restore //回到 preserve 命令之前的数据集,即 auto