P1. 单值

整理人:谭睿鹏 (南京大学,)
整理人:刘雅玄 (北京大学,lyxbamboo@163.com)

P1.1 单值简介

Stata 的基本操作对象是变量,比如调入汽车价格这份数据:

. sysuse auto,clear
. browse

浏览数据窗口,每列是一个变量,每一行的观察值是常数,如红色方框中的3799。这些常数在 Stata 里被称为单值。

另外,在做基本统计分析时(summarize) ,每一个基本统计量都是一个常数,也称为单值,可以通过一系列的命令,把这些基本统计量更为有序地排列为一个表格,插入 Word 中,即为论文中常见的第一张表(基本统计量表格)。

. sysuse "auto.dta", clear
. sum price

 Variable |    Obs       Mean    Std. Dev.    Min     Max
----------+----------------------------------------------
    price |     74   6165.257    2949.496    3291   15906

在做回归分析时,表中的基本统计量如 t 值、R2 也是单值,可以通过一系列命令呈现在回归分析表格中,即为论文中常见的表 2、表 3 等。

因此,简单来讲,单值就是一些常数。在写程序时,操作对象通常是变量;但是中间计算结果有一些常数和文件,分别对应为 单值 (scalar)、暂元 (local) 和后续要介绍的 临时性文件 (tempfile) 等。

P1.1.1 定义单值:存放数字

首先,我们可以利用单值来存放数字。

我们定义单值 a,使用等号为其赋值,在 a 单值内存了数字3,可以看成一个小盒子。

使用 display 可以呈现该单值。如果要引用该单值,只需要引用其名称,如 dis b 则会自动计算出结果。

利用单值的最大好处是,我们只需知道单值的名称,每次用其名称即可引用数值,而不必记住具体何值。

scalar a = 3
scalar b = ln(a)+3^a
dis a 
dis b

P1.1.2 定义单值:存放字符串

单值不仅能存放数字,还能存放字符串。比如在 c 单值内,我们存放了 .a;在s1单值内,存放了两个单词,外加中间一个逗号和一个空格。如想提出其中的第一个单词,可以使用 substr 函数进行提取,并将该单词呈现出来。

scalar c = .a
dis c
scalar s1 = "hello, Arlion"
scalar s2 = substr(s1,1,5)
dis c
dis s1
dis s2

display 命令还是一个简单的计算器。display 命令还是一个好用的计算器,除加总求和等简单计算以外,也可以计算一些复杂的表达式。为了增加美感度,可以定义小数点后保留2位。

dis 124.3+900.2*2+15*23
dis %6.2f ln(3)+(3^4.2)/exp(2)

P1.2 执行命令后的单值结果

接下来看一些更为实用的结果,比如将执行命令后的一些基本统计量存放在单值内。

首先调入汽车价格数据,计算价格的基本统计量,进行 summarize 后呈现了五个基本统计量:样本数,平均值,标准差,最小值和最大值。

完成 summarize 后,输入return list,返回值并列示在屏幕上。屏幕中呈现出7个基本统计量,除了上午所述的5个统计量之外,还有额外的统计量如观察值的和、方差、权重求和等。关于单值的命名,我们在上文中自行定义了a、b、c等简洁的名称,这里的单值名称自动生设置为 r(N)、r(sum_W) 等。

. sysuse "auto.dta", clear
. sum price
. return list

scalars:
                  r(N) =  74
              r(sum_w) =  74
               r(mean) =  6165.256756756757
                r(Var) =  8699525.974268789
                 r(sd) =  2949.495884768919
                r(min) =  3291
                r(max) =  15906
                r(sum) =  456229

我们可以通过 r(N)r(sd) 分别来引用样本量和标准差的单值。

dis r(N)
dis r(sd)

在呈现论文的第一张表(基本统计量表格)的时候经常使用这个tabstat 命令。

在 stata 命令的选项中,可以选择很多种统计量来呈现,我们不需要用 r( ) 的形式来指明呈现何种统计量,只需要提供核心的名字(如 mean 等) 即可。如果查看帮助文件,可以看到十余种可选择的统计量。

stat 中还可以加 p25 , p50 等,用来统计第25百分位数和中位数。

tabstat price weight length mpg,stat(mean sd min max) ///
        format(%4.2f) column(stat)
    variable |      mean        sd       min       max
-------------+----------------------------------------
       price |   6165.26   2949.50   3291.00  15906.00
      weight |   3019.46    777.19   1760.00   4840.00
      length |    187.93     22.27    142.00    233.00
         mpg |     21.30      5.79     12.00     41.00
------------------------------------------------------

回归分析中也可以引用单值,如用汽车价格对汽车重量、长度、耗油量进行回归。屏幕上右上角是一些基本统计量,甚至系数也可以视为单值。敲入 e(return) 即可呈现。

. sysuse "auto.dta", clear
. reg price weight length mpg

  Source |       SS           df       MS      Number of obs   =        74
---------+----------------------------------   F(3, 70)        =     12.98
   Model |   226957412         3  75652470.6   Prob > F        =    0.0000
Residual |   408107984        70  5830114.06   R-squared       =    0.3574
---------+----------------------------------   Adj R-squared   =    0.3298
   Total |   635065396        73  8699525.97   Root MSE        =    2414.6
--------------------------------------------------------------------------
   price |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
---------+----------------------------------------------------------------
  weight |      4.365      1.167     3.74   0.000        2.036       6.693
  length |   -104.868     39.722    -2.64   0.010     -184.090     -25.646
     mpg |    -86.789     83.943    -1.03   0.305     -254.209      80.630
   _cons |  14542.434   5890.632     2.47   0.016     2793.940   26290.929
--------------------------------------------------------------------------

. ereturn list

scalars:
                  e(N) =  74
               e(df_m) =  3
               e(df_r) =  70
                  e(F) =  12.97615618434597
                 e(r2) =  .3573764422666367
               e(rmse) =  2414.562912972107
                e(mss) =  226957411.8725975
                e(rss) =  408107984.2490242
               e(r2_a) =  .3298354326494926
                 e(ll) =  -679.3516104997997
               e(ll_0) =  -695.7128688987767
               e(rank) =  4

macros:
            e(cmdline) : "regress price weight length mpg"
              e(title) : "Linear regression"
          e(marginsok) : "XB default"
                e(vce) : "ols"
             e(depvar) : "price"
                e(cmd) : "regress"
         e(properties) : "b V"
            e(predict) : "regres_p"
              e(model) : "ols"
          e(estat_cmd) : "regress_estat"

matrices:
                  e(b) :  1 x 4
                  e(V) :  4 x 4

functions:
             e(sample)   

Stata 中,对于只做统计而不回归的命令,在返回值的时候都可以使用 return list来列示 list 中存储的返回值。涉及到回归的命令,在返回值的时候则需要用 ereturn list,包括几大类:单值(scalars)、暂元(macros)等,这里我们重点关注单值,如样本数 e(N) ,R2 e(r2),调整后的R2 e(r2_a),对数似然函数值 e(ll) 等。

在回归完后,可以用 est store 命令把结果存储起来,进而使用外部命令 esttaboutreg2 统一呈现结果 (参见 专题:结果输出),非常类似于论文中看到的表格样式。表中重点的内容有如下几项,包括 scalar(下面列示的最下方的4行)。

. sysuse "auto.dta", clear
. reg price weight length mpg
. est store m1
. reg price weight length mpg foreign
. est store m2
. esttab m1 m2, scalar(N r2 r2_a F) nogap

--------------------------------------------
                      (1)             (2)   
                    price           price   
--------------------------------------------
weight              4.365***        5.716***
                   (3.74)          (5.63)   
length             -104.9*         -92.48** 
                  (-2.64)         (-2.75)   
mpg                -86.79          -13.41   
                  (-1.03)         (-0.19)   
foreign                            3550.2***
                                   (5.42)   
_cons             14542.4*         5515.6   
                   (2.47)          (1.05)   
--------------------------------------------
N                      74              74   
r2                  0.357           0.549   
r2_a                0.330           0.523   
F                   12.98           21.01   
--------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001

P1.3 一些特殊的单值

P1.3.1 系统变量

stata 还提供了一些非常特殊的单值,如系统变量、系统参数等。

系统变量基本都存储在以下划线开头的变量里面,help 文件中列示了一些最基本的系统变量,如常数项、样本标号、样本总数等。

help _variables
dis _pi   //圆周率
sysuse nlsw88,clear
dis _N  

P1.3.2 系统参数设置

Stata 的系统参数很多,可以通过 creturn list 来查看。屏幕中列示了很多内容,现阶段可以不必深究。

如:

  • c(current_date) 显示当前日期
  • c(current_time) 显示当前时间
  • c(sysdir_stata) 显示 Stata 的安装路径

还有 Stata 的版本等,都是通过特定的单值名称存储了起来。这些参数在编程序的时候非常有用,只需要相应的名称即可调用。

. creturn list

System values

    ---------------------------------------
        c(current_date) = "23 Dec 2020"
        c(current_time) = "17:05:01"

(省略……)

Directories and paths

    ---------------------------------------
        c(sysdir_stata) = "D:\stata15/"              (sysdir)
         c(sysdir_base) = "D:\stata15\ado\ba.."      (sysdir)
         c(sysdir_site) = "D:\stata15\ado\si.."      (sysdir)
         c(sysdir_plus) = "D:\stata15/ado\pl.."      (sysdir)
     c(sysdir_personal) = "D:\stata15/ado\pe.."      (sysdir)