常用代码
数据前期处理
设置路径
* 查看当前工作路径
pwd
* 设定工作路径
cd E:\Stata\data
* 显示当前工作路径下文件
dir
循环读取并合并多个文件
ssc install fs,replace
cd "D:/filesname/"
* 遍历当前路径下的所以csv文件 返回文件名称
fs *.csv // 列出csv文件
return list
* 循环读入csv文件 存为临时dta文件
foreach file in `r(files)' {
import delimited `file', varnames(1) clear
local fn = subinstr("`file'",".csv","",.)
disp "`fn'"
save "`fn'",replace
}
clear
local files: dir "." file "*.dta"
foreach file in `files' {
append using `file'
}
读取和存储dta文件
sysuse "auto.dta", clear
keep make price mpg rep78 foreign
save "d:\data\sample.dta", replace
查看数据
list in 1/5 // 查看前五行
批量重命名
rename (old1 old2 ...) (new1 new2 ...) [,options]
查看非数值数据所在行
list Stkcd if regexm(Stkcd,"[^0-9]")
格式转换
//【字符型 --> 数值型】
// 将x1、x2 改为数值型变量,并替换之前的变量
destring x1 x2, replace
// 将x1、x2 改为数值型变量,忽略所有"NA"字符(NA 替换为缺失值),并替换之前的变量
destring x1 x2,ignore(NA) replace
// 将Trdynt 改为数值型变量,并生成一个新变量year
destring Trdynt, g(year)
**encode Indcode,gen(Industry)**
//【数值型 --> 字符型】
// 将数值型变量 x1、x2 改为字符型变量,并替换之前的变量(replace 命令)
tostring x1 x2, replace
// 面板数据 日期生成序号
sort Stkcd yq
egen t = group(yq)
重复值
查看确认为什么出现了重复值
sort Stkcd year //重复值检验和删除
by Stkcd year: gen set=_n
keep if set==1
drop set
// 查看重复值
by Stkcd year: egen count = count(Stkcd)
bro if count >= 2
// or
duplicates tag Stkcd year BM, gen(set) # 标记
直接删除重复值
duplicates drop Stkcd year, force
缺失值
* 查看
egen miss = rmiss(var1 var2)
list var1 var2 miss if miss!=0
* 替换为固定值
replace var1 = 0 if var1 == .
mvencode var1, mv(0)
* 替换为均值
egen var1mean = mean(var1)
replace var1 = varmean1 if var1 == .
* 前向/后向填充
sort Stkcd date
by Stkcd: replace var = var[_n-1] if var == .
by Stkcd: replace var = var[_n+1] if var == .
* 删除缺失值所在行
drop if var == . //单列
egen miss = rmiss(var1 var2) //多列
drop if miss
outlier处理
* 查看
graph box var // 箱形图
ssc install egenmore,replace
egen outlier = outside(var)
br x var outlier
* 处理
// 删除
egen out = outside(var)
drop if out != .
// 缩/截尾
ssc install winsor2
winsor2 var1 var2 $control,cut(1 99) replace // 缩尾
winsor2 var1 var2 $control,trim cut(1 99) replace // 截尾
sum var1 var2
筛选
keep if Markettype==1 | Markettype==4 | Markettype==16 | Markettype==32 // 保留A股
日期数据处理
https://zhuanlan.zhihu.com/p/437282746?utm_id=0
// yyyy-mm-dd(str) 转为long
destring Trdmnt,replace ignore (-)
gen time = date(Trddt,"YMD")
format time %td
gen year = year(time)
gen month = month(time)
gen ym = ym(year,month)
format ym %tm
// yyyy-mm-dd(str) -> yyyy(int)
gen year = substr(Trdwnt,1,4)
destring year, replace
// yyyy-ww
split Trdwnt, parse(-) limit(2) destring
reneme Trdwnt1 year
reneme Trdwnt1 week
// df['yq'] = pd.PeriodIndex(df.Rptdt,freq='Q') python得到2000Q1
// 2000Q1 => 200001
split yq, parse(Q) limit(2) destring
rename yq1 year
rename yq2 quarter
* 面板数据 按日期生成滞后项(以季度个股机构投资者占比数据为例)
sort yq
**egen set=group(yq)**
xtset Stkcd set
by Stkcd: gen lagInsInvestorProp = L.InsInvestorProp
其他
label variable Cdretwdeq "含现金分红" // 更改标签
drop in 1/2 //删除前两条记录
drop in -2/-1 //删除后两条记录
统计
- 分类变量单一取值对应数目
tab rating_adjust, sum(rating_adjust)
某指标近三年的标准差
参考https://bbs.pinggu.org/thread-6366434-1-1.html
rangestat (sd) divipshare earnpshare (count) divipshare earnpshare, interval(year -2 0) by(stkcd)
*replace divipshare_sd = . if divipshare_count < 3
*replace earnpshare_sd = . if earnpshare_count < 3
分组
egen med = median(wdSVIstd)
gen SVIstdhigh = (wdSVIstd>med)
egen DHJrank5 = xtile(lagDHJ), nq(5) // 5分位
每年分组
egen bm_rank = xtile(BM), nq(5) by(year)
egen size_rank = xtile(SIZE), nq(5) by(year)
按照中位数分组取0或1
bys ind: egen med = median(x)
gen d = (x > med)
每年按分位数分N组 N=5下例
ssc install egenmore
egen rank = xtile(DHJy), nq(5) by(year)
gen r_dhj = rank/5
分组求加权之和
bysort 每个月 每个分组:egen weight=pc(市值), prop
bysort 每个月 每个分组:egen ret=sum(收益率*weight)
//第一行在每个月根据每个分组内所有股票的市值算出来权重系数,第二行算出来每个月每个分组的市值加权的平均收益率
sysuse auto,clear
bys foreign:egen TotalPrice = sum(price)
list price foreign TotalPrice in 1/5
分组均值
*group是分组变量,求x的分组均值
bys group: egen m=mean(x)
滚动窗口均值
help tssmooth
- 均值
xtset Stkcd week_num
tssmooth ma w52avg = ret,window(52,1,0)
注:前n个数return其对应均值(n<=51);1:包含当期
- 加权均值
tssmooth exponential double sm2a=sales
数据合并
// 数据集纵向合并(列相同)
use domestic, clear //主数据集
append using foreign //追加数据集
// 数据集横向合并(行相同)
// 面板数据合并
merge m:1 Stkcd year using abacc.dta
keep if _merge==3
m:1 表示keyword在using文件中必须是唯一没有重复的的
1:m表示keywords在master文件中必须是唯一没有重复的,需要先在主文件中 duplicates drop id year,force后在merge
缩尾处理
ssc install winsor
winsor Turnover,gen(wturnover) p(0.01)
其他
rename time time2 // 变量重命名
drop x1 x2 // 删除指定变量
// 删除有缺失值的记录 https://bbs.pinggu.org/thread-2221024-1-1.html
egen mis = rowmiss(_all)
drop if mis
/把数值“999”转换成缺失值“.”/
mvdecode _all, mv(999)
再用drop+if删除缺失值的个案
批量删除多个字段的缺失值
drop if x1.
drop if x2.
: :
drop if x10==.
=》
egen m=rowmiss(x1-x10)
drop if m>0
// 保留变量
keep x1 x2 x3 // 保留指定变量
keep if foreign==0 // 筛选并保留指定数据所在行
// 排序
sort year // 按年份进行排序
// 生成一阶滞后
绘图
format date %td
twoway line return date
Procedure
描述性统计并输出
logout, save(mytable.doc) word replace: tabstat Y X X1 X2, stats(n mean sd min p50 max) c(s) f(%13.4f)
* c(s) 统计量在表格行中 f(%13.4f) 宽度为13个字节,保留4位小数
estpost sum wY1 wX wX1 wX2,detail
esttab using table4.rtf, cell((min(fmt(%9.4f)) mean(fmt(%9.4f)) p50(fmt(%9.4f)) max(fmt(%9.4f)) sd(fmt(%9.4f)))) nonumber nomtitle replace //保留4位小数
sum Y X X1 X2
logout,save(statistics) word: sum Y X X1 X2
相关性分析
ssc inst corsp
corsp Mretwd Cmretwdos Turnover size BM Mom,pv // 输出结果的对角线上方位Spearman 相关系数,下方为Pearson 相关系数
local varlist "y x1 x2 x3"
estpost correlate `varlist', matrix
esttab using CORRELATION.rtf, ///
unstack not noobs compress nogaps replace star(* 0.1 ** 0.05 *** 0.01) ///
b(%8.3f) p(%8.3f) title(Table 1 Panel B: Pearson correlation coefficient matrix)
*
回归
xtset stkcd year
global control "Asset Bm Roa Tbq TOP1 Lev Cf Age SOE"
reg wmretwd wturnover SF turn_SF wcmretwdos wsize wbm wmom i.Indcd i.year i.month,r
outreg2 using table12.doc,tstat alpha(0.01,0.05,0.1) word replace
reg wmretwd wturnover short_in turn_short_High turn_short_Low wcmretwdos wsize wbm wmom i.indcd i.year i.month,r
esttab using table10_1.rtf, star(* 0.1 ** 0.05 *** 0.01) ar2 label nogaps
test turn_short_High=turn_short_Low // 统一回归中的系数差异检验
回归结果输出
reg2docx 参数参考 https://www.jianshu.com/p/d0ca50ad875a
sort stkcd year
qui reg flnapply Attention i.year i.ind i.area, r
est store m1
qui reg flnapply Attention $control i.year i.ind i.area, r
est store m2
qui reg flngrant Attention i.year i.ind i.area, r
est store m3
qui reg flngrant Attention $control i.year i.ind i.area, r
est store m4
reg2docx m1 m2 m3 m4 using Result.docx, replace indicate( "Industry=*.ind" "Province=*.area" "Year=*.year") scalars(N r2_a) b(%9.4f) t(%7.2f) title(Baseline regression) mtitles("lnapply" "lnapply" "lngrant" "lngrant" )
* indicate 用Yes和No表示是否控制这些变量。其中""为通配符,"*ind"表示所有以"ind"结尾的变量
分组回归
reg wmretwd wturnover SF1 turn_SF1 MF1 wcmretwdos wsize wbm wmom i.Indcd i.year i.month if bull == 1,r
outreg2 using table13.doc,tstat alpha(0.01,0.05,0.1) word replace
reg wmretwd wturnover SF1 turn_SF1 MF1 wcmretwdos wsize wbm wmom i.Indcd i.year i.month if bull == 0,r
outreg2 using table13.doc,tstat alpha(0.01,0.05,0.1) word append
***按Firm transparency(DISP)中位数分组并检验主要系数差异****
bysort year : egen p50=pctile(DISP),p(50)
gen Analyst_Forecast =1 if DISP <=p50
replace Analyst_Forecast =2 if DISP > p50
drop p50
qui reg flnapply Attention $control i.year i.ind i.area if Analyst_Forecast==1
est store m1
qui reg flnapply Attention $control i.year i.ind i.area if Analyst_Forecast==2
est store m2
qui reg flngrant Attention $control i.year i.ind i.area if Analyst_Forecast==1
est store m3
qui reg flngrant Attention $control i.year i.ind i.area if Analyst_Forecast==2
est store m4
ssc install chowtest
chowtest flnapply Attention, group(Analyst_Forecast) restrict( $control i.year i.ind i.area)
chowtest flngrant Attention, group(Analyst_Forecast) restrict( $control i.year i.ind i.area)
reg2docx m1 m2 m3 m4 using Result.docx, append indicate("Industry=*.ind" "Province=*.area" "Year=*.year") scalars(N r2_a) b(%9.4f) t(%7.2f) title(Analyst_Forecast) mtitles("lnapply" "lnapply" "lngrant" "lngrant")
分组回归系数差异检验 suest 输出卡方值
reg wmretwd wturnover SF1 turn_SF1 MF1 wcmretwdos wsize wbm wmom i.Indcd i.month if bull == 1
est store BULL
reg wmretwd wturnover SF1 turn_SF1 MF1 wcmretwdos wsize wbm wmom i.Indcd i.month if bull == 0
est store BEAR
suest BULL BEAR
test[BULL_mean]turn_SF1 = [BEAR_mean]turn_SF1
输出回归结果
- reg
reg avg_lambda RVdos
outreg2 using lambda_Mobile3.doc,tstat alpha(0.01,0.05,0.1) word replace bdec(3) tdec(3) //系数和t值保留三位小数
reg avg_lambda dpct_MOBILE_AMOUNT
outreg2 using lambda_Mobile3.doc,tstat alpha(0.01,0.05,0.1) word append bdec(3) tdec(3)
reg avg_lambda dpct_MOBILE_VOLUME
outreg2 using lambda_Mobile3.doc,tstat alpha(0.01,0.05,0.1) word append bdec(3) tdec(3)
面板实例
use "D:\workfile\mobile and PC\code\Stata\traffic.dta"
// 以检验啤酒税将降低交通死亡率的假说为例
//* 模型设定与数据 *//
des //查看变量类型、格式和描述
xtdes //查看面板数据的特征
xtset state year //查看数据情况N、T 声明截面变量state为州,时间变量为year的面板数据
sum fatal beertax spircons unrate perinck //描述性统计
twoway (scatter fatal beertax) (lfit fatal beertax) //核心变量与被解释变量的散点图并画出回归直线
search avplot //安装
reg fatal beertax spircons unrate perinck i.year i.state //LSDV估计
avplot beertax //偏回归图-控制其他变量
avplots
xtline fatal //y变量在各州的时间序列图
//* 模型选择 *//
// PLS or FE
tab year, gen(year) //生成年份虚拟变量
xtreg fatal beertax spircons unrate perinck year2-year7,fe //估计双向固定效应
// F检验的结果可能不可靠,对三大问题进行检验
// 检验是否存在截面相关问题
ssc install xtcsd //安装
xtcsd,pes // Pesaran(2004),参数检验
xtcsd,fri // Friedman(1937),半参数检验
xtcsd,fre // Frees(1995),提供临界值,半参数检验.
* IF存在截面相关问题
ssc install xtscc
xi:xtscc fatal beertax spircons unrate perinck year2-year7 i.state
testparm _Istate* //对州虚拟变量做F检验 检验是否存在个体效应 H0 不存在个体效应
*若p=0 拒绝H0存在个体效应 使用FE
* IF不存在截面相关问题 假定存在异方差和自相关
xi:reg fatal beertax spircons unrate perinck year2-year7 i.state,cluster(state)
testparm _Istate* //对州虚拟变量做F检验
// PLS or RE
xtreg fatal beertax spircons unrate perinck year2-year7,re
* 检验误差是否存在自相关
xttest0
* if p = 0 reject H0 选择RE模型
xttestl //如果误差存在自相关 用xttest1检验随机效应更好
// FE or RE
// Hausman testl
xtreg fatal beertax spircons unrate perinck year2-year7, fe
est store FE
xtreg fatal beertax spircons unrate perinck year2-year7, re
hausman FE, sigmamore/sigmaless
*缺点 不适用于异方差情形 解决方法一如下(构造辅助回归)
//Hausman test2
quietly xtreg fatal beertax spircons unrate perinck year2 year3 year4 yearś year6 year7, re
scalar theta=e(theta)
global yandxforhausman fatal beertax spircons unrate perinck year2 year3 year4 year5 year6 year7
sort state
foreach x of varlist Syandxforhausman{
by state:egen mean`x'= mean(`x')
gen md`x' = `x'-mean`x'
gen red`x' = `x'-theta*mean`x'
}
quietly reg redfatal redbeertax redspircons
redunrate redperinck redyear2 redyear3 redyear4 redyear5 redyear6 redyear7 mdbeertax mdspircons
mdunrate mdperinck mdyear2 mdyear3 mdyear4 mdyear5 mdyear6 mdyear7, vce(cluster state)
test mdbeertax mdspircons mdunrate mdperinck mdyear2 mdvear3 mdvear4 mdyear5 mdyear6 mdyear
* if 拒绝原假设,采用FE模型。
//若误差项存在截面相关 Hausman test2失效
//Hausman test3
*xtscc BA_re aVol_re Size_re TRMS2_re TRMS_re aVol_fe Size_fe TRMS2_fe TRMS_fe
*if in_sample, lag(8)
*test aVol_fe Size_fe TRMS2_fe TRMS_fe
//基于随机效应估计的截面相关检验
xtreg fatal beertax spircons unrate perinck year2-year7,re
xtcsd,pes
xtcsd,fri
xtcsd,fre
// Hausman test3
quietly xtscc redfatal redbeertax redspircons redunrate redperinck redyear2 redyear3 redyear4 redyear5 redyear6 redyear7 mdbeertax
mdspircons mdunrate mdperinck mdyear2 mdyear3 mdyear4 mdyear5 mdyear6 mdyear7
test mdbeertax mdspircons mdunrate mdperinck mdyear2 mdyear3 mdyear4 mdyear5 mdyear6 mdyear7
* F=0,拒绝H0 选择FE
//* 报告计量结果 *//
// 截面相关检验
// 异方差检验
xtreg fatal beertax spircons unrate perinck year2-year7,fe
ssc install xttest3
xttest3 //只能在xtreg.fe或xtgls之后使用
// 自相关检验
search xtserial //安装xtserial
tab state,gen(state)
xtserial fatal beertax spircons unrate perinck state2-state48 year2-year7
** p>0.1 模型不存在自相关问题
//由于存在截面相关和异方差问题,报告由如下命令估计的结果
xtscc fatal beertax spircons unrate perinck year2-year7,fe
est store DriscollKraay //其中标准误是Driscoll-Kraay估计量是组内估计量
//如果不存在截面相关,一般最终报告由如下命令估计的结果
xtreg fatal beertax spircons unrate perinck year2-year7,fe cluster(state)
est store Rogers
**标准误是Rogers or clustered standard errors.
**在xtreg, fe命令下,用robust替换cluster(state)选项会得到相同的结果
xtreg fatal beertax spircons unrate perinck year2-year7,fe robust
est store White
//结果比较
ssc install estout
esttab DriscollKraay Rogers White using tab1.rtf,b(%9.2f)p mtitle(Driscoll-Kraay Rogers White)obslast star(* 0.1 ** 0.05 *** 0.01)compress nogap k(beertax spircons unrate perinck)
//假设Hausman test选择RE,考虑之前xtcsd命令已识别RE存在截面相关问题,我们报告可处理截面相关问题的RE的估计结果
xtscc redfatal redbeertax redspircons redunrate redperinck redyear2 redyear3 redyear4 redyear5 redyear6 redyear7
**对广义离差方程进行回归
*xtscc不能直接处理随机效应的截面相关问题
//假设Hausman test选择RE,同时还假设之前xtesd命令未发现截面相关问题,一般报告由如下命令估计的结果
xtreg fatal beertax spircons unrate perinck year2-year7,re cluster(state)
**聚类稳健的标准误:对自相关和异方差稳健
**在xtreg,re命令下,用robust替换cluster(state)选项会得到相同的结果