在R中对固定效应进行F检验(面板数据)

4

我希望进行一个F检验,以验证面板数据OLS回归中固定效应(个体特定虚拟变量)的联合显著性(在R中)。然而,我还没有找到一种方法来针对大量固定效应完成此操作。理想情况下,我想使用plm软件包中的函数,但我没有找到任何具体执行此测试的内容。

当使用xtreg, fe命令时,Stata会自动执行此操作。在Stata中,结果如下所示:

------------------------------------------------------------------------------
F test that all u_i=0:  F(49, 498) =    12.00   Prob > F = 0.000

再次说明,我正在尝试在R中为大量虚拟变量复制Stata结果,可能是通过使用lm()model = "fe"使用plm()指定的+ factor(us.state).

这里有一个可复制的示例:

require(foreign)

voter <- read.dta("http://www.montana.edu/econ/cstoddard/562/panel_hw.dta")

reg1 <- lm(vaprate ~ gsp + midterm + regdead + WNCentral + South + Border
               + factor(state), data=voter)

这相当于使用plm包进行以下“within”回归。

require(plm)

reg1.fe <- plm(vaprate ~ gsp + midterm + regdead + WNCentral + South + Border,
data=voter, index = c("state","year"), model = "within")

因此,测试将会是所有状态虚拟变量联合不等于零(联合显著性)的测试。这是对不受限制的模型(以上的reg1和reg1.fe)的线性限制。这个F检验更好地解释在以下文件中(见幻灯片5-7)。
这里是我创建一个F检验的“R”矩阵的若干尝试,零假设为:Rb = q,其中b是系数矩阵(beta hat),q是一个全零向量。

http://jackman.stanford.edu/classes/350B/07/ftestforWeb.pdf

d1 = length(unique(voter$stcode))-1
d2 = length(reg1$coefficients)
R = cbind(matrix(0,d1,d2),diag(d1))

linearHypothesis(reg1,R,rhs=0)

这行不通!我希望有一种简化的方法来测试所有固定效应虚拟变量的联合显著性。

2个回答

1
首先,我建议您通过(1)提供可重现的示例和(2)描述您所指的“F检验”时所参考的精确测试来改进您的问题。可以提供Stata文档的链接吗?F是分布,因此可能有无数个称为“F检验”的测试。
如果您的实质性兴趣在于确定固定效应模型是否比没有固定效应的OLS更好地拟合数据,则始终可以使用似然比检验。我相信R中有许多实现,但由lmtest包提供的一个非常方便。这里是一个使用plm包分发的数据集的示例(您似乎已经安装了该软件包,因此应该很容易尝试)。
library(plm)
data(Produc)

library(lmtest)
mod <- lm(pcap ~ hwy + water, Produc)
mod.fe <- lm(pcap ~ hwy + water + factor(state), Produc)
lrtest(mod, mod.fe)  

以及输出:

Likelihood ratio test

Model 1: pcap ~ hwy + water
Model 2: pcap ~ hwy + water + factor(state)
  #Df  LogLik Df  Chisq Pr(>Chisq)    
1   4 -8038.1                         
2  51 -6712.4 47 2651.4  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

编辑:选项2

require(foreign)
voter <- read.dta("http://www.montana.edu/econ/cstoddard/562/panel_hw.dta")
reg1 <- lm(vaprate ~ gsp + midterm + regdead + WNCentral + South + Border
               + factor(state), data=voter)

library(plm)
reg1.fe <- plm(vaprate ~ gsp + midterm + regdead + WNCentral + South + Border,
data=voter, index = c("state","year"), model = "within")

reg1.pooling <- plm(vaprate ~ gsp + midterm + regdead + WNCentral + South + Border,
data=voter, index = c("state","year"), model = "pooling")

pFtest(reg1.fe, reg1.pooling)

输出:

    F test for individual effects

data:  vaprate ~ gsp + midterm + regdead + WNCentral + South + Border 
F = 13.0712, df1 = 45, df2 = 498, p-value < 2.2e-16
alternative hypothesis: significant effects 

嗨,文森特,我在我的帖子中提供了一个可重现的示例。谢谢你的回复。然而,我正在尝试精确地复制F检验结果。从实证角度来看,我理解有几个统计测试可以比较具有固定效应模型和没有固定效应模型的模型。 - baha-kev
我认为plm的pFtest()函数可能会做你想要的事情(请参见我的编辑答案)。结果与您的Stata输出不完全相同,这可能是因为F分布的第一个参数不同。但是当我使用lm()分别拟合两个模型时,我得到了543和498的自由度(差异为45),所以R在这里是正确的。看看当您分别拟合汇总和内部模型时,是否在Stata中获得相同的自由度。像Stata这样的闭源软件的问题在于我们永远不会准确知道他们如何计算他们的F检验。 - Vincent

0

我真的不认为这个测试有任何用处。与其估计您所称的固定效应(我将其称为无池模型),为什么不使用分层模型呢?分层模型(或部分池模型)将允许您的估计值收缩到州的公共平均值,但不会强制它们相等。此外,如果您需要评估各州之间的差异程度,只需使用州内和州间估计的方差即可。如果州之间的方差很小(接近零),那么使用分层模型并没有太大的收益,拦截器大致相同。如果方差非常大(在极限情况下,趋近于无穷大),则分层模型增加的很少,您可以为每个州运行单独的模型。

您可以使用R中的lme4包估计分层模型。使用您的数据:

require(lme4)
require(arm)
reg1 <- glmer(vaprate ~ gsp + midterm + regdead + WNCentral + South + Border
           + (1|state), data=voter)
display(reg1)

按州划分的截距的估计标准偏差为4.39,按个人划分的标准偏差为4.19。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接