P1. 单值
整理人:谭睿鹏 (南京大学,tanruipeng652@126.com)
整理人:刘雅玄 (北京大学,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 cscalar 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*23ln(3)+(3^4.2)/exp(2) dis %6.2f
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)
分别来引用样本量和标准差的单值。
r(N)
dis r(sd) dis
在呈现论文的第一张表(基本统计量表格)的时候经常使用这个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.00weight | 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
.
of obs = 74
Source | SS df MS Number F(3, 70) = 12.98
---------+---------------------------------- F = 0.0000
Model | 226957412 3 75652470.6 Prob >
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
命令把结果存储起来,进而使用外部命令 esttab
或 outreg2
统一呈现结果 (参见 专题:结果输出),非常类似于论文中看到的表格样式。表中重点的内容有如下几项,包括 scalar(下面列示的最下方的4行)。
sysuse "auto.dta", clear
. reg price weight length mpg
. est store m1
. reg price weight length mpg foreign
. est store m2
. scalar(N r2 r2_a F) nogap
. esttab m1 m2,
--------------------------------------------
(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
--------------------------------------------statistics in parentheses
t p<0.05, ** p<0.01, *** p<0.001 *
P1.3 一些特殊的单值
P1.3.1 系统变量
stata 还提供了一些非常特殊的单值,如系统变量、系统参数等。
系统变量基本都存储在以下划线开头的变量里面,help 文件中列示了一些最基本的系统变量,如常数项、样本标号、样本总数等。
help _variables
_pi //圆周率
dis sysuse nlsw88,clear
dis _N
P1.3.2 系统参数设置
Stata 的系统参数很多,可以通过 creturn list
来查看。屏幕中列示了很多内容,现阶段可以不必深究。
如:
c(current_date)
显示当前日期c(current_time)
显示当前时间c(sysdir_stata)
显示 Stata 的安装路径
还有 Stata 的版本等,都是通过特定的单值名称存储了起来。这些参数在编程序的时候非常有用,只需要相应的名称即可调用。
creturn list
.
values
System
---------------------------------------"23 Dec 2020"
c(current_date) = "17:05:01"
c(current_time) =
(省略……)
Directories and paths
---------------------------------------"D:\stata15/" (sysdir)
c(sysdir_stata) = "D:\stata15\ado\ba.." (sysdir)
c(sysdir_base) = "D:\stata15\ado\si.." (sysdir)
c(sysdir_site) = "D:\stata15/ado\pl.." (sysdir)
c(sysdir_plus) = "D:\stata15/ado\pe.." (sysdir) c(sysdir_personal) =