STATA中的Macro(宏、暂元)、通配符与循环——减少重复性的工作

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. 循环

循环是减少重复性工作的好帮收,详情请学习以下博文

foreach语句
连享会视频

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的循环

上一篇:current() macro


下一篇:Rust 的宏