B3. Stata 命令的语法格式
Stata 的语法格式具有结构清晰、层次分明的特点,强调“一句话完成一个任务”。最基本的语法格式如下:
varlist] [if] [in] [, options] command [
整条命令以逗号 ,
(半角模式) 为分界:
- 左侧用于设定变量名 (
varlist
) 和样本范围 ([if]
和[in]
); - 右侧用于设定各类选项;
- 带有
[]
标示的部分都是可选的。
Stata 的基本语法格式可以通过命令 help language
查询,详细内容见官方手册 [U] 11 Language syntax。该文档系统介绍了 Stata 命令的结构和语法规则。
对于初学者来讲,建议先熟悉 Stata 的基本语法格式和常用命令的使用方法。随着学习的深入,可以进一步了解因子变量、循环语句、前缀命令等高级语法特性。
1. Stata 的基本语法格式
为便于理解,这里先以 summarize
命令为例进行说明。在命令窗口中输入 help summarize
即可查看其帮助文件。在 Syntax 小节可以看到其语法格式如下:
其中, - 命令名称中的下划线部分表示该命令可以简写为 su
- [*]
代表可选项,可加可不加 - varlist
为变量列表,可以包含 1 个或多个变量
举例说明如下:
sysuse "nlsw88.dta", clear
. sum wage hours
.
Variable | Obs Mean Std. Dev. Min Max
----------+--------------------------------------------------
wage | 2,246 7.766949 5.755523 1.004952 40.74659 hours | 2,242 37.21811 10.50914 1 80
[if]
副指令:满足特定条件的子样本
sum wage if race==1 // 限定样本为 race==1时的子样本
sum wage if (race==1) & (union==0)
[in]
副指令:限定观察值范围
sum wage in 1/10 // 对前10个观测的 wage 进行描述
sum wage in -5/-1 // 后五个
[, options]
:其它选项。例如,在 summarize
命令后附加 detail
选项,可以显示更详细的统计信息:
summarize wage, detail
.
hourly wage
------------------------------------------------------
Percentiles Smallest
1% 1.930993 1.004952
5% 2.801002 1.032247
10% 3.220612 1.151368 Obs 2,246of Wgt. 2,246
25% 4.259257 1.344605 Sum
50% 6.27227 Mean 7.766949
Largest Std. Dev. 5.755523
75% 9.597424 40.19808
90% 12.77777 40.19808 Variance 33.12604
95% 16.52979 40.19808 Skewness 3.096199 99% 38.70926 40.74659 Kurtosis 15.85446
逗号的使用
初学者经常会错误使用逗号。Stata 的语法格式中,逗号 ,
主要用于分隔命令和选项。注意以下几点:
- 各个选项之间无需重复添加逗号。
- 逗号后为 options, 整条命令只能有一个「裸露」在外的逗号。
- 选项内部可以用逗号分隔子选项,但此时的逗号是被
()
包裹的,并未裸露在外。
例如,如下命令虽然有三个选项,但我们只需用一个逗号将这三个选项与命令分隔开,而选项之间只需用空格分隔即可:
sysuse "nlsw88.dta", clear
. tabstat wage hours married age, by(race) s(mean) f(%3.2f) .
又如,在如下绘图命令中,裸露在外的逗号后面是 title()
选项。该选项的 内部 包含一个逗号,用于分隔标题内容和子选项。
sysuse "nlsw88.dta", clear
twoway scatter wage age, ///
title("工资与年龄的关系", size(*1.5) color(red))
其他更具体的语法说明可通过命令 help language
查看。
2. 扩展语法格式
2.1 设定权重
Stata 中的多数命令都支持使用 weight=?
来设定权重,包括算数权重 (aweight)、频数权重 (fweight) 和分析权重 (pweight) 等:
varlist] [if] [in] [weight] [, options] command [
例如:
webuse "hanley", clear
regress disease rating [fweight=pop]
上例中,在用 disease 对 rating 进行回归分析时,使用了频数权重 pop
。 详情参见 Stata 手册 [U] weight 和 [U] weight estimation,以及如下推文:
- 连玉君, 2025, Stata:回归分析中的权重问题-aweight-fweight, 连享会 No.1533.
- 雷诺, 2024, 回归中的权重 [aweight]、[pweight] 如何设定, 连享会 No.1325.
- 王维怡, 2021, Stata 权重设定-fweight-pweight, 连享会 No.728.
2.2 前缀命令
Stata 提供了多种前缀命令 ([U] prefix),实现了多种便捷的操作,包括:分组统计、变量引用、因子变量处理等。最主要的作用是简化了循环语句的书写。
prefix ...: command ...
bysort 前缀
bysort
前缀用于对数据集中的变量进行分组统计或回归分析,语法格式如下:
bysort groupvar(s): command ...
其中,groupvar
是分组变量,可以是一个或多个变量。如下命令便是对婚姻状态 (married) 进行分组统计:
sysuse "nlsw88.dta", clear
. bysort married: sum wage // 分婚姻状态对 wage 描述统计
.
------------------------------------------------------------
-> married = single
Variable | Obs Mean Std. Dev. Min Max
----------+-------------------------------------------------
wage | 804 8.080765 6.336071 1.151368 40.19808
------------------------------------------------------------
-> married = married
Variable | Obs Mean Std. Dev. Min Max
----------+------------------------------------------------- wage | 1,442 7.591978 5.399229 1.004952 40.74659
再举几个例子:
sysuse "nlsw88.dta", clear
.
// 分婚姻状态和工会状态对 wage 和 hours 的均值统计
bysort married union: tabstat wage hours, s(mean) f(%3.2f)
.
// 分行业进行回归分析
bysort industry: reg wage tenure hours .
bootstrap 和 simulate 前缀
在 Stata 中,bootstrap
和 simulate
是两个常用的前缀命令,用于重复抽样与模拟估计,常用于估计参数的标准误、构建置信区间或进行 Monte Carlo 模拟。
以 bootstrap
为例,下面这段代码使用了 100 次自助法重复抽样,估计变量 age
对工资回归系数的分布:
sysuse "nlsw88.dta", clear
bootstrap beta_age = _b[age], reps(100): regress wage age hours
bootstrap
是前缀命令,表示后续的回归将在重复抽样的样本上执行;beta_age = _b[age]
指定我们关心的统计量为age
的回归系数;reps(100)
表示重复抽样 100 次;- 冒号
:
之后是要执行的主命令regress wage age hours
。
使用前缀结构的一大优势在于:我们无需手动写循环,Stata 会自动完成重复执行、提取结果和输出分布,非常适合教学和实证研究中的稳健性检验。
详情参见:
- 陈勇吏, 2020, Stata:蒙特卡洛模拟分析 (Monte Carlo Simulation)
- 李坤, 2022, Stata:蒙特卡洛模拟新命令-simulate2
- 吴雄, 童天天, 2020, Stata:Bootstrap-自抽样-自举法
其他前缀
Stata 还提供了其他一些前缀命令,如 quietly
、statsby
、rolling
等,具体用法可以通过 help prefix
([U] prefix) 查看。如下推文提供了详细的例子:
- 严子凯, 2020, 滚动吧统计量!Stata数据处理.
- 李胜胜, 2021, 滚动计算:rangerun和rangestat命令简介.
- 王俊, 2020, Stata:滚动回归的四个命令-rolling.
- 胡雨霄, 2018, statsby: 不用循环语句的循环.
3. 变量引用和变量缩写
任何统计分析都是以变量为基础的,为使数据分析更加高效,熟悉引用变量非常关键。
通配符 可以使变量引用变得更简捷,以下将以系统文件 nlsw88.dta
为例,介绍三种常用通配符。
sysuse "nlsw88.dta", clear
2.1 通配符:-
要对数据集第 2-6 个变量描述统计,常规方法:
sum age race married never_married grade
使用通配符 -
sum age-grade // 只需列出头尾两个变量
2.2 通配符:*
可代表任意字符:
sum s* // 以 s 开头的变量
.
Variable | Obs Mean Std. Dev. Min Max
---------+-------------------------------------
south | 2,246 .4194123 .4935728 0 1 smsa | 2,246 .7039181 .4566292 0 1
除此之外,*
可以放在任何位置
sum *arr* // 任何中间包含 `arr` 的变量
.
Variable | Obs Mean Std. Dev. Min Max
-------------+-------------------------------------
married | 2,246 .6420303 .4795099 0 1d | 2,246 .1041852 .3055687 0 1 never_marr~
2.3 通配符:?
?
的作用与 *
类似,但只能指代一个字符,因此较少使用。
更多详细用法,可通过命令 help varlist
([U] varlist) 查看。
3. 因子变量:变量的前缀
在回归分析时,对因子变量采用前缀(i.
)能够跳过生成虚拟变量的步骤,提高效率。
在系统数据集 nlsw88.dta
中,考虑因子变量 race
:
tab race
.
race | Freq. Percent Cum.
-------+-----------------------------------white | 1,637 72.89 72.89
black | 583 25.96 98.84
other | 26 1.16 100.00
-------+----------------------------------- Total | 2,246 100.00
考虑一个自变量包含 race
的回归分析:
// 种族和行业都是虚拟变量,省去了另生成虚拟变量的步骤。
reg wage tenure hours i.race i.industry
此外,当回归分析中需要引入交乘项 时,可以通过 #
使输入更加简捷。
reg wage tenure hours i.marr i.marr#c.hours // 交乘项
该命令等价于
// 当交乘项的两个变量也在自变量中,可用 `##` 代替这两个变量单独输入。
reg wage tenure i.marr##c.hours
注意:当交乘项为两个相同变量组成时,即为该变量的平方项。
更多详细用法,可通过命令 help fvvarlist
([U] fvvarlist) 查看。 如下推文对此也进行了详细介绍:
- 连玉君, 杨柳, 2020, Stata:因子变量全攻略, 连享会 No.160.
4. 时间序列变量的简写
假设时间序列变量 \(x_t\) (或 \(x_{it}\)),各简写命令如下表所示。
命令 | 含义 | 示例 |
---|---|---|
L. |
一阶滞后项 | \(L.x=x_{t-1}\) |
F. |
一阶前推项 | \(F.x = x_{t+1}\) |
D2. |
一阶差分项 | \(D.x = x_t - x_{t-1}\) |
D2. |
二阶差分项 | \(D2.x = (x_t - x_{t-1}) - (x_{t-1} - x_{t-2})\) |
S2. |
2 步长差分项 | \(S2.x = x_{t} - x_{t-2}\) |
利用系统数据集 sp500.dta
,可以进一步了解时间序列变量简写的应用。
sysuse "sp500.dta", clear
tsset date
gen t = _n // 生成连续变量
tsset t
gen lnP = ln(close) // 股票收盘价的对数
gen return = D.lnP // 生成收益率(一阶差分)
gen Lreturn = L.return // 前一天的收益率(一阶滞后项)
gen L2return = L2.return // 前两天的收益率(二阶滞后项)
我们可以列出前六个观察值以查验变量生成机制:
format lnP return L* %6.4f
. list date t lnP return L* in 1/6, clean noobs
.
date t lnP return Lreturn L2return
02jan2001 1 7.1572 . . .
03jan2001 2 7.2061 0.0489 . .
04jan2001 3 7.1954 -0.0106 0.0489 .
05jan2001 4 7.1688 -0.0266 -0.0106 0.0489
08jan2001 5 7.1669 -0.0019 -0.0266 -0.0106 09jan2001 6 7.1707 0.0038 -0.0019 -0.0266
在回归中,可以不产生这些变量而直接应用,例如,对于如下模型:
\[R_t = \alpha + \sum_{p=1}^{3} \beta_{p} R_{t-p} + \sum_{q=1}^{2} \beta_{q} R_{t+q} + u_t\]
相应的 Stata 命令可以简写为:
reg return L(1/3).return F(1/2).return
更多详细用法,可通过命令 help tsvarlist
([U] tsvarlist) 查看。
6. 相关推文
- 严子凯, 2020, 滚动吧统计量!Stata数据处理, 连享会 No.139.
- 徐婷, 2020, Stata:时间虚拟变量还是时间趋势项?, 连享会 No.394.
- 徐婷, 徐云娇, 2020, 傻傻分不清:时间趋势项与时间虚拟变量, 连享会 No.147.
- 李胜胜, 2021, 滚动计算:rangerun和rangestat命令简介, 连享会 No.545.
- 杨柳, 连玉君, 2020, Stata因子变量:虚拟变量-交乘项批量处理, 连享会 No.180.
- 王俊, 2020, Stata:滚动回归的四个命令-rolling, 连享会 No.487.
- 袁瑜彤, 2022, Stata:因子变量系数引用技巧-coeflegend, 连享会 No.1090.
- 连玉君, 杨柳, 2020, Stata:因子变量全攻略, 连享会 No.160.