Stata 常用技巧
Stata 是一个用于数据处理、统计分析、可视化和报告等的软件。在计量经济学、统计分析中,Stata 是一个很常用的也是最为流行的工具之一。Stata 具有很强的可扩展性,吸引了许多的用户编写程序,这使得 Stata 的社区和功能能够进一步被充实和扩展,在 Stata 上,你也可以通过自己编写命令和发布命令来简化自己的分析步骤。比如我自己编写的一键分析工具就可以通过下面的方式进行安装。
1 | . net install xwtx, from(https://gitee.com/JoakimStarr/macos/raw/master/xwtx/) replace 安装 |
Stata 的界面如下图所示,主要分为了六个区域,我在下图分别标注了区域,其中:
- 区域 1 是历史命令窗口,所以运行过的命令,都会在其中显示,左键双击历史命令,可以直接执行,单击可以将该命令复制到命令窗口,适合重复执行代码或调错的时候使用。
- 区域 2 为命令窗口,在这个地方可以直接输入命令然后执行,比如输入 help 命令,然后回车,就会显示帮助信息。
- 区域 3 为结果窗口,你在命令窗口输入的命令执行后,会在这个地方显示。
- 区域 4 为变量窗口,这个窗口显示的是当前数据集的变量信息。
- 区域 5 为属性窗口,点击一个变量,在这个区域会显示所有的属性信息,包括名称、标签、类型等。
- 区域 6 为图形操作窗口(我也不知道该不该叫这个名字),从左往右分别日志、浏览器、图形按钮(这些一般用不上),最主要的是右边的 Do-file 编辑器,用来些 Stata 的 do 命令的,这是为了可操作性,后面会讲,还有数据编辑、数据浏览,其中,数据编辑可以直接查看并编辑数据,像 Excel 一样,数据浏览则只能查看数据,不能编辑。
Stata 的使用方法
- Stata 的命令格式
Stata 中的常见命令格式为:
1 | command [varlist] [if] [in] [w] [, options] |
其中,[ ]表示该部分是可以选择的,并非一定需要,以回归命令为例,在命令窗口输入
1 | help regress |
回车后,会显示该命令的帮助信息,其中有关于命令格式的描述。结果如下图所示
其中下面这一块,表示命令格式,其中 regress 表示变量名(可简写为 reg),depvar 为因变量,indepvars 为自变量,if 为条件,in 为样本范围,weight 为权值,options 为选项。这表明改命令至少需要一个因变量,因为 depvar 并没有用[ ]报告起来,这就说明,该变量必须要要一个变量,否则就会报错。
1 | regress depvar [indepvars] [if] [in] [weight] [, options] |
我们以 Stata 自带的 auto 为例,尝试一下各种情况:
1 | . sysuse auto, clear # 导入数据 |
导入数据后,你会发现,区域 4 多了几个变量名,如下图所示。可以通过点击每个变量查看该变量的属性,在属性窗口查看。
接下来输入 reg 命令,我们尝试各种情况试试:
1 | . reg #什么变量都不传入 |
可以发现,当没有传入必须传入的变量时候,命令会保报错,但需要注意,当你执行过一次 reg 后,再单独执行 reg 会默认执行上一次的回归任务,可以自行尝试一下。当只输入因变量后,默认返回因变量的均值。
可以通过下列命令查看因变量的均值信息,与上面的结果进行对比:
1 | . sum price |
- 其中,Mean 就是均值,Obs 为样本数,Std. dev.为标准差,Min、Max 分别为最小最大值。
可以发现,Mean 为 6165.257,与上述只输入因变量的结果一致,这也从另一方面说明了,线性回归其实是在给定$X_i$的时候,预测$Y_i$的均值或期望值,即$E(Y_i | X_i)$
也有什么参数都不需要输入的命令,比如 cls,即清除结果窗口内容的命令,通过输入 help cls 命令,可以发现就只有很简单的几行:
1 | Syntax |
命令窗口
命令窗口可以直接输入命令,回车执行,适合一些简单的命令,比如回归分析(reg、xtreg 等),查看描述性统计(sum),查看变量类型等。
例如可以通过下列命令查看数据结构,还是以 auto 数据为例:
1 | . describe # 不填写变量默认全部变量(简写为 desc) |
其中,Variable name 为变量名,Storage type 为变量类型,Display format 为显示格式,Value label 为值标签,Variable label 为变量标签。
变量类型
变量类型是变量在内存中的 存储格式 (二进制如何解释数据),主要有以下几种。往大方向说,其实 Stata 只存在两种格式,即数值和字符串,在 Stata 中,也可以通过数据浏览器查看,其中红色的为字符串,其他的就是数值类型。| 类型 | 说明 | 示例值 |
| ————- | ———————————————— | ————————- |
| byte | 整数(-127 到 127) | 0, 1, -10 |
| int | 整数(-32,767 到 32,767) | 1000, -200 |
| long | 大整数(±20 亿) | 3000000000 |
| float | 单精度浮点数(约 7 位有效数字) | 3.14159 |
| double | 双精度浮点数(约 15 位有效数字) | 3.141592653589793 |
| str# | 字符串(#为长度) | “Male”, “北京” |
以 auto 数据库为例,其中 make 变量就是字符串格式,foreign 是编码格式,虽然使用字符串显示的,但实际是分类变量,即数值,通过上面也可以看到,foreign 所对应的 type 为 byte而非 str。
显示格式
显示格式主要控制变量在界面中的显示样式,但不改变实际存储值,主要有下列格式,具体的可以通过help format命令查看完整信息。| 格式 | 用途 | 示例显示 |
| ——————— | ———————————— | ——————- |
|%8.0g| 通用数值(8字符宽) | 42, -3.14e+10 |
|%8.2f| 固定小数位(2位) | 123.45 |
|%8.0gc| 带千分位分隔符 | 1,234 |
|%-12s| 左对齐字符串(12字符宽) | “Hello “ |
|%tdDD-Mon-YY| 日期格式 | 15-Jan-23 |
Do-file 使用方法
命令窗口、历史窗口和结果窗口的内容往往在 Stata 关掉后就会消失,当你再打开一个 Stata 后,经常会发现你辛辛苦苦写的命令直接消失了,然后你又得重新写。或者是你在你的电脑上做好后,想要换一台电脑或者在别人电脑上可以复现,那么直接在命令窗口写命令就不是一个好的选择了,那么这个时候,就需要使用 do 命令了。
在Stata中,do文件(以.do为后缀的脚本文件)是包含一系列Stata命令的可执行脚本,用于自动化执行数据分析流程。
可以通过区域 6 中的 do-file 编辑器打开,如下图所示。
)
点击后,会跳出一个类似文本框的界面。如下图所示。
)
在这个内容中,顶部右侧有几个按钮,分别为打开 do 文件,保存 do 文件以及打印do 文件,查找功能是对于 do 文件中的关键字查询,和 word 的查找功能类似,最主要的是最右边的执行按钮,在没有选中命令的情况下,点击可以实现整个 do 文件的执行。
例如,我们在 do 文件中写入以下代码,以实现自动导入 auto 文件夹,自动查看变量类型和回归分析。1
2
3
4
5sysuse auto, clear
describe
reg price weight
写入后,点击执行按钮,会发现它会自动的实现整个文件写入的命令。然后将其保存,把这个文件放在任何一台电脑上的 Stata 中,点击执行,会实现同样的效果。这就可以保证可复制性和处理过程了。
但是新问题是,若我不想执行整个文件,我只想执行文件中的某行命令或者某几行命令怎么办呢,不可能将其复制到命令窗口执行吧,一次两次还好,多了就会显得很麻烦。
Stata 提供了一种方法,就是选中一行或几行的命令,在点击执行按钮,可以只允许执行选择的命令,例如上述的命令中,我们已经导入了 auto 数据库了,那么我们只想做一次回归,就可以只选择reg price weight,然后再点击执行按钮。选中后,大概如下图所示。
Tips: Windows 中可以直接按 Ctrl + D快捷键实现点击执行动作,Mac中可以按 Command + shift + D快捷键。
需要注意的是,do 文件的执行顺序是从上往下,也就是说,必须上面一行的命令执行成功后,才会执行下面一行,否则,将不会继续执行下去。如,上图中,describe报错,那么reg 回归命令将不会被执行。
Stata常用命令
| 命令 | 作用 | 示例 |
|---|---|---|
| 基础操作 | ||
use |
加载数据集 | use "data.dta", clear |
save |
保存数据集 | save "new_data.dta", replace |
describe |
查看变量信息 | describe price mpg |
list |
列出数据 | list make price in 1/5 |
| 数据清洗 | ||
generate |
生成新变量 | gen ln_price = log(price) |
replace |
修改变量值 | replace price = . if price <= 0 |
drop |
删除变量/观测 | drop if missing(income) |
rename |
重命名变量 | rename oldvar newvar |
destring |
字符串转数值 | destring income_str, gen(income_num) ignore(",") |
| 统计分析 | ||
summarize |
描述统计 | sum price weight, detail |
tabulate |
频数表 | tabulate foreign, plot |
correlate |
相关系数矩阵 | corr price mpg weight |
ttest |
t检验 | ttest price, by(foreign) |
anova |
方差分析 | anova price foreign##mpg |
| 回归模型 | ||
regress |
线性回归 | reg price weight mpg, robust |
logit/probit |
二元选择模型 | logit y x1 x2, or |
xtreg |
面板回归 | xtreg y x1 x2, fe |
reghdfe |
多维固定效应回归 | reghdfe y x1 x2, absorb(id year) |
ivregress |
工具变量回归 | ivregress 2sls y x1 (x2 = z1 z2) |
| 可视化 | ||
histogram |
直方图 | hist price, freq normal |
scatter |
散点图 | scatter price weight, mlabel(make) |
twoway |
组合图形 | twoway (scatter price mpg) (lfit price mpg) |
graph export |
导出图形 | graph export "plot.png", width(1000) replace |
| 编程扩展 | ||
foreach |
循环语句 | foreach var in price mpg { summarizevar’ }` |
if/else |
条件语句 | if price > 10000 { gen luxury = 1 } else { gen luxury = 0 } |
program |
自定义程序 | program mycmd args x y { regx’ y' } |
| 输出结果 | ||
eststo/esttab |
存储/输出回归结果 | eststo: reg y x1esttab using "result.rtf", replace |
