如何在Fstats函数中指定vcovHC选项(structchange包)?

zfycwa2u  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(331)

在下面的例子中,我使用vcovHC选项为标准线性模型生成稳健的标准误差。在同一个例子中,我尝试使用Fstats()函数生成具有稳健标准误差的F统计量的分布。问题是Fstats内部使用了vcovHC,如下面代码的最后一行所示(我从Fstats函数中提取)。

else {
      allX <- cbind(X1, matrix(rep(0, point[i]*k), ncol=k))
      allX <- rbind(allX, cbind(X2, X2))
      fm2 <- lm(y ~ 0 + allX)
      beta2 <- coef(fm2)[-(1:k)]
      V <- vcov.(fm2)

我不知道如何在使用Fstats()函数时指定vcovHC选项。我所做的尝试(见下文)不起作用。谢谢你的帮助。

rm(list = ls())
> 
> library(lmtest)
> library(sandwich)
> library(strucchange)
> 
> y <- as.ts(c(4,3,-2,1,-4,0,1,-2,-3,2,0,1,-2,2,4,1,3,5,2,2,3,4))
> X <- as.ts(rep(1,22))
> 
> # lm model with robust standard errors
> model<- lm(y ~ X - 1)
> coeftest(model, vcov = vcovHC(model, type = "HC0"))

t test of coefficients:

  Estimate Std. Error t value Pr(>|t|)  
X  1.13636    0.51545  2.2046  0.03877 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

> 
> # Fstats model with regular standard errors
> model2 <- Fstats(y ~ X - 1, from = 3, to = 18)
> model2$Fstats
Time Series:
Start = 3 
End = 18 
Frequency = 1 
 [1]  0.1530982  0.1010540  0.5609994  0.8631524  0.8332749  2.2221599  5.5956726
 [8]  4.5129612  5.6715064  5.8951319 11.4357216 10.2821317  6.1921347  7.1910292
[15]  5.4546513  2.1974238
> 
 # Fstats model with robust standard errors
> model3 <- Fstats(y ~ X - 1, from = 3, to = 18, vcovHC(.,type = "HC0"))
Error in vcovHC(., type = "HC0") : object '.' not found
9lowa7mx

9lowa7mx1#

Fstats()中的vcov参数需要是一个函数(参见?Fstats),因为它必须应用于拟合数据子集的不同线性模型的整个范围。这与coeftest()相反,coeftest()中的vcov参数可以是一个函数,也可以是一个矩阵,因为它只与一个单一模型组合。
durab数据集中有一个示例,提供了工业生产指数的增长率与制造业/耐用品部门每周平均劳动时间的比值,该示例取自汉森(2001),使用了一个简单的AR(1)模型:

library("strucchange")
data("durab", package = "strucchange")
fsHC <- Fstats(y ~ lag, data = durab, from = 0.1,
  vcov = function(x, ...) vcovHC(x, type = "HC", ...))
plot(fsHC)
sctest(fsHC)
##      supF test
## 
## data:  fsHC
## sup.F = 20.221, p-value = 0.001371

还应注意,对于经典的HC三明治估计量,可以使用sandwich()而不是vcovHC(..., type = "HC0")。因此,在上面的代码中使用vcov = sandwich比动态设置新函数更简单。

相关问题