B3. Stata 命令的语法格式

Stata 的语法格式具有结构清晰、层次分明的特点,强调“一句话完成一个任务”。最基本的语法格式如下:

command  [varlist] [if] [in] [, options]

整条命令以逗号 , (半角模式) 为分界:

Stata 的基本语法格式可以通过命令 help language 查询,详细内容见官方手册 [U] 11 Language syntax。该文档系统介绍了 Stata 命令的结构和语法规则。

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,246
25%     4.259257    1.344605     Sum of Wgt.     2,246

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) 等:

command  [varlist] [if] [in] [weight] [, options]

例如:

webuse "hanley", clear
regress disease rating [fweight=pop]

上例中,在用 diseaserating 进行回归分析时,使用了频数权重 pop。 详情参见 Stata 手册 [U] weight[U] weight estimation,以及如下推文:

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 中,bootstrapsimulate 是两个常用的前缀命令,用于重复抽样与模拟估计,常用于估计参数的标准误、构建置信区间或进行 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 会自动完成重复执行、提取结果和输出分布,非常适合教学和实证研究中的稳健性检验。

详情参见:

其他前缀

Stata 还提供了其他一些前缀命令,如 quietlystatsbyrolling 等,具体用法可以通过 help prefix ([U] prefix) 查看。如下推文提供了详细的例子:

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    1
never_marr~d | 2,246  .1041852  .3055687     0    1

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) 查看。 如下推文对此也进行了详细介绍:

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. 相关推文