1.帮助
help gsw
2.快捷键
ctrl + D 是运行代码的快捷键
3.安装包
ssc install package-name //最基础的安装包的方法
findit package-name //ssc不起作用的时候就去查找包
search package-name //和findit命令差不多,不过findit强一点
4.导入操作
clear //清空stata的内存
clear all //清得干净一点
cd 文件夹路径 //定义工作台
use 某某.dta , clear //导入dta文件
doedit 某某.do //导入do文件
import excel 某某.xlsx,sheet("sheet1") firstrow allstring //导入Excel文件
5.导出操作
save "xxx.dta",replace
6.长宽面板转换
//对于宽面板数据而言,它可能变量名中含有很多乱七八糟的中文夹杂着,导致我们没法顺利完成宽转长,那么就需要先提取变量名中的特定字段作为新变量名
drop if 证券代码==“” //其实任何清洗的开头,都应该确认id代码的唯一性和数据类型准确性,这一步的目的是提出string型的id变量。
rename 每股收益*基本报告期*报币种原 ** //“*”是一个通配符,例子中的通配符有两个作用,第一个:将所有符合这样统配表达式的变量全部投进去运算;第二个,将用通配符提取的字段替换整个原字段。
ren 净资产收益率*平均报告期*年报单位 ** //ren就是rename的缩写
reshape long var_a var_b ,i(id),j(year) //宽面板转长面板
save "\\\" ,replace
7.合并数据
use table_a.dta,clear //当前的dta记作table_a
merge 1:1 id using "C:\table_b.dta" //1:1意为全合并,table_a与table_b 不分主次
merge m:1 id using "C:\table_b.dta" //m:1意为多对一合并,m指主表格table_a可能id不唯一
merge 1:m id using "C:\table_b.dta" //1:m意为一对多合并,m指辅表格table_b可能id不唯一
merge 1:1 id year using "C:\table_b.dta" //这个是多个匹配依据的实现方法
drop if _merge == double //_merge变量是merge过程的隐藏变量,此行代码剔除id非匹配观测
use table_a.dta,clear
append using table_b.dta
8.变量转换与变量计算
//字符型变量与数值型变量的转换
destring str_var,replace
tostring double_var,replace
//创建与删除
keep x
drop x
egen mean = mean(x)
egen sd = sd(x)
di ln(8)
display ln(8)
//改变数值型变量的格式
format variable %14.0g
//打标签
label variable "label"
//根据布尔条件更改某变量序列内的值
replace variable=. if variable >= 50000 //将异常值更改为缺失值
drop if variable=. //根据异常值剔除观测
9.ID唯一性
ssc install unique
duplicates tag id , gen(label) //tag 是打标签的意思
duplicates drop id,force //直接剔除重复的id
10.字符串操作
//根据内容替换内容
generate new_var = subinstr(str_var,"需要被替换的字符串","准备上位的字符串",1)
//截取字符串
generate new_var = substr(var,start_location,stop_location)
//分割字符床
split splited_var ,gen(splited)
split splited_var ,p(",") gen(splited)
11.循环的基本形式
foreach x of varlist {
gen ln`x' = ln(`x')
}
forvalue i = 1(1)20{
gen x`i'=`i'
} //1(1)20是指以1为起点,1为间隔,20为终点
12.生成虚拟变量的方法
//手搓螺旋丸
gen dummy2 = cond(variable==1,1,0)//cond意为condition,若1,则1,否则0
replace dummy2=. if variable==.
//自动生成
tab var , gen(前缀_) //tabulate,会生成n个虚拟变量
tabulate province,generate(prov) //举个例子
//自动生成(在回归中)
reg y x1 i.x2 //也就是在所需要加 i.
13.根据变量数值分位数,将样本等分
xtile new_var = old_var,nq(3) //表示要分为3分
tab new_var,gen(前缀) //可以进一步生成虚拟变量
14.分组计算
bysort var1 var2 : function
15.缩尾与截尾
ssc install winsor2
winsor2 var1 var2,replace cuts(1 99) //缩尾处理
winsor2 var1 var2,replace cuts(1 99)trim //截尾处理
16.面板差分方法
webuse pig ,clear //调用案例数据
xtset firm_id year
gen lweight=L.weight //生成新的列,而且每个id不串号
gen dweight = weight-lweight //这就算做完一阶差分了,会有缺失值
gen l2weight=L2.weight
gen d2weight = weight-l2weight//这就算是做完二阶差分了
gen d1weight=weight-L.weight//上面的代码其实是展示细节流程,而真正写代码的时候,几步可以并作一步走
gen ddweight=d.weight//这就是直接算一阶差分,都不用自己去设置减号
17.剔除组件效应
//剔除组间效应:分组计算出中位数or平均数,然后各组减去自己的中位数、平均数
bysort 分组变量 :egen medianvar=median(变量)
gen 新变量=变量-medianvar
18.暂元
local local_name "var1 var2 var3"
`local_name'
global global_name "var1 var2 var3"
$global_name
19.批量处理变量
local grains "rice wheat corn rye barley oats"
foreach x of local grains {
display "`x'"
}
20.结果窗口显示设置
set more off
set more on
21.模型检验模块
// 一、变量个数和阶数是否合适
reg y x1 x2
estat vif //看方差膨胀因子,针对多重共线性,按照经验,要求mean vif小于10
estat ic //看aic、bic准则,惩罚变量数,越小越好
estat ovtest //默认将yhat的高次项放进解释变量,尝试检验是否显著,针对遗漏变量
estat ovtest,rhs //将解释变量的高次项放进解释变量,尝试检验是否显著,针对遗漏变量
linktest //所谓 “连接检验”
以上检验都是reg之后立马run就行的。
// 二、变量是否需要做变换:Box-Cox检验
三种情形:
1)λ=1,线性变换z=y-1;
2)λ=-1,倒数变换z= 1-1/y;
3)λ=0,对数变换z= lny。
help boxcox
boxcox y x1 x2 x3,nolog //nolog表示不显示迭代过程
无法拒绝哪个原假设,就做对应的变换。
// 三、异方差检验
reg y x1 x2 x3 x4 x5
rvfplot //作残差图
**BP检验
reg
. estat hettest, iid //使用y的拟合值进行BP 检验,“hettest”表示heteroskedasticity test
. estat hettest, iid rhs //使用所有解释变量进行BP 检验
. estat hettest lnq,iid //使用变量lnq 进行BP 检验
**怀特检验
. estat imtest,white //“imtest”指information matrix test(信息矩阵检验)
// 四、自相关检验 --还是用R吧,时间序列还是用R吧
tsset year
reg y x1 x2 x3
predict yhat,r
ac yhat //自相关图
. estat bgodfrey //BG 检验
. estat bgodfrey,nomiss0 //
. wntestq e1 //Q 检验
. corrgram e1 //corrgram 进行Q 检验。
. estat dwatson //DW 统计量:
22.含交互的回归
//假如你要自己生成虚拟变量的话,手搓螺旋丸的话:
gen dummy = 1 if x1 = 30
replace dummy = 0 if x1 = 40 //列这个例子的目的是想说gen之后继续编辑该变量的值,应该转用replace
//但其实一般可以直接使用
i.x1
//进入正题
dummy##x2 //list dummy##x2 means: list dummy x2 dummy*x2
dummy#x2 //list dummy#x2 means: list dummy*x2 ,一般不用这个,会有些问题。
23.工具变量法
所模仿的原文:【毕业论文】工具变量回归、检验及结果读法 - 知乎
一、在什么场合下,能用来干嘛?
两阶段最小二乘,顾名思义,是将回归分为两个阶段进行,然后查看估计的结果。
第一阶段是使用工具变量(iv
)去做解释变量(x
)的回归;
第二阶段是用工具变量对解释变量的估计值(x'
)去对被解释变量(y
)做回归。
// 二、实现
. reg $Y $X_CON //基准回归一下
. ivregress 2sls $Y $X_CON ($X = $IV), vce(robust) first
*vce(robust):返回稳健性标准误,使用效果同可选项r
*first:展示第一阶段回归结果
假设工具变量的估计结果是良好的,但是还得需要通过工具变量的相关性和无关性检验。估计结果不好的工具变量我们不会想去使用(因为不符合我们的理论预期),但是没有通过检验的工具变量我们不能去使用(因为假设条件不成立,结果无效)。工具变量的检验主要分为两点:
1.相关性检验:即检验工具变量(iv)和核心解释变量(x)是否相关【我们希望他是相关的】。
可以通过以下代码实现:
qui ivregress 2sls $Y $X_CON ( $X = $IV ) // 检验之前需先进行回归,系统才知道对这个回归模型进行检验
estat firststage // 相关性检验 -- F 越大越好
对于结果,我们重点关注R-sq和F,一般来说,F > 10,我们可以认为工具变量和解释变量是相关的,满足假设条件。若是Prob > F的值低于0.05,但是F < 10,则认为产生若工具变量和解释变量是弱相关的,为弱工具变量。
注:弱工具变量其实并不是一个特别大的问题,只是会导致二阶段估计的时候,核心解释变量的估计系数方差增加,更不容易通过显著性检验。若在二阶段估计的时候,核心解释变量是显著的,则不用太过理会此处的弱工具变量。
2.无关性检验:即工具变量是足够外生的,和y无关。
检验的代码为:
qui ivregress2 2sls $Y $X_CON ( $X = $IV ) // 检验之前需先进行回归,系统才知道对这个回归模型进行检验
estat overid // P 越大越好
estat endogenous // P 越小越好,此为异方差稳健的DWH检验
三、读结果
二阶段回归统一需要重点关注两个点:
(1)核心解释变量的显著性
(2)核心解释变量的系数(要与基础回归同号,且变化的倍数最好小于十倍)
有些时候,为了行为和展示的方便,我们通常会将多个表格进行列排。上述的回归能够让我们比较好的看到结果,但是却并不适合直接放到文章中,因此我们需要进行些许的调整。可以使用这个编辑好的代码:
regress $Y $X $CONTROL // 得到基础回归结果
est store basic
outreg2 using "ivreg.xls", cttop(basic) tstat bdec(3) tdec(2) replace
// 一些参数和变量的设定
local tab "basic"
local iv
local vars $IV // 遍历所有工具变量
// 注意这里的命令是ivregress2而非上边的ivregress 安装方式:取消下行注释
// ssc install ivregress2 // 安装ivregress2
// 遍历所以工具变量进行回归
foreach v of local vars{
local iv `iv' `v'
ivregress2 2sls $Y $X_CON ( $X = `iv' ), first // 保存第一阶段结果
est restore first
est store fst_`v'
outreg2 using "ivreg.xls", cttop(first-`v') tstat bdec(3) tdec(2) append
ivregress2 2sls $Y $X_CON ( $X = `iv' ), first // 保存第二阶段结果
est restore second
est store snd_`v'
outreg2 using "ivreg.xls", cttop(second-`v') tstat bdec(3) tdec(2) append
local tab "`tab' fst_`v' snd_`v'"
}
esttab `tab', mtitle(`tab') replace ///
nogap compress b(%6.3f) s(N r2_a) se ///
star(* 0.1 ** 0.05 *** 0.01) ///
addnotes("*** 1% ** 5% * 10%")
补充:
//如果工具变量与内生变量的相关性很弱,会导致工具变量对内生变量的估计的系数方差很大。这时便要用有限信息最大似然法liml:
ivregress liml $y $x_con ($x=$iv),r first
//如果存在异方差,要用广义矩估计:
ivregress gmm $y $x_con ($x=$iv),r first