Stata数据处理:数据框使用教程
👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:公开课-直播 | 计量专题 | 关于连享会
连享会 · 效率分析专题
作者:陈卓然 (中山大学)
邮箱:chenzhr25@mail2.sysu.edu.cn
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
目录
1. 数据框简介
2. 数据集子集
3. 数据框使用
4. 将统计结果存储在数据框中
5. 将回归结果存储在数据框中
6. 数据框之间的连接
7. 玩转 Links
8. 相关推文
1. 数据框简介
在 Stata16 以后,Stata 开始允许使用数据框。这意味着我们可以将多个数据集存储在 Stata 内存中,并对不同的数据集同时进行处理。对于经常处理单一大型数据的人来说,他们再也不用总是 preserve restore
了,也不用再将无数个数据集合并到一起,这大大提高了数据处理的效率。为了实现上述目的,我们需要学会如何使用数据框,以及如何在不同的数据框之间建立联系。
在正式开始介绍之前,我们先简单了解一下数据框。打开 Stata16 或者更高级的版本,输入以下命令,我们发现当前的数据框是 default
。这是因为在没有指定数据框前,Stata 加载的数据都会存储在名为 default 的数据框中。当然我们也可以通过命令 frames rename
,来更改数据框的名称。需要注意的是,命令 frames
和 frame
可以相互替换。
. sysuse auto, clear
. frames
(current frame is default)
. frames rename default carUS
. frames
(current frame is carUS)
2. 数据集子集
如果要对 auto.dta 数据集中的几个变量进行分析,我们可以将这几个变量放入到一个新的数据框中。例如,我们需要将变量 make、price、mpg 放入到数据框 mysubset 中,我们可以运行以下代码:
. frames put make price mpg, into (mysubset)
. frames dir
carUS 74 x 12; 1978 automobile data
* mysubset 74 x 3; 1978 automobile data
Note: Frames marked with * contain unsaved data.
. frames
(current frame is carUS)
可以看出,我们有两个数据框 carsUS 和 mysubset,当前数据框是 carUS。如果想从数据框 carUS 转换到 mysubset,我们可以使用如下命令:
. frame change mysubset
. frames
(current frame is mysubset)
如果想要对数据框 mysubset 进行分析,但不需要转换到该数据框中,我们可以运行如下命令:
. frame mysubset: des2
variable name type format value label variable label
-----------------------------------------------------------------------
make str18 %-18s Make and model
price int %8.0gc Price
mpg int %8.0g Mileage (mpg)
. frame mysubset: summ price
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
price | 74 6165.257 2949.496 3291 15906
当然,我们也可以采用循环的方式对全部变量逐个进行描述性分析,具体命令如下:
. frame mysubset {
. foreach x of varlist _all {
2. summ `x'
3. }
. }
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
make | 0
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
price | 74 6165.257 2949.496 3291 15906
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
mpg | 74 21.2973 5.785503 12 41
这个简单的小例子告诉我们,在对不同数据框进行操作时,基本语法格式为:
frame <framename> {
some stata commands
}
3. 数据框使用
数据框绝不仅仅是用来提取数据子集的,我们也可以用来拷贝原始数据:
. frames copy carUS mycarUS
. frame dir
carUS 74 x 12; 1978 automobile data
mycarUS 74 x 12; 1978 automobile data
* mysubset 74 x 3; 1978 automobile data
可以生成一个空数据框,然后加载一些新的数据到这个数据框:
. frames create otherdata
. frames otherdata: sysuse census
(1980 Census data by state)
. frame dir
carUS 74 x 12; 1978 automobile data
mycarUS 74 x 12; 1978 automobile data
* mysubset 74 x 3; 1978 automobile data
otherdata 50 x 13; 1980 Census data by state
可以清空数据框:
. * 这两个命令等价
. clear frames
. frames reset
. frame dir
default 0 x 0
如果只想清除某一个数据框,只需要输入:
. frames drop mycarUS
4. 将统计结果存储在数据框中
如果将 carUS 中每一个变量的均值和标准差存储在另外一个数据框中,并挑选出数值变量,我们需要进行如下操作:首先创建一个空数据框,并产生相关变量。
. cap frame drop sumstats
. frames create sumstats str15(variable) mean sd
然后,我们提取数值型变量,并将其均值和标准差存储在数据框 sumstats 中。
. * pick variables which are numeric
. ds, has(type numeric)
. local mylist `r(varlist)'
. * loop and store information
. foreach x of local mylist {
2. qui summ `x'
3. frame post sumstats ("`x'") (r(mean)) (r(sd))
4. }
这里使用到命令 frame post
,它的语法格式为:
frames post <framename> (var1) (var2) (var3)
在使用 frames post
的时,有两点注意事项:
frame post
中添加的变量个数一定不能超过数据框中变量个数;frame post
本质上是append
命令。这意味着在循环时,如果不及时清除数据框,那么frame post
会在同一数据框中添加数据,而不是覆盖原有数据。
5. 将回归结果存储在数据框中
首先,我们导入数据,并估计如下方程:
. frames reset
. lxhuse nlswork, clear
. xtset idcode year
. g age2 = age^2
. g black = (race == 2)
. xtreg ln_w grade age age2 tenure black south
接着,我们创建一个新的数据框 results,并生成相关变量。
. cap frame drop results
. frame create results str15(model variable) mean se
最后,我们将回归结果存储到数据框 results 中。
. * Random-effects model
. local varlist "grade age age2 tenure black south"
. xtreg ln_w `varlist', re
. foreach x in `varlist' _cons {
1. frame post results ("re") ("`x'") (_b[`x']) (_se[`x'])
2. }
. * Fixed-effects model
. xtreg ln_w `varlist', fe
. foreach x in `varlist' _cons {
2. frame post results ("fe") ("`x'") (_b[`x']) (_se[`x'])
3. }
. * Random-effects model using MLE
. xtreg ln_w `varlist', mle
. foreach x in `varlist' _cons {
2. frame post results ("mle") ("`x'") (_b[`x']) (_se[`x'])
3. }
. frame results: list
+-----------------------------------------+
| model variable mean se |
|-----------------------------------------|
1. | re grade .0733589 .001862 |
2. | re age .0517477 .0026624 |
3. | re age2 -.0006903 .0000441 |
4. | re tenure .025796 .0007288 |
5. | re black -.0354088 .010513 |
|-----------------------------------------|
6. | re south -.106246 .0075266 |
7. | re _cons -.1763739 .0443129 |
8. | fe grade 0 0 |
9. | fe age .052113 .0027815 |
10. | fe age2 -.0006673 .0000461 |
|-----------------------------------------|
11. | fe tenure .0215835 .0007989 |
12. | fe black 0 0 |
13. | fe south -.0697603 .0111167 |
14. | fe _cons .7170634 .0408609 |
15. | mle grade .0733416 .0018278 |
|-----------------------------------------|
16. | mle age .0517524 .0026673 |
17. | mle age2 -.0006914 .0000442 |
18. | mle tenure .0259506 .0007329 |
19. | mle black -.0354719 .0103123 |
20. | mle south -.1070148 .0074688 |
|-----------------------------------------|
21. | mle _cons -.1751722 .0441207 |
+-----------------------------------------+
如果我们需要提取出系数、标准差、置信区间的上下界,并放在数据框 indextest 中,我们可以借助回归后矩阵 r(table)
实现。
. xtreg ln_w grade age age2 tenure black south, re
. mat li r(table)
r(table)[9,7]
grade age age2 tenure black south _cons
b .0733589 .05174773 -.00069031 .02579596 -.03540883 -.10624599 -.17637391
se .00186197 .00266236 .0000441 .00072876 .01051301 .00752658 .04431291
z 39.398606 19.436806 -15.653408 35.397072 -3.3680966 -14.116102 -3.9801921
pvalue 0 3.769e-84 3.149e-55 1.89e-274 .00075689 3.023e-45 .00006886
ll .06970951 .04652961 -.00077675 .02436762 -.05601395 -.12099782 -.26322562
ul .07700829 .05696586 -.00060388 .0272243 -.01480371 -.09149416 -.0895222
df . . . . . . .
crit 1.959964 1.959964 1.959964 1.959964 1.959964 1.959964 1.959964
eform 0 0 0 0 0 0 0
. cap frame drop indextest
. frame create indextest str20(variable) mean sd ll ul
. local varlist "grade age age2 tenure black south"
. xtreg ln_w `varlist', re
. local i = 1
. foreach x in `varlist' _cons {
2. frame post indextest ("`x'") (r(table)[1,`i']) (r(table)[2,`i']) (r(table)[5,`i']) (r(table)[6,`i'])
3. local i = `i' + 1
4. }
. frame change indextest
. list
+---------------------------------------------------------+
| variable mean sd ll ul |
|---------------------------------------------------------|
1. | grade .0733589 .001862 .0697095 .0770083 |
2. | age .0517477 .0026624 .0465296 .0569659 |
3. | age2 -.0006903 .0000441 -.0007767 -.0006039 |
4. | tenure .025796 .0007288 .0243676 .0272243 |
5. | black -.0354088 .010513 -.056014 -.0148037 |
|---------------------------------------------------------|
6. | south -.106246 .0075266 -.1209978 -.0914942 |
7. | _cons -.1763739 .0443129 -.2632256 -.0895222 |
+---------------------------------------------------------+
6. 数据框之间的连接
数据框的连接允许我们不用将全部数据合并为一个大文件后再操作,不过 Stata 中数据框的连接暂时还不支持 1:m 型。接下来,我们将以 1:1 型的连接为例进行介绍。我们首先调入 atuo.dta 数据集,生成变量 id。然后将变量 id 存储到数据框 otherdata 中,并生成两个新变量。
. frames reset
. sysuse auto, clear
. gen id = _n
. order id
. frames put id, into (otherdata)
. frames otherdata: gen var1 = rnormal()
. frames otherdata: gen var2 = runiform()
. frame dir
* default 74 x 13; 1978 automobile data
* otherdata 74 x 3; 1978 automobile data
现在我们要将 default 和 otherdata 两个数据框按照 id 连接起来,可以使用如下命令:
. frlink 1:1 id, frame(otherdata)
(all observations in frame default matched)
. findname
id price rep78 trunk length displacement foreign
make mpg headroom weight turn gear_ratio otherdata
可以发现,我们新生成了一个变量 otherdata,这是 Stata 标识数据框连接的一个变量 (千万不要对这个变量做任何操作)。我们可以使用 frlink describe otherdata
的命令来获得连接的一些基本信息,例如何时创建,如何创建等。我们也可以定义连接的变量名,具体代码如下:
. frlink 1:1 id, frame(otherdata) generate(_link_otherdata)
尽管看上去 frlink
和 merge
很像,但是 frlink
还是有很大的优势的。例如 frlink
可以允许使用不同的标识变量名进行连接。具体地,一份数据集中标识变量为 id
,另一份数据集中的标识变量为 carid
,我们可以通过命令语句 frlink 1:1 id, frame(frame1 carid)
完成合并。
需要注意的是,数据框的连接是单方向的,即数据框 1 连接到数据框 2 并不意味着数据框 2 也连接到数据框 1。此外数据框的连接也不具有传递性,即数据框 1 连接到数据框 2,数据框 2 连接到数据框 3,这并不意味数据框 1 自动连接到数据框 3。
7. 玩转 Links
数据框之间的连接建立之后,我们可以使用 frget
的命令从另一个数据框中获取数据并操作。几个比较典型的命令有:
. * copy the variables as they are
. frget var1 var2, from(_link_otherdata)
. * copy and prefix the variables
. frget var1 var2, from(_link_otherdata) prefix(copy_)
. * generate a new variable
. frget newvar = var1, from(_link_otherdata)
我们也可以通过 frval
实现在一部分命令中交互式使用另一个数据框的数据。
. g newvar2 = price/ frval(_link_otherdata, var1)
. regress price mpg if frval(_link_otherdata, var1) < 0.5
不过,frval
不能直接用于回归当中,例如 reg price frvar(_link_otherdata, var1)
。
8. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh frame 数据处理, m
安装最新版lianxh
命令:
ssc install lianxh, replace
专题:数据分享 Stata数据处理:清洗CFPS数据库 专题:Stata教程 普林斯顿Stata教程(一) - Stata数据处理 专题:Stata命令 Stata:如何同时对多个数据框操作-frame 专题:数据处理 Stata数据处理:将字符变量编码为数值变量-encoder Stata数据处理:一月有几周?月度和周数据转换 Stata数据处理:一文搞定CEIC数据库 Stata数据处理:快来更新你的Stata-Workflow Stata数据处理:清洗中国城市建设统计年鉴 CFPS数据处理:少儿代答库与成人库匹配 Stata数据处理:批量处理被保护的年鉴数据-dxls-txls Stata数据处理:快速合并与编码-encodefrom Stata 数据处理:iefieldkit 命令介绍 Stata数据处理:缺失值与多重补漏分析(一) Stata数据处理:缺失值与多重补漏分析(二) Stata数据处理:缺失值与多重补漏分析(三) Stata数据处理:一文读懂微观数据库清理(上) Stata数据处理:一文读懂微观数据库清理(下) Stata数据处理:iebaltab和ieddtab命令介绍-T208