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-6个变量描述统计,常规方法: stata sum age race married never_married grade 使用通配符 - stata sum age-grade // 只需列出头尾两个变量

  • 通配符:*

    可代表任意字符 ```stata . sum s* // 以 s 开头的变量

      Variable |        Obs        Mean    Std. Dev.       Min        Max

    ————-+——————————————————— south | 2,246 .4194123 .4935728 0 1 smsa | 2,246 .7039181 .4566292 0 1

    除此之外,`*` 可以放在任何位置
    
    ```stata
    . 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
    
  • 通配符:?

    * 类似,但只能指代一个字符,因此较少使用。

更多详细用法,可通过命令 help 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) 查看。