0

滚动窗口回归估计如下:data=datam,每个周期 60 个窗口

datam=cbind(unempts,gdpts)
datam <-matrix(datam,ncol=2)
out <- rollapplyr(datam,
                  width = 60,
                  FUN = function(x) coef(lm(as.data.frame(x))),
                  by.column=FALSE)
plot((out[,2]),type="l")

在此图中,还需要通过使用 HAC 和非 HAC SE 作为斜率系数来添加置信区间。为了获得我试过的 SE

coeftest(out[,2],vcov. = out[,2]$hacse)

但我得到一个错误 -

错误:$ 运算符对原子向量无效

请告知我哪里出错了。

4

2 回答 2

2

为了使您的示例具有可重复性,我从 Greene 的计量经济学教科书中获取了失业和 GDP 数据,这些数据在AER软件包中提供。我还采用了 GDP 回报率而不是 GDP 水平:

data("USMacroG", package = "AER")
datam <- ts.intersect(
  unemp = USMacroG[, "unemp"],
  gdp = diff(log(USMacroG[, "unemp"]))
)

然后可以通过zoo包进行滚动回归:

library("zoo")
out <- rollapplyr(datam, width = 60, by.column = FALSE,
  FUN = function(x) coef(lm(as.data.frame(x))))

结果对象out是一个时间序列对象(类"ts"),其中仅存储了两个回归系数(截距和斜率)。

class(out)
## [1] "mts"    "ts"     "matrix"
head(out, 3)
##      (Intercept)      gdp
## [1,]    4.896035 2.104652
## [2,]    4.878405 2.307698
## [3,]    4.870110 2.397435

因此,绘制第二列会产生随时间变化的 GDP 回报斜率:

plot(out[, 2])

斜率时间序列

因此,为了获得除了系数之外的标准误差,这些都需要存储在out时间序列中。可以通过该sandwich软件包获得各种风格的 HAC 标准错误(安德鲁斯内核 HAC、Newey-West 等)。对于单个线性回归:

reg <- lm(as.data.frame(datam))
coef(reg)
## (Intercept)         gdp 
##    5.677756    2.945576 
sqrt(diag(vcov(reg)))
## (Intercept)         gdp 
##   0.1101139   1.5414225 
library("sandwich")
sqrt(diag(kernHAC(reg)))
## (Intercept)         gdp 
##    1.543329    2.810953 

如您所见,由于数据中的正自相关(这可能更好地明确建模而不是通过 HAC 标准误差捕获),HAC 标准误差要大得多。

out <- rollapplyr(datam, width = 60, by.column = FALSE,
  FUN = function(x) {
    reg <- lm(as.data.frame(x))
    c(
      "slope" = coef(reg)[2],
      "se" = sqrt(diag(vcov(reg)))[2],
      "hacse" = sqrt(diag(kernHAC(reg)))[2]
    )
  })

这会产生估计的斜率和两种标准误差:

head(out, 3)
##      slope.gdp   se.gdp hacse.gdp
## [1,]  2.104652 1.482968  2.079983
## [2,]  2.307698 1.491482  2.153506
## [3,]  2.397435 1.532250  2.278149

从这里你可以创建更多的情节等。示例中的模型并不是特别适合,而且相当有问题。但我希望现在很清楚(呃)R 代码是如何工作的。

于 2015-11-15T12:10:47.277 回答
0

我们真的没有准备好解决您在问题标题中提出的主题,因为存在更多基本错误和许多需要澄清的歧义。错误来自out[,2]$hacse. 该out[,2]部分返回一个向量,您不能使用它$来访问向量的组件。

在您的评论中,您询问回归对象在哪里。它是由lm(as.data.frame(x))函数返回的coef,然后 coef 函数将其丢弃,但还有其他问题。没有公式。所以我不明白你在做什么。您对datam对象的描述是粗略的,以允许进一步评论。你为什么不制作str(datam)并解释你真正希望做什么。(默认包中没有功能rollapplyr,因此您还需要包含一个library调用。)

于 2015-11-15T06:41:11.743 回答