最新stata回归分析完整步骤吐血推荐Word下载.docx
《最新stata回归分析完整步骤吐血推荐Word下载.docx》由会员分享,可在线阅读,更多相关《最新stata回归分析完整步骤吐血推荐Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
des后面可以加任意个变量名,只要数据中有。
它报告变量的存储的类型,显示的格式和标签。
标签中一般记录这个变量的定义和单位。
list报告变量的观察值,可以用if或in来限制范围。
所有这些命令都可以后面不加任何变量名,报告的结果是正在使用的数据库中的所有变量的相应信息。
说起来苍白无力,打开stata亲自实验一下吧。
顺带说点儿题外话。
除了codebook之外,上述统计类的命令都属于r族命令(又称一般命令)。
执行后都可以使用returnlist报告储存在r()中的统计结果。
最典型的r族命令当属summarize。
它会把样本量、均值、标准差、方差、最小值、最大值、总和等统计信息储存起来。
你在执行su之后,只需敲入returnlist就可以得到所有这些信息。
其实,和一般命令的return命令类似,估计命令(又称e族命令)也有ereturn命令,具有报告,储存信息的功能。
在更复杂的编程中,比如对回归分解,计算一些程序中无法直接计算的统计量,这些功能更是必不可少。
检查数据时,先用codebook看一下它的值域和单位。
如果有-9,-99这样的取值,查一下问卷中对缺失值的记录方法。
确定它们是缺失值后,改为用点记录。
命令是replace(变量名)=.if(变量名)==-9。
再看一下用点记录的缺失值有多少,作为选用变量的一个依据。
得到可用的数据后,我会给没有标签的变量加上注解。
或者统一标签;
或者统一变量的命名规则。
更改变量名的命令是ren(原变量名)空格(新变量名)。
定义标签的命令是labelvar(变量名)空格”(标签内容)”。
整齐划一的变量名有助于记忆,简明的标签有助于明确变量的单位等信息。
如果你需要使用通过原始变量派生出的新变量,那么就需要了解gen,egen和replace这三个命令。
gen和replace常常在一起使用。
它们的基本语法是gen(或replace)空格(变量名)=(表达式)。
二者的不同之处在于gen是生成新变量,replace是重新定义旧变量。
虚拟变量是我们常常需要用到的一类派生变量。
如果你需要生成的虚拟变量个数不多,可以有两种方法生成。
一种是简明方法:
gen空格(变量名)=((限制条件))[这外面的小括弧是命令需要的,里面的小括弧不是命令需要的,只是说明“限制条件”并非命令]。
如果某个观察满足限制条件,那么它的这个虚拟变量取值为1,否则为0。
另一种要麻烦一点。
就是
gen(变量名)=1if(取值为一限制条件)
replace(相同的变量名)=0if(取值为零的限制条件)
两个方法貌似一样,但有一个小小的区别。
如果限制条件中使用的变量都没有任何缺失值,那么两种方法的结果一样。
如果有缺失值,第一种方法会把是缺失值的观察的虚拟变量都定义为0。
而第二种方法可以将虚拟变量的取值分为三种,一是等于1,二是等于0,三是等于缺失值。
这样就避免了把本来信息不明的观察错误地纳入到回归中去。
下次再讲如何方便地生成成百上千个虚拟变量。
大量的虚拟变量往往是根据某个已知变量的取值生成的。
比如,在某个回归中希望控制每个观察所在的社区,即希望控制标记社区的虚拟变量。
社区数目可能有成百上千个,如果用上次的所说的方法生成就需要重复成百上千次,这也太笨了。
大量生成虚拟变量的命令如下;
ta(变量名),gen((变量名))
第一个括号里的变量名是已知的变量,在上面的例子中是社区编码。
后一个括号里的变量名是新生成的虚拟变量的共同前缀,后面跟数字表示不同的虚拟变量。
如果我在这里填入d,那么,上述命令就会新生成d1,d2,等等,直到所有社区都有一个虚拟变量。
在回归中控制社区变量,只需简单地放入这些变量即可。
一个麻烦是虚拟变量太多,怎么简单地加入呢?
一个办法是用省略符号,d*表示所有d字母开头的变量,另一法是用破折号,d1-d150表示第一个到第150个社区虚拟变量(假设共有150个社区)。
还有一种方法可以在回归中直接控制虚拟变量,而无需真的去生成这些虚拟变量。
使用命令areg可以做到,它的语法是
areg(被解释变量)(解释变量),absorb(变量名)
absorb选项后面的变量名和前面讲的命令中第一个变量名相同。
在上面的例子中即为社区编码。
回归的结果和在reg中直接加入相应的虚拟变量相同。
生成变量的最后一招是egen。
egen和gen都用于生成新变量,但egen的特点是它更强大的函数功能。
gen可以支持一些函数,egen支持额外的函数。
如果用gen搞不定,就得用egen想办法了。
不过我比较懒,到现在为止只用用取平均、加和这些简单的函数。
有的时候数据情况复杂一些,往往生成所需变量不是非常直接,就需要多几个过程。
曾经碰到原始数据中记录日期有些怪异的格式。
比如,1991年10月23日被记录为19911023。
我想使用它年份和月份,并生成虚拟变量。
下面是我的做法:
genyr=int(date)
genmo=int((data-yr*10000)/100)
tayr,gen(yd)
tamo,gen(md)
假设你已经生成了所有需要的变量,现在最重要的就是保存好你的工作。
使用的命令是save空格(文件名),replace。
和前面介绍的一样,replace选项将更新你对数据库的修改,所以一定要小心使用。
最好另存一个新的数据库,如果把原始库改了又变不回去,就叫天不应叫地不灵了。
前面说的都是对单个数据库的简单操作,但有时我们需要改变数据的结构,或者抽取来自不同数据库的信息,因此需要更方便的命令。
这一类命令中我用过的有:
改变数据的纵横结构的命令reshape,生成退化的数据库collapse,合并数据库的命令append和merge。
纵列(longitudinal)数据通常包括同一个行为者(agent)在不同时期的观察,所以处理这类数据常常需要把数据库从宽表变成长表,或者相反。
所谓宽表是以每个行为者为一个观察,不同时期的变量都记录在这个观察下,例如,行为者是厂商,时期有2000、2001年,变量是雇佣人数和所在城市,假设雇佣人数在不同时期不同,所在城市则不变。
宽表记录的格式是每个厂商是一个观察,没有时期变量,雇佣人数有两个变量,分别记录2000年和2001年的人数,所在城市只有一个变量。
所谓长表是行为者和时期共同定义观察,在上面的例子中,每个厂商有两个观察,有时期变量,雇佣人数和所在城市都只有一个,它们和时期变量共同定义相应时期的变量取值。
在上面的例子下,把宽表变成长表的命令格式如下:
reshapelong(雇佣人数的变量名),i((标记厂商的变量名))j((标记时期的变量名))
因为所在城市不随时期变化,所以在转换格式时不用放在reshape
long后面,转换前后也不改变什么。
相反地,如果把长表变成宽表则使用如下命令
reshapewide(雇佣人数的变量名),i((标记厂商的变量名))j((标记时期的变量名))
唯一的区别是long换成了wide。
collapse的用处是计算某个数据库的一些统计量,再把它存为只含有这些统计量的数据库。
用到这个命令的机会不多,我使用它是因为它可以计算中位数和从1到99的百分位数,这些统计量在常规的数据描述命令中没有。
如果要计算中位数,其命令的语法如下
collapse(median)((变量名)),by((变量名))
生成的新数据库中记录了第一个括号中的变量(可以是多个变量)的中位数。
右面的by选项是根据某个变量分组计算中位数,没有这个选项则计算全部样本的中位数。
合并数据库有两种方式,一种是增加观察,另一种是增加变量。
第一种用append,用在两个数据库的格式一样,但观察不一样,只需用append空格using空格(文件名)就可以狗尾续貂了。
简单明了,不会有什么错。
另一种就不同了,需要格外小心。
如果两个数据库中包含共同的观察,但是变量不同,希望从一个数据库中提取一些变量到另一个数据库中用merge。
完整的命令如下:
use
(文件名)
[打开辅助数据库]
sort(变量名)
[根据变量排序,这个变量是两个数据库共有的识别信息]
save(文件名),
replace
[保存辅助数据库]
[打开主数据库]
[对相同的变量排序]
merge(变量名)using(文件名),keep((变量名))
[第一个变量名即为前面sort后面的变量名,文件名是辅助数据库的名字,后面的变量名是希望提取的变量名]
ta
_merge
[显示_merge的取值情况。
_merge等于1的观察是仅主库有的,等于2的是仅辅助库有的,等于3是两个库都有的。
]
dropif
_merge==2
[删除仅仅来自辅助库的观察]
drop
merge
[删除_merge]
[将合并后的文件保存,通常另存]
讲到这里似乎对于数据的生成和处理应该闭嘴了。
大家可能更想听听估计、检验这些事情。
但我并不想就此止住,因为实际中总是有一些简单套用命令无法轻易办到的特殊要求。
此时至少有两条路可以通向罗马:
一是找到更高级的命令一步到位;
二是利用已知简单命令多绕几个圈子达到目的。
下面讲一个令我刻骨铭心的经历,这也是迄今我所碰到的生成新数据中最繁复的了。
原始数据中包含了可以识别属于同一个家庭中所有个人的信息和家庭成员与户主关系的信息。
目的是利用这些信息建立亲子关系。
初步的构想是新数据库以子辈为观察,找到他们的父母,把父母的变量添加到每个观察上。
我的做法如下:
a1,clear
[打开全部样本数据库]
keepif
gender==2&
agemos>
=96&
a8~=1&
line<
10
[保留已婚的一定年龄的女性]
replacea5=1if
a5==0
[变量a5标记和户主的关系。
等于0是户主,等于1是户主的配偶。
这里不加区分地将户主及其配偶放在一起。
keepifa5==1|a5==3|a5==7
[保留是户主(=1),是户主的子女(=3),或是户主的儿媳(=7)的那些人。
renh
hf
[将所需变量加上后缀f,表示女性]
renline
lf
sortwavehhid
save
b1,replace
[排序并保存]
a5f==1
[留下其中是户主或户主配偶的]
b2,replace
[保存]
useb1,clear
keepifa5f==3|a5f==7
b3,replace
[留下其中是户主女儿或儿媳的并保存]
a3,clear
[打开与户主关系是户主子女的儿童数据库]
mergewavehhidusingCHNS01b2,keep(hflf)
ta_merge
dropif_merge==2
sorthhidline
wave
[处理两代户,将户主配偶女性库与儿童库合并]
byhhidlinewave:
egenx=count(id)
dropx
[计算每个年份家庭匹配的情况,x只取值1,表明两代户匹配成功]
b4,replace
a4,clear
[打开与户主关系是户主孙子女的儿童数据库]
mergewavehhidusingCHNS01b3,keep(a5fa8fschfa12fhfagemosf
c8flf)
[处理三代户,将户主女儿或儿媳女性库与孙子女儿童库合并]
sorthhidlinewave
gena=agemosf-agemos
a<
216&
x==3
[计算每个年份家庭匹配的情况,x不只取1,三代户匹配不完全成功。
删除不合理的样本,标准是年龄差距和有三个可能母亲的那些家庭。
genxx=x[_n+1]
genxxx=x[_n-1]
geny=lfifx==1
replacey=lf[_n+1]ifx==2&
xx==1
replacey=lf[_n-1]ifx==2&
xxx==1
keepifx==1|(lf==y&
x==2)
[对于有两个可能母亲的儿童,有相同编码的女性出现两次的情况。
上面的做法是为了保证不删除这部分样本。
dropaxxxxxxy_merge
b5,replace
[保存合并后的数据库]
[对男性数据的合并完全类似,不赘述。
logclose
exit,clear
我的方法是属于使用简单命令反复迂回地达到目的那一类的,所以非常希望有更简便的方法来替代。
不过做实证时往往不是非常追求程序的漂亮,常常也就得过且过了。
stata强大的功能体现在它可以方便地回归微观数据。
而回归也是微观实证中最重要的方法。
下面就开始讲stata中和回归有关的常用命令。
基本回归方法有两种:
线性设定下的最小二乘法(OLS)和两阶段最小二乘法(2SLS)。
他们在实证分析中应用广泛,十分详细地掌握这两种方法是实证研究的基本要求。
讲解的顺序是先依次介绍如何在stata中实现OLS和2SLS估计,然后再分析如何在实际问题中选择合理的方法。
后一部分受JoshuaAngrist教授的影响很大,因此,在后面引用他的思想时会详细注明。
假设你已经清楚地了解待估计方程的形式,那么回归命令的基本格式就十分简单明了:
reg(被解释变量)(解释变量1)(解释变量2)……
方程中的相应变量可以简单地放在reg的后面。
执行上面的命令后,stata会出现两个表格,分别报告一些方差分析和回归的参数估计结果。
我们最关心的是参数的大小和显著性,这在第二个表格中列出。
表格的最左边一栏列出了解释变量,在它的右边是相应的系数估计值,然后依次是估计值的标准误,t比率,原假设为系数的真实值等于零时错误地拒绝该假设的概率——p值,以及该估计值的置信度为(1-5%)的置信区间。
我看到回归结果的第一眼是瞄着最关心的解释变量的符号、大小和显著性。
看看解释变量影响的方向和大小是不是符合理论的预期,是不是合乎常识,以及这个估计值是不是显著。
标记显著性的统计量是t统计量,在经典假设下,它服从t分布。
t分布和标准正态分布形状很相似,但它的“尾巴”要比标准正态分布的“肥”一些,在样本量比较小的时候尤其明显,当样本量趋于无穷时,t分布的极限分布是标准正态分布。
大家对标准正态分布的分布函数上一些关键点比较熟悉,比如,1.96是97.5%的关键点,1.64是95%的关键点,所以,我们希望知道什么时候可以安全地使用标准正态分布。
下表列出了一些小自由度下二者的差异(Beyer1987“CRCStandardMathematicalTables,28thed.”;
Goulden1956“MethodsofStatisticalAnalysis,2nded.”)。
可以看出,自由度超过一百时,二者的差别就已经相当小了。
所以,当样本量的数量级是100个或以上时,可以直接认为t比率服从标准正态分布,并以此做检验。
90%95%97.5%99.5%
13.077686.3137512.706263.6567
21.885622.919994.302659.92484
31.637742.353363.182455.84091
41.533212.131852.776454.60409
51.475882.015052.570584.03214
101.372181.812462.228143.16927
301.310421.697262.042272.75000
1001.290071.660231.983972.62589
1.281561.644871.959992.57588
读者读到这里可能会笑话我了,stata不是已经报告了t检验的p值和置信区间了吗?
为什么不直接察看这些结果呢?
原因在于实证文献往往只报告参数的估计值和标准误,需要读者自己将估计值和标准误相除,计算显著性。
而且当你在写实证文章时,也应该报告参数的估计值和标准误。
这比报告估计值和它的p值更规范。
伴随回归命令的一个重要命令是predict。
回归结束后,使用它可以得到和回归相关的一些关键统计量。
语法如下:
predict(新变量名),(统计量名)
这里的统计量名是一些选项。
常用的选项有:
xb(回归的拟合值。
这是默认选项,即不加任何选项时,predict赋予新变量前一个回归的拟合值。
);
residuals(残差);
leverage(杠杆值)。
下面具一个例子来解释predict的用法。
有时样本中的一个特别的观察值会显著地改变回归结果。
这样的观察值可以笼统地分为三类:
outliers,leverage和influence。
Outliers是针对残差而言的,指那些回归中残差很大的观察;
leverage是针对解释变量而言的,是解释变量相对其平均值偏里很大的观察;
influence是针对估计结果而言的。
如果去掉这个观察会明显地改变估计值,那么这个观察就是一个influence。
Influence可以看作outliers和leverage共同作用的结果。
异常观察可能是由于样本的特性,也可能是因为录入错误。
总之,我们希望找到它们。
回归后的predict命令可以发现这些异常观察(命令来自UCLA的“RegressionwithStata”第二章)。
发现outliers,leverage和influence的命令如下:
predictrs,rstudent
predictl,leverage
predictcsd,cooksd
predictdf,dfits
这些统计量都有相应的关键值。
当统计量(或其绝对值)超过关键值时就应该仔细检查相应的观察,确认是否属于录入错误。
rstudent是用来发现outliers的统计量,其关键值是2,2.5和3。
leverage是用来发现leverage的统计量,其关键值是(2k+2)/n,其中k解释变量的个数,n是样本量。
Cooksd和DFITS是探测influence的统计量。
它们都综合了残差和杠杆的信息,而且二者非常类似,只是单位不同,因而给出的结果也差不多。
Cooksd的关键值是4/n。
DFITS的关键值是2*sqrt(k/n)。
(续)
在使用最小二乘法估计时,两个通常被质疑的问题是数据是否存在多重共线性和异方差。
多重共线性是指解释变量之间的相关性。
通常我们假设解释变量之间是相关的,而且允许解释变量存在相关性,并控制可以观察的因素正是OLS的优点。
如果把多重共线性看作一个需要解决的问题,那么需要把它解释为相关性“较大”。
这样,变量之间没有相关性不好,相关性太大也不好,优劣的分割真是颇费琢磨。
而且多重共线性并没有违反任何经典假定,所以,这个问题没有很好的定义。
本质上讲,在样本给定时,多重共线性问题无法解决,或者说它是一个伪问题。
先看一下为什么解释变量之间的相关性大会有问题。
在OLS回归的经典假设(除正态假设外)下,某个系数的OLS估计值的总体方差与扰动项的方差成正比,与解释变量的总方差(一般地,我们视解释变量为随机变量)成反比,是该变量对其它解释变量回归的拟合优度的增函数。
这个拟合优度可以理解为该变量的总变动中可以由其他解释变量解释的部分。
当这个值趋近于1时,OLS估计值的总体方差趋向于无穷大。
总体方差大时,样本方差也大的概率就大,t检验就会不准确。
尽管多重共线性没有违背任何经典假设,但是OLS方法有时无法准确估计一些参数。
这个问题可以理解为数据提供的信息不足以精确地计算出某些系数。
最根本的解决方法当然是搜集更大的样本。
如果样本给定,也许我们应该修改提出的问题,使我们能够根据样本数据做出更精确的判断。
去掉一个解释变量,或者合并一些解释变量可以减少多重共线性。
不过要注意的是去掉相关的解释变量会使估计有偏。
实际操作时使用方差膨胀系数衡量解释变量的多重共线性。
我们只需在回归之后使用vif命令就可以得到方差膨胀系数。
在命令行中敲入vif并回车,stata会报告一个包含所有解释变量的方差膨胀系数的表格,如果方差膨胀系数大于10,这个变量潜在地有多重共线性问题。
异方差是一个更值得关注的问题。
首先简单地介绍一下异方差会带来哪些问题。
第一、异方差不影响OLS估计的无偏性和一致性。
第二、异方差使估计值方差的估计有偏,所以此时的t检验和置信区间无效。
第三、F统计量不再服从F分布,LM统计量不再服从渐进卡方分布,相应的检验无效。
第四、异方差使OLS不再是有效估计。
总之,异方差影响推断是否有效,降低估计的效率,但对估计值的无偏性和一致性没有影响。
知道了异方差作用的原理,很自然地就有了对付它的办法。
第一种方法是在不知道是否存在异方差时,通过调整相应的统计量纠正可能带来的偏差。
OLS中实现对异方差稳健的标准误很简便。
相应的命令是在原来的回归命令后面加上robust选项。
如下:
reg(被解释变量)(解释变