1. Macro(宏、暂元)
1.1 Macro的介绍
在STATA教程中,Macro也被翻译为宏、暂元等。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为一个宏,定义宏以后,你回归的时候就可以不用多次输入。
也许你看完下面的例子并不觉得它的方便,但当你要批量计算或是与循环、通配符连用的时候,你会知道它的威力
1.2 宏的定义与调用
1.2.1 局部宏
* 1.局部宏的格式: local 宏名称 "宏内容"
local Xcontrol " X1 X2 X3 X4" / 把X1 X2 X3 X4定义为宏变量,取名为Xcontrol。
* 2. 局部宏的调用
* 调用的时候,直接输入命令 `宏名' 即可 / 注意,` 符号不是单引号' ,而是键盘上~键下面的 ` 符号。
***例子1
local Xcontrol " X1 X2 X3 X4"
reg `Xcontrol' Xa
等价于
reg Y X1 X2 X3 X4 Xa
** 例子2
sum X1 X2 X3 X4
等价于
local Xcontrol "X1 X2 X3 X4"
sum `Xcontrol'
1.2.2 全局宏
* 1.全局宏与局部宏类似,只是其作用范围为当前Stata的整个程序。
* 其格式为: global 宏名称 "宏内容"
global Xcontrol " X1 X2 X3 X4" / 把X1 X2 X3 X4定义为全局宏变量,取名为Xcontrol。
* 2. 全局宏的调用
* 调用的时候,直接输入命令 $宏名 即可 / 全局宏前面加 $ 符号
***例子(与局部宏一样,只不过全局宏的定义用global,调用则用$符号)
global Xcontrol " X1 X2 X3 X4"
reg $Xcontrol Xa
等价于
reg Y X1 X2 X3 X4 Xa
** 例子2
sum X1 X2 X3 X4
等价于
global Xcontrol "X1 X2 X3 X4"
sum $Xcontrol
2. 循环
循环是减少重复性工作的好帮收,详情请学习以下博文
3. 通配符
熟悉word查找替换的朋友都知道通配符,stata也有。常用的有? *
如你有如下变量,age agm education grade BMI weight2017 weight2018 height2017 height2018
3.1 - 符号表示从** 到 **
sum age- BMI
等价于
sum age agm education grade BMI
** 3.2 ? 为一个字符通配符
sum ag?
等价于
sum age agm
sum weight201?
等价于
sum weight2017 weight2018
** 3.3 *为多字符通配符
sum *20*
等价于
sum weight2017 weight2018 height2017 height2018
sum weight*
等价于
sum weight2017 weight2018
4.Macro、循环与通配符的联合使用
曾做个一些数据处理
有2010-2020年某国所有医疗机构开展A种诊疗的数据,其值在50-500之间,其变量名为all2010,all2011,……all2020,需统计每年诊疗次次在50-100,100-200,200-500次的机构数和该频次段内开展的A种诊疗行为的总次数。其其代码一览如下。
* 分别统计2010、2011、2012……2020统计频次在50-100次间的诊疗机构总数与诊疗行为总数(三行代码解决几十行的重复代码)
local vars " all201* "
foreach v of varlist `vars' {
sum `v' if `v' >=50 & `v' < 100
}
*分别统计2010、2011、2012……2020统计频次在100-200次间的诊疗机构总数与诊疗行为总数
local vars " all201* "
foreach v of varlist `vars' {
sum `v' if `v' >=100 & `v' < 200
}
*分别统计2010、2011、2012……2020统计频次在200-500次间的诊疗机构总数与诊疗行为总数
local vars " all201* "
foreach v of varlist `vars' {
sum `v' if `v' >=200 & `v' < 500
}
推荐资料
stata的循环