-
面板数据估计
<
/p>
首先
对面板数据进行声明
:
前面是截面单元,后面是时间标识:
tsset company year
tsset
industry year
产生新的变量:
gen
newvar=human*lnrd
产生滞后变量
Gen
fiscal(2)=
产生差分变量
Gen
fiscal(D)=
描述性统计:
xtdes
:对
Panel
Data
截面个数、时间跨度的整体描述
Xtsum
:分组内、组间和样本整体计算各个变量的基本统计量
< br>
xttab
采用列表的方式显示某个变量的分布
Stata
中用于
估计面板模型的主要
命令
:
xtreg
xtreg
depvar [varlist] [if exp] , model_type [level(#) ]
Model type
模型
be
Between-effects estimator
fe
Fixed-effects estimator
re
GLS Random-effects estimator
pa
GEE population-averaged estimator
mle
Maximum-likelihood Random-effects estimator
主要估计方法:
xtreg
:
Fixed-,
between- and random-effects, and population-
averaged
linear models
xtregar
:
Fixed-
and
random-effects
linear
models
with
an
AR(1)
disturbance
xtpcse
:
OLS
or
Prais-Winsten
models
with
panel-corrected
standard
errors
xtrchh
:
Hildreth-
Houck random coefficients models
xtivreg
:
Instrumental variables and
two-stage least squares for
panel-data
models
xtabond
:
Arellano-
Bond linear, dynamic panel data estimator
xttobit
:
Random-
effects tobit models
xtlogit
:
Fixed-effects, random-
effects, population-averaged logit
models
xtprobit
:
Random-effects and
population-averaged probit models
xtfrontier
:
Stochastic frontier models
for panel-data
xtrc gdp invest culture
edu sci health social admin,beta
xtreg
命令的应用:
声明面板数据类型:
tsset sheng t
描述性统计:
xtsum gdp invest sci
admin
1.
固定效应模型估计:
xtreg gdp invest culture sci health
admin techno,fe
固定效应模型中个体效应和随机干扰项的方差估计值
(
分别为
sigma u
和
sigma
e
),二者之间的相关关系
(rho)
最后一行给出了检验固定效应是否显著的
F
统计量和相应的
P
值
2.
随机效应模型估计:
xtreg gdp invest culture sci health
admin techno,re
检验随机效应模型是否优于混合
OLS
模型:
在进行随机效应回归之后,使用
xttest0
检验得到的
P
值为
< br>0.0000
,表明随机效应模型优于混合
OLS
模型
3.
最大似然估计
Ml
:
xtreg gdp invest culture sci health
admin techno,mle
Hausman
检验
Hausman
< br>检验究竟选择固定效应模型还是随机效应模型:
第一步:估计固定效应模型,存储结果
xtreg gdp invest culture sci health
admin techno,fe
est store fe
第二步:估计随机效应模型,存储结果
xtreg gdp invest culture sci health
admin techno,re
est store re
第三步:进行
hausman
检验
hausman fe
Hausman
检验量为:
H=(b-
B)?[Var(b)
-Var(B
)]-1(b-B)
~
x2(k)
H
ausman
统计量服从自由度为
k
的
χ
2
分布。
当
H
大于一定显著水平的临界值时,
我们
就认为模型中存在固定效应,
从而选用固定效应模型,
否则选用
随机效应模
型
如果
< br>hausman
检验值为负,说明的模型设定有问题,导致
Hausman
检验的基本
假设得不到满足,遗漏变量的问
题,或者某些变量是非平稳等等
可以改用
hausman
检验的其他形式:
hausman fe, sigmaless
对于固定效应模型的异方差检验和序列相关检验:
Xtserial gdp invest culture sci health
admin techno
异方差检验:
xtreg gdp invest culture sci
health admin techno,fe
xttest3
(Modified Wald statistic for groupwise
heteroskedasticity in
fixed effect
model)
随机效应模型的序列相关检验:
xtreg gdp invest culture sci health
admin techno,re
Xttest1
Xtte
st1
用于检验随机效应
(
单尾和双尾
)
、一阶序列相关以及两者的联合显著
检验结果表明存在随机效应和序列相关,
而且对随机效应和序列相关的联合检验
也非常显著
p>
可以使用广义线性模型
xtgls
对异方差
和序列相关进行修正:
xtgls gdp invest
culture sci health admin techno, panels(hetero)
,修
正异方差
xtgls gdp invest culture sci health
admin techno, panels(correlated)
,
修正依横截面而变化的异方差
xtgls
gdp invest culture sci health admin techno,
panels(hetero)
corr(ar1)
,修正异
方差和一阶序列相关
ar(1)
我常用
到的
stata
命令
最重要的两个命令莫过于
help
和
< br> search
了。即使是经常使用
stata
的人也很
难,也没必要记住常用命令的每一个细节,更不用说那些不常用
到的了。所以,
在遇到困难又没有免费专家咨
询时,
使用
stata
自带的
帮助文件就是最佳选择。
stata
的帮助文件十分详尽,面面
俱到,这既是好处也是麻烦。当你看到长长的
帮助文件时,是不是对迅
< br>
速找到相关信息感到没有信心?
闲话不说了。
help
和
sear
ch
都是查找帮助文件的命令,
它们之间的区别在于
help
用于查找精确的命
令名,而
search
是模糊查找。如果你知道某个命令的
名字,
并且想知道它的具体使用方法,只须在
stata
的命令行窗口中输入
help
空格加
上这个名
字。回车后结果屏幕上就会显示出这
个命令的帮助文件的全部内容。
如果你想知道在
stata
p>
下做某个估计或某种计算,
而不知道具体该如何实现,
就
需要用
search
命
令了。使用的方法和
help
类似,只须把准确的命令名改成某
个关键词。
回车后结果窗口会给出所有和这个关键词相关的帮助文件名和链接列
表。
在列表中寻找最相关的内容,点击后在弹出的查看窗口中会给出相关的帮<
/p>
助文件。耐心寻找,反复实验,通常可以较快地找到你需要的内容。
下面
该正式处理数据了。
我的处理数据经验是最好能用
stata
的<
/p>
do
文件编辑器
记下你做过的工作。
p>
因为很少有一项实证研究能够一次完成,
所以,
当你下次继
续工
作时。能够重复
前面的工作是非常重要的。有时因为一些细小的不同,你
会发现无法复制原先的结果了。
这时如果有记录下以往工作的
do
文件将把你从
地狱带到天
堂。因为你不必一遍又一遍地试图重现做
过的工作。在
stata
窗口
上部的工
具栏中有个孤立的小按钮,把鼠标放上去会出现“bring do
-file
editor to front”,点击它就会出现
do
p>
文件编辑器。
为了使
do
文件能够顺利工作,
一般需要编辑
do
文件的“头”和“尾”。
这里给
出我使用的“头”和“尾”。
/*
(标签。简单记下文件的使命。)
*/
capture clear
(清空内存中的数据)
capture log close
(关闭所有打开的日志文件)
set
mem 128m
(设置用于
stata
使用的内存容量)
set
more
off
(关闭
more
选项。如果打开该选项,那么结果分屏输出,即一次
只输出一屏结果。
你按空格键后再输出下一屏,
直到
全部输完。
如果关闭则中间
不停,一次全部输出。)
set matsize 4000
(设置矩阵的最大阶数。我用的是不是太大了?)
cd D:
(进入数据所在的盘符和文件夹。和
dos
的命令行很相似。)
log using
(文件名)
.log,replace
(打开日志文件,并更新。日志文件将记
录下所有文件运行后给出的结果,如果你修改
了文件内容,
replace
选项可以将
其更新为最近运行的结果。)
use
(文件名)
,clear
(打开数据文件。)
(文件内容)
log close
(关闭日志文件。)
exit,clear
(退出并清空内存中的数据。)
这个
do
文件的“头尾”并非我的发明,而是从沈明高老师那里学到
的。版权归
沈明高老师。(待续)
我常用到的
stata
命令:
(续)
实证工作中往往接触的是原始数
据。
这些数据没有经过整理,有一些错漏和不
统一的地方。比如,对某个变量的缺失观察值,
有时会用点,有时会用
-9
,
-99<
/p>
等来表示。回归时如果使用这些观
察,
往往得出非常错误的结果。还有,在不
同的数据文件中,
相同变
量有时使用的变量名不同,
会给合并数据造成麻烦。
因
此,拿到原始数据后,往往需要根据需要
重新
生成新的数据库,并且只使用这
个新库处理数据。
这部分工作不
难,
但是非常基础。
因为如果在这里你不够小心,
后面的事情往往会白做。
假
设你清楚地知道所需的变量,现在
要做的是检查数据、生成必要的数据并形
成数据库供将来使用。
检查数据的重要命令包括
codebook
,
< br>su
,
ta
,
< br>des
和
list
。
其中,
codebook
提供的信息最全面,缺
点是不能使用
if
条件限制范围,所以,
有时还要用别的帮帮忙。
su
空格加变量名报告相应变量的非
缺失的观察个数,
均值,标准差,最
小值和最大值。
ta
空格后面加一个(或两个)变量名是报告<
/p>
某个变量(或两个变量二维)的取值(不含缺失值)的频数,比率
和按大小排
列的累积比率。
des
p>
后面可以加任意个变量名,只要数据中有。它报告变量的存
储的类型
,显示的格式和标签。标签中一般记录这个变量的定义和单
位
。
list
报告变量的观察值,
可以用
if
或
in
来
限制范围。
所有这些命令都可以后面不加
任何变量名,报告的结
果是正在使用的数据库中的所有变量的相应信
息。说起
来苍白无力,打开
stata
亲自实验一下吧
。
顺带
说点儿题外话。
除了
codebook
之外,
上述统计类的命令都属于
r
族命
令
(又
称一般命令)。执行后都可以使用
return
list
报告储存在
r
()
中的统计结果。
最典型的
r
族命令当属
summarize
。它会把样本量、均值、标准差、方差、最
小
值、
最大值、
总和等统计信息储
p>
存起来。
你在执行
su
之后,
只需敲入
return
list
就可以得到所有这些信息。
其
实,
和一般命令的
return
命令类
似,
估计命令
(又
称
< br>e
族命令)也有
ereturn
命令,具有报告,储存信息的功
能。在更复杂的编
程中,
比如对回归分解,
计算一些程序中无法直接
计算的统计量,
这些功能更是
必不可少。
检查数据时,先用
codebook
看一下它的值域和单位。如果有
-9
,
-99
这样的取
值,查一下问卷中对缺失值的记录方法。确
定它们是缺失值后,改为用点记录。
命令是
replace
(
变量名
)=. if (
变量名
p>
)==-9
。再看一下用点记录的缺失值有
多少,作为选用变量的一个依据。
得到可用的数据后,我会给没有标
签
的变量加上注解。或者统一标签;或者统
一变量的命名规则。更改变量名的命令是
ren
(原变量名)空格(新变量名)。
定
义标签的命令是
label var
(变量名)空格”(标签
内容)”。整齐划一的
变量名有助于记忆,简明的标签有助于明确变量的单位等信息。<
/p>
如果你需要使用通过原始
变量派生出的新变量,那么就需要了解
gen
,<
/p>
egen
和
replace
这三个命令。
gen
和
re
place
常常在一起使用。
它们的基本语法是
gen
(
或
replace
)
空格
(变量名)
=
< br>(表达式)
。
二者的不同之处在于
gen
是生成新变量,
replace
是重新定义旧变量。
虚拟变量是
我们常常需要用到的一类派生变量。如果你需要生成的虚拟变量个
数不多,可以有两种方法生成。一种是简明方法:
gen
空格
(变量名)=((限
制条件))
[
这<
/p>
外面的小括弧是命令需要的,里面的小括弧不是命令需要的,只
是说明“限制条件”并非命令
]
。如果
某个观察满足限制条件,那么它的这个虚
拟变量取值为
1
,否
则为
0
。另一种要麻烦一点。就是
gen
(变量名)=
1 if
(取值为一限制条件)
replace
(相同的变量名)=
0
if
(取值为零的限制条件)
两
个方法
貌似一样,但有一个小小的区别。如果限制条件中使用的变量都没有
任何缺失值,
那么两种方法的结果一样。
如果有缺失值,
第
一种方法会把是缺失
值的观察
的虚拟
变量都定义为
0
。而第二种方法可以将虚拟变量的取值分为三<
/p>
种,一是等于
1
,二是等于
0
,三是等于缺失值。这样就避免了把本来信息不明
的观察错误地纳
入到回归中去。
下次
再讲如何方便地生成成百上千个虚拟变量。
我常用到的
stata
命令:
(续)
大量的虚拟变量往往是根据某
个已知变量的取值生成的。
比如,
在某个回归中希
望控制每个观察所在的社区,
即希望控制标记社区的虚拟变量。
社区数目可能有
成百上千个,
如果用上次的所说的方
法生成就需要重复成百上千次,
这也太笨了。
大量生成虚拟变量
的命令如下;
ta
(变量名)
,
gen(
(变量名)
)
第一个括号里
的变量名是已知的变量,
在上面的例子中是社区编码。
后一个括
号
里的变量名是新生成的虚拟变量的共同前缀,后面跟数字表示不同的虚拟变量。
如果我在这里填入
d
,那么,上述命令就会新
生成
d1
,
d2
,等等,直到所有社区
都有一个虚拟变量。
在回归中控制社区变量,
只需简单地放入这些变量即可。
一个麻烦是虚拟变量太
多,
怎么简单地加入呢?一个办法是用
省略符号,
d*
表示所有
d
字母开头的变量,
另一法是用破折号,
d1-d1
50
表示第一个到第
150
个社区虚拟
变量
(假设共有
150
个社区)。
p>
还有一种方法可以在回归中直接控制虚拟变量,而无需真的去生成
这些虚拟变
量。使用命令
areg
可以
做到,它的语法是
areg
(被解释变量)
(解释变量)
,
absorb
(变量名)
absor
b
选项后面的变量名和前面讲的命令中第一个变量名相同。在上面的例子
中即为社区编码。回归的结果和在
reg
中直接加入相
应的虚拟变量相同。
生成变量的最后一招是
egen
。
egen
和
gen
都用于生成
新变量,
但
egen
的特点是
它更强大的函数功能。
gen
可以支持一些函数
,
egen
支持额外的函数。如果用
g
en
搞不定,就得用
egen
想办法了
。不过我比较懒,到现在为止只用用取平均、
加和这些简单的函数。
有的时候数据情况复杂一些,
往往生成所需变量不是非常
直接,
就需要多几个过
程。曾经碰到原始数据中记录日期有些怪
异的格式。比如,
1991
年
10
p>
月
23
日
被记录为
19911023
。我想使用它年份和月份,并生成虚拟变量。
下面是我的做
法:
gen
yr=int(date)
gen mo=int((data-
yr*10000)/100)
ta yr, gen( yd)
ta mo, gen( md)
假
设你已经生成了所有需要的变量,现在最重要的就是保存好你的工作。使用
的命令是
save
空格(文件名),
replace
。和前面介绍的一样,
replac
e
选项
将更新你对数据库的修改,
所以
一定要小心使用。
最好另存一个新的数据库,
如
果把原始库改了又变不回去,就叫天不应叫地不灵了。
我常用到的
stata
命令
(续)
前面说的都是对单个数据库的简单操
作,但有时我们需要改变数据的结构,或
者抽取来自不同数据库的信息,
因此需要更方便的命令。
这一类命令中我用过的
有:改
变数据的纵横结构的命令
reshape
,生成退化的数据库
collapse
,合并
数据库的命令
append
和
merge
。
纵列
(
longitudinal
)
数据
< br>
通常包括同一个行为者
(
ag
ent
)
在不同时期的观察,
所以处理
这类数据常常需要把数据库从宽表变成长表,
或者相反。
所谓宽
表是以
每个行为者为一个观察,
不同
时期的变量都记录在这个观察下,例如,行为者
是厂商,时期有
2000
、
2001
年,变量是雇佣人
数和所在城市,假设雇佣人数在
不同时期不同,所在城市
则不变。宽
表记录的格式是每个厂商是一个观察,没
有时期变量,
雇佣人数
有两个变量,
分别记录
2000
年和<
/p>
2001
年的人数,
所在城
市只有一个变量。所谓长
表是行为者和时期共同定
义观察,在上面的例子中,
每个厂商有两个观察,
有时期变量,
雇佣人数和所在城市都只有一个,
它们和时
期变量共同定义相应时期的变量
取值。
在上面的例子下,把宽表变成长表的命令格式如下:
reshape long
(雇佣人数的变量名)
,
i(
(标记厂商的变量名)
)
j(
(标记时
期的变量名)
)
因为所在城市不随时期变化,所以在转换格式时不用放在
reshap
e long
后面,
转换前后也不改变什么。相反地,如果把长
表变成宽表则使用如下命令
reshape wide
(雇佣人数的变量名)
,
i(
(标记厂商的变量名)
)
j(
(标记时
期的变量名)
)
唯一的区别是
long
换成了
wide
。
collaps
e
的用处是计算某个数据库的一些统计量,再把它存为只含有这些统计
< br>量的数据库。
用到这个命令的机会不多,
我使用它是因为
它可以计算中位数和从
1
到
99
的百分位数,这些统计量在常规的数据描述命令中没有。如果要计算中
位数,其命令的语法如下
collapse
(median) (
(变量名)
),
by(
(变量名)
)
生成的新数据库
中记录了第一个括号中的变量
(可以是多个变量)
的中位数。<
/p>
右
面的
by
选项
是根据某个变量分组计算中位数,没有这个选项则计算全部样本的
中位数。
合
并数据库有两种方式
,一种是增加观察,另一种是增加变量。第一种用
append
,
用在两个数据库的格式一样,
但观察不一样,
只需用
append
空格
u
sing
空格
(文件名)
就可以狗尾续
貂了。
简单明了,
不会有什么错。
另一
种就不同了,
需要格外小心。如果
两个数据库中包含共同的观察,但是变量不同,希
望从一
p>
个数据库中提取一些变量到另一个数据库中用
merge
。完整的命令如下:
use
(文件名)
[
打开辅助数据库
]
sort
(变量名)
[
根据变量排序,这个变量是两个数据库共有的识别信息
]
save
(文件名)
,
replace [
保存辅助数据库
]
use
(文件名)
[
打开主数据库
]
sort
(变量名)
[
对相同的变量排序
]
merge
(变量名)
using
(文件名)
,
keep(
(变量名)
)
[
第一个变量名即为前面
sort
后面的变量名,
文件名是辅助数据库的名字,
后面
的变
量名是希望提取的变量名
]
ta
_merge
[
显示
_merge
的取值情况。
_merge
等于
1
的观察是仅主库有的,等于
< br>2
的是仅辅助库有的,等于
3
是
两个库都有的。
]
drop if _merge==2
[
删除仅仅来自辅助库的观察
]
drop merge
[
删除
_merge]
save
(文件名)
, replace
[
将合并后的文件保存,通常另存
]
我常用到的
stata
命令
(续)
讲到这里似乎对于数据的生
成和处理
应该闭嘴了。大家可能更想听听估计、检
验这些事情。
但我并不
想就此止住,
因为实际中总是有一些简单套用命令无法轻
易办到
的特殊要求。此时至少有两
条路可以通向罗马:一是找到更高
级的命令
一步到位;二是利用已知简单命令多绕几个圈子达到目的。
下面讲一个令我刻骨铭心的经历,这也是迄
今我所碰到的生成新数据中最繁复
的了。
原始数据
中包含了可以识别属于同一个家庭中所有个人的信息和家庭成员
与户主关系的信息。目的
是利用这些信息建立亲子
关系。初步的构想是新数据
库以子辈为观察,
找到他们的父母,
把父母的变
量添加到每个观察上。
我的做法
如下: