B3. Stata 命令的语法格式

整理人:赵翔宇(中国人民大学)
邮箱

Stata 编程最基本的是要掌握 Stata 命令的语法格式,本文将从4个方面介绍 Stata 常用的语法格式。

1. Stata 的一般语法格式

首先以 summarize 命令为例,介绍其语法以说明语法的一般格式。了解语法格式可通过 help 命令,help summarize 部分结果下图。

图1 一般语法格式
  • 命令名称中的下划线部分表示该命令可以简写为 su
  • [*] 代表可选项,可加可不加
  • varlist 为变量列表,是用户设定的一个或多个变量名称
. 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时的子样本

 Variable |    Obs      Mean   Std. Dev.       Min        Max
----------+--------------------------------------------------
     wage |  1,637  8.082999   5.955069   1.004952   40.19808
  • [in] 选项:限定观察值范围

. sum wage in 1/10 // 对前10个观测的 wage 进行描述

 Variable |  Obs       Mean   Std. Dev.      Min        Max
----------+------------------------------------------------
     wage |   10   9.343055    3.89733   4.62963   17.20612
  • [, options]:其它选项。这里以 detail 选项为例介绍
. sum wage, detail  // wage 的详细信息

                         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
  • bysort 前缀:根据类别变量进行分组统计

    Stata 支持多种前缀写法,大大提高了命令的灵活性和执行效率,详见 help prefix


. 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

注意事项

逗号后为 options, 整条命令只能有一个「裸露」在外的逗号,各个选项之间无需重复添加逗号。

. sysuse nlsw88, clear

. tabstat wage hours married age, by(race) s(mean) f(%3.2f) 

Summary statistics: mean
  by categories of: race (race)

  race |  wage     hours   married       age
-------+------------------------------------
 white |  8.08     36.90      0.70     39.27
 black |  6.84     38.12      0.47     38.81
 other |  8.55     36.81      0.69     39.31
-------+------------------------------------
 Total |  7.77     37.22      0.64     39.15
--------------------------------------------

其他更具体的语法说明可通过命令 help language 查看。

2. 变量的引用

任何统计分析都是以变量为基础的,为使数据分析更加高效,熟悉引用变量非常关键。

通配符 可以使变量引用变得更简捷,以下将以系统文件 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) 查看。

5. 相关推文