手把手教你用stata完成实证分析

作为一名研究生,日常研究主要用到的工具就是stata了,本科毕业论文就是用stata完成的。从一名stata小白到可以利用它完成大部分的实证研究工作,也进行了很多探索,虽然直到现在也不敢说自己对stata有多精通,但还是有一些经验可以写下来分享给完全不会stata,但又需要用到stata的萌新们。

【1】安装软件是第一步,下面这张图是stata的界面,主要包括菜单栏、工具栏、历史窗口、命令窗口、结果显示窗口、变量窗口、属性窗口。工具栏有一个红圆圈圈起来的功能,是do文件编辑器,do文件可以说是stata做实证分析的精髓了,所有的分析代码都可以放在一个do文件中。当你不知道工具栏某个功能是什么的时候,只需要把鼠标移到对应功能附件,就会显示出该功能名称。do文件编辑器的右边的两个功能是数据编辑器和数据浏览器,当你导入数据到stata的工作空间时,就可以在这两个地方看到数据了。命令窗口可以书写单句的stata代码,然后历史窗口会记录每次在命令窗口输入的代码,有时候想重新运行之前输过的代码,就可以在历史窗口点击对应的代码。

stata界面

【2】导入数据,软件安装好后,就可以开始数据处理了。导入数据的第一步要确定工作环境,把stata的工作环境转换到数据文件所在的路径下,比如说我的数据文件在桌面data文件夹下,只需要cd+路径,就可以完成。这句语句既可以写在命令窗口下,点击enter运行,也可以写在do文件编辑器中,然后选中运行,运行按钮就是点击do文件工具栏最右边被我圈红的按钮。stata代码中两个反斜杠//或者星星*可以进行单行注释,当需要多行注释时,可以这样 /*。。。。。。。。。。*/。

do文件编辑器界面

stata的数据文件都是以.dta结尾的数据文件,然后也支持导入常见的数据文件比如Excel、csv以及spss文件等,这里我介绍一下导入.dta数据和Excel数据的代码,其他格式数据导入可自行百度。每次导入数据使用clear 语句是为了清除当前stata中打开的数据,如果没有clear语句,已经打开其他数据了,再次打开就会报错,所以务必每次加上clear语句,而在导入Excel文件时,sheet("工作表")语句是为了选择工作表,而firstrow语句是表示将数据文件的第一行当作字段名,如果没有firstrow,数据文件第一行将被当作数据,所以一般也应该加上这一句,在打开Excel数据文件后,一般可以将其保存为.dta格式的数据,方便后续处理,注意保存数据的时候加上replace, 不然如果文件夹中存在同名数据,便会报错。

cd C:\Users\may\Desktop\data       //转换工作路径
*导入数据
use data_ready.dta, clear      //导入dta数据
import excel data_ready2.xlsx, sheet("Sheet1") firstrow clear //导入Excel文件数据
save data_ready2.dta, replace  //将Excel数据保存为.dta格式

【3】处理数据,导入数据后,需要进行一些初步的处理,包括更改变量名,生成一些新字段,删除重复数据,合并数据等。这里我介绍一些常用的数据处理方式。在导入数据的时候,有些本该是数值变量会变成字符类型,这时候可以使用destring 字段名,replace将其变换成数值,能正确变换的前提是该变量的值都是数字,不能存在字符。删除数据用drop,可以配合if子句删除行,也可以直接删除列。stata还可以横向合并表格,命令是merge,具体用法可用help merge 命令查看。而纵向合并数据为append 命令。如果需要分组计算字段,可以使用by和egen命令。

rename mon month        //将字段mon的名字换成month
gen agenew = age + 1    //生成一个新字段agenew等于age加1
gen year = substr(date,1,4)   //截取字符串date变量的前四位,1表示开始位置,4表示字符个数
destring year, replace     //将year字符型变量换成数值型变量,并替代原变量
gen lnorder = log(order)  //生成一个新变量lnorder等于order的对数
*按条件删除行或者删除列
drop if agenew <3  //删除年龄小于3的行
drop agenew       //删除agenew列
*横向合并数据
merge 1:1 companyID using depart.dta, update   //master表和using表都唯一
merge m:1 companyID using depart.dta, update   //master表不唯一using表唯一
merge 1:m companyID using depart.dta, update   //master表唯一using表不唯一
*纵向合并数据
append using depart.dta, force
*分组计算字段
by companyID year: egen avg_sale = mean(new_zarticle)  //求每个公司平均销售额
by companyID year: egen totalg_sale = total(new_zarticle) //求每个公司总的销售额
*设置标签label
label data "文件标签名"    //给整个文件设置标签 label data
label var varname  "变量标签名"  //给单个变量设置标签 lable var
label define labelname  1 "好" 2 "中" 3 "差"   //给变量的值设置文字标签(比如1:好;2:中;3:差)
label values varname labelname  //联系标签与变量
labelbook   //查看标签
label drop lablename //删除标签
*缩尾处理
winsor2 varlist, replace cuts(1 99)  //将极端值替换

【4】实证分析,到实证分析就是最重要的一步了,一般来说研究数据分为横截面数据和面板数据,横截面数据就是指一期数据,比如研究对象企业的一年数据,而面板数据表示研究对象的多期数据,比如公司连续五年的数据。本文以面板数据为例,横截面数据的实证分析用spss就完全足够了。首先数据处理好之后,需要进行描述性统计分析和相关性分析。此处假设因变量为y,自变量为x1及x2,控制变量为x3~x8,logout命令可将输出结果表格保存到word中,无需复制,该命令不是自带命令,需要通过search logout下载。

*设置面板数据
xtset companyID year
tab year, gen(yeardummy)   //生成年份虚拟变量
*描述性统计分析
sum y x1 x2 x3 x4 x5 x6 x7 x8
logout, save(sum) word replace: sum y x1 x2 x3 x4 x5 x6 x7 x8
*相关性分析
pwcorr y x1 x2 x3 x4 x5 x6 x7 x8, star(.01) 
logout, save(corr) word replace: pwcorr y x1 x2 x3 x4 x5 x6 x7 x8, star(.01)

面板数据回归分析一般用固定效应模型和随机效应模型,两者十分类似,只是命令最后加fe(固定效应),re(随机效应)的区别。outreg2命令和louout命令类似,也需要下载,其可将回归结果的表格直接生成word文档,并且设置显著性水平的星星个数。加上调节变量,可以直接用c.自变量##c.调节变量,这个表达式直接包括自变量、调节变量以及两者乘积。如果模型中自变量需要滞后的话,只需在变量前面加上l.。

*设置全局变量
global y "sales"
global ctrl "x3 x4 x5 x6 x7 x8" 
global years "yeardummy1 yeardummy2 yeardummy3 yeardummy4 yeardummy5" 
global ifclause "if sales !=. "    //设置过滤样本条件
*面板数据固定效应回归分析
xtreg $y $ctrl $years $ifclause, fe vce(r)
outreg2 using Result-Main.doc, alpha(0.001, 0.01, 0.05, 0.1) symbol(***, **, *, +) dec(3) replace
xtreg $y $ctrl $years x1 x2 $ifclause, fe vce(r)
outreg2 using Result-Main.doc, alpha(0.001, 0.01, 0.05, 0.1) symbol(***, **, *, +) dec(3) 
*调节效应x9