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 Xareg X1 X2 X3 X4 Xbreg 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     */
  • globallocal的区别
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. 临时变量和临时数据文件:tempvartempfile

在我们的数据处理过程中,会产生一些中间的临时性变量,如果随着退出 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