stata数据处理–潘登同学的stata笔记
文章目录
- stata数据处理--潘登同学的stata笔记
- 数据导入、导出
- 使表格第一行成为变量标注(label)
- 数据合并
- 横向与纵向合并
- 一对多与多对一横向合并
- 缺失值处理
- 查看缺失值
- 替换缺失值
- 缺失值填充
- 离群值处理
- 取对数的方法
- 截尾处理、缩尾处理
- 分组统计
- 列表统计
- 分组回归
- egen函数做数据处理
- 其他egen函数
- 文字日期变量的处理
- 将季度数据调整为月度数据
- 抽样
- 不放回抽样
- 有放回抽样
数据导入、导出
数据导入:
import excel auto.xls, firstrow sheet(Sheet1) clear
br foreign
encode foreign, gen(Cartype2) label(foreign)
br Cartype2
label list foreign
save myauto.dta, replace //保存为 Stata 格式数据文件
firstrow
表示把 Excel 的第一行视为变量名称sheet()
中填入 Excel 中的 sheet 名称- Excel2003 文件后缀为 .xls, Excel2007 文件后缀为 .xlsx
数据导出:
sysuse auto.dta, clear
export excel auto.xls, firstrow(variables) replace //首行为变量名称
shellout auto.xls // 打开 excel 文档
export excel auto.xlsx, firstrow(varlabels) replace //首行为变量标签
shellout auto.xlsx // 打开 excel 文档
firstrow(varlabels)
:保存变量名称nolabel
:不保存变量名称
其他导入方式
help insheet //导入 -tab- 分隔的数据
help infile //导入 逗号 分隔的数据
help usespss //将 SPSS 格式的数据导入 STATA
help fdasave //Save and use datasets in FDA (SAS XPORT) format
help usesas //将 SAS 格式的数据导入 STATA
使表格第一行成为变量标注(label)
有时在Excel整理数据时,会把第一行写为变量名,第二行写为变量标注(label)。在导入Stata中时,第一行可以自动转化为变量名,但第二行标注会在导入时成为第一个标量。
foreach var of varlist * { // 对每一个变量
label variable `var' "`=`var'[1]'" // 把变量标注为第一行的内容
replace `var' = "" if _n == 1 // 把第一行改为空
destring `var' , replace // 把变量destring
}
drop in 1 // 删除第一行
数据合并
横向与纵向合并
merge 1:1 varlist using filename [, options]
varlist
表示按照哪个变量来合并
横向合并:增加变量
// 查看待合并的数据
use merge_m.dta, clear
browse
use merge_u.dta, clear
br
// 横向合并:增加变量
use merge_m.dta, clear // master dataset
merge 1:1 date using merge_u // using dataset
des
纵向合并:追加样本
use append_m.dta, clear
br
use append_u.dta, clear
br
// 纵向追加
use append_m.dta, clear
append using append_u.dta
des
一对多与多对一横向合并
多对一横向合并
merge m:1 varlist using filename [, options]
varlist
表示按照哪个变量来合并
use GTA_FS.dta,clear //上市公司财务资料, id-year, Panel
br
use GTA_basic.dta,clear //上市公司基本资料,只有 id 没有 year
br
use GTA_FS.dta, clear
merge m:1 id using GTA_basic.dta
br
_merge
变量的含义:
_merge==1
obs. from master dataset_merge==2
obs. from only using dataset_merge==3
obs. from at least both datasets
一对多横向合并
merge 1:m varlist using filename [, options]
本质上跟上面的一样,只是master dataset不同
use GTA_basic.dta, clear
merge 1:m id using GTA_FS.dta, nogen
browse
order id year
xtset id year
缺失值处理
查看缺失值
sysuse auto, clear
count if rep78==.
需要注意的是:
- 有些命令,如 sum, regress, generate 等,会自动忽略缺漏值;
- 有些命令,如 count, keep 等,则会将 “.” 视为一个无穷大的数值
使用回归的方式来标记不包含缺失值的样本(注意是样本层面,只要有一个变量缺失,整个样本就算缺失)
sysuse nlsw88.dta, clear
sum wage industry tenure hours
reg wage industry tenure hours //回归不是我本意
ereturn list
// e(sample) 如果一个样本中至少有一个变量有缺失值,则为0,变量齐全则为1
sum wage industry tenure hours if e(sample)==1
gen yes = e(sample)
sort yes
browse yes wage industry tenure hours
sum wage industry tenure hours if yes==1
keep if yes==1 // 删除缺漏值
替换缺失值
常见的缺漏值标记符号:N.A. | N/A | -99 | -97 | -9999
insheet using "D3_miss01.txt", clear
mvdecode x1 x2, mv(-97 -99 -999) // 批量替换
// 数值型缺漏值
mvdecode x1 x2, mv(-97 -99 -999) //批量替换
// 文字型缺漏值
replace x3 ="." if x3== "N/A"
replace x3 ="." if x3== "N.A."
destring x3, replace // 转换为数值变量
缺失值填充
fillmissing
语法
[bysort varlist]: fillmissing varname [if] [in], [with(with_options)]
with(any)
:最好用来填充常量变量 (constant variable),因为会任意从非缺失值中填充缺失值。如果未指定 with_options,则作为默认值;with(previous)
:使用前面的值填充当前的缺失值。如果前面的值也缺失,则当前值保持缺失状态。另外,该选项并不对数据进行排序操作,因此无论当前数据的排序如何,填充都将使用当前的排序状态来标识当前缺失值和前面的观测值;with(next)
:与 with(previous) 类似,使用后面的值填充当前的缺失值。如果后面的值也缺失,则当前值保持缺失状态。另外,该选项并不对数据进行排序操作,因此无论当前数据的排序如何,填充都将使用当前的排序状态来标识当前缺失值和后面的观测值;with(first)
:使用当前排序状态下的第一个值替换所有的缺失值。或者搭配 bysort,将使用每个组的第一个值;with(last)
:使用当前排序状态下的最后一个值替换所有的缺失值。或者搭配 bysort,将使用每个组的最后一个值;with(mean)
:使用非缺失值的平均值替换缺失值。变量类型只能为数值型 (numeric variable);with(median)
:使用非缺失值的中位数替换缺失值。变量类型只能为数值型 (numeric variable);with(min)
:使用非缺失值的最小值替换缺失值。变量类型只能为数值型 (numeric variable);with(max)
:使用非缺失值的最大值替换缺失值。变量类型只能为数值型 (numeric variable)。
clear all
input id k
id k
1 3
1 5
1 .
1 .
1 7
2 .
2 .
2 4
2 8
2 .
end
gen any = k
bys id: fillmissing any, with(any)
gen previous = k
bys id: fillmissing previous, with(previous)
gen next = k
bys id: fillmissing next, with(next)
gen first = k
bys id: fillmissing first, with(first)
gen last = k
bys id: fillmissing last, with(last)
gen mean_ = k
bys id: fillmissing mean_, with(mean_)
gen median_ = k
bys id: fillmissing median_, with(median_)
gen min = k
bys id: fillmissing min, with(min)
gen max = k
bys id: fillmissing max, with(max)
list,noobs
离群值处理
取对数的方法
sysuse nlsw88, clear
gen ln_wage = ln(wage)
histogram wage
histogram ln_wage
twoway (histogram wage, color(green)) ///
(histogram ln_wage, color(yellow))
注意:对数转换后,系数估计值的含义会发生变化,解释结果时要慎重
截尾处理、缩尾处理
截尾处理:
// 以 1th 和 99th 百分位数值为临界点
sysuse nlsw88, clear
winsor2 wage, cuts(1 99) by(collgrad) suffix(_tr) trim
sum wage*
des wage*
缩尾处理:
// *-基本原理
sysuse nlsw88, clear
sum wage, detail
replace wage=1.930993 if wage<1.930993
replace wage=38.70926 if wage>38.70926
// *-winsor2 命令
sysuse nlsw88, clear
winsor2 wage, cuts(1 99) // cuts(1 99) 选项可以省略; 会自动生成新变量 wage_w
sum wage*
des wage*
// *-一次性处理多个变量
sysuse nlsw88, clear
winsor2 wage hours tenure, cuts(1 99) replace
des wage* hours* tenure*
分组统计
列表统计
一维列表:
sysuse nlsw88.dta, clear
// *-频数列表
tabulate industry // tabulate 可以简写为 tab
// *-柱状图
graph hbar (count) idcode, over(industry) ///
blabel(bar, position(outside) format(%3.0f) ///
color(blue) size(small))
二维列表:
sysuse nlsw88.dta, clear
tab industry collgrad // 频数
tab industry collgrad, column nofreq //占比
tabplot industry collgrad , ///
bfcolor(none) horizontal barw(1) ///
percent(collgrad) subtitle(% at each industry) ///
showval(offset(0.05))
变量的统计特征:
sysuse nlsw88.dta, clear
// *-变量的统计特征
tab industry collgrad, summarize(wage) means
// *-图形呈现
graph hbar (mean) wage, over(industry) over(collgrad) ///
intensity(*0.4) scheme(s1mono) ///
blabel(bar, position(outside) format(%3.1f) ///
size(small))
分组回归
先将连续变量转换为类别变量
sysuse nlsw88, clear
sort wage
gen g_wage = group(5) //工资等分为五组
br wage g_wage
tab g_wage
做分组的描述性统计
label define g_wage_label 1 "Low" 5 "High"
label value g_wage g_wage_label
tabstat wage age married union collgrad south, ///
stat(mean) by(g_wage) format(%4.2f)
做分组回归
local x "age ttl_exp married union collgrad south c_city"
reg wage `x' if g_wage==1, robust
est store Low
reg wage `x' if g_wage==3, robust
est store Mid
reg wage `x' if g_wage==5, robust
est store High
reg wage `x' , robust
est store Full
local m "Low Mid High Full"
esttab `m', mtitle(`m') nogap s(r2 r2_a N) b(%6.3f) ///
star(* 0.1 ** 0.05 *** 0.01)
其他方法:根据分位数进行分组
// 在每个行业内部根据 33th, 66th 百分位分成三组
bysort industry: quantiles wage, gen(p_wage) nq(3)
tab p_wage
egen函数做数据处理
egen
函数是官方命令提供的函数,egenmore
是Stata 用户提供的外部函数,文子处理的利器
sysuse "nlsw88.dta", clear
// 行业中位数
bysort industry: egen wage_p50 = median(wage)
gen wage_diff = wage-wage_p50
// 行业标准差
bysort industry: egen wage_sd = sd(wage)
// 重新编码
sort industry occupation
browse industry occupation
egen indocc123 = group(industry occupation)
应用实例:计算几何加权实际汇率
E
R
R
=
∏
i
=
1
N
(
x
i
w
i
)
ERR = \prod_{i=1}^{N}(x_i^{w_i})
ERR=i=1∏N(xiwi)
其中
x
x
x是汇率,
w
w
w是权重
clear
input firm country exch export
1 1 8 60
1 2 0.03 50
1 3 10 80
2 2 0.03 68
2 4 3 80
3 2 0.03 200
3 3 10 90
3 4 3 250
3 5 1.1 120
end
计算权重
bysort firm: egen weight = pc(export), prop
list, sepby(firm)
计算EER:思路是将连乘积的问题转化为求和问题,对数化
gen lnexch = ln(exch)
gen lnexch_x_weight = lnexch*weight
bysort firm: egen sum_exch = total(lnexch_x_weight)
gen EER = exp(sum_exch)
list, sepby(firm)
其他egen函数
egen_inequal
// 生成不平等和贫困指数的函数egenmmed
// create a moving medianegenmsd
// create a moving standard deviationegenms
// create a moving sumasgen
// generates weighted average mean using an existing variable as weightegenmisc
// provide various egen functionsegenmore
// 各类新增的扩展函数ereplace
// 这个一定要介绍ewma
// calculates an exponentially weighted moving averagegtools
// provide a fast implementation of common group commandstsegen
// call an egen function using a time-series varlist
文字日期变量的处理
导入数据
clear
input str10 date str10 date_str
1967q1 "01/29/1960"
1967q2 "01/30/1960"
1967q3 "01/31/1960"
1967q4 "02/01/1960"
1968q1 "02/02/1960"
end
gen date_back1 = date(date_str, "MDY") // 转化为数字格式
format date_back1 %td //定义日期显示格式
将季度数据调整为月度数据
* 示例数据
clear
input str10 date float value
"2017-03-31" 10
"2017-06-30" 20
"2017-09-30" 30
"2017-12-31" 40
end
* 将日期格式转换为日期变量
gen date_var = date(date, "YMD")
* 按日期排序并设置为时间序列
sort date_var
tsset date_var
* 将季度数据扩展到月度
expand 3
sort date_var
scalar start_mon = mofd(date_var)
gen month = start_mon + _n - 3
* 输出结果
format month %tm
list
日期变量互转参考表
抽样
不放回抽样
随机抽样
// 生成随机数
clear
set obs 10
gen x = _n
save P4_data1.dta, replace
// *-抽取 30% 的观察值
use P4_data1, clear
browse
sample 30
// *-随机抽取 5 个观察值
use P4_data1, clear
sample 5, count
browse
分组抽样
// *-抽取 50% 的观察值 by(id)
use P4_xtdata, clear
browse
sample 50, by(id)
xtset id year
// *-抽取 50% 的观察值 by(race)
sysuse nlsw88, clear
table race
sample 50, by(race)
table race
分块抽样
// 机抽取三家公司 cluster(id)将id相同的样本合并为一个 wor 不放回抽样
use P4_xtdata, clear
browse
gsample 3, cluster(id) wor
use P4_xtdata, clear
browse
gsample 40, cluster(id) wor percent //随机抽取 40% 的公司
有放回抽样
use P4_data1.dta, clear
browse
bsample
sort x
对面板数据的有放回抽样
use P4_xtdata, clear
browse
bsample, cluster(id) idcluster(idnew)
xtset idnew year
有放回抽样的应用:bootstrap 标准误
sysuse auto, clear
bootstrap, reps(300): ///
reg price weight mpg foreign, noheader
// *-等价写法:
reg price weight mpg foreign, ///
vce(bootstrap, reps(300) seed(1357))