HAC 标准误差和非 HAC 标准误差
HAC Standard Error and Non HAC Standard Error
滚动window回归估计如下:
data= datam,每周期 60 windows
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)
但是我得到一个错误 -
Error: $ operator is invalid for atomic vectors
请指教我哪里出了问题。
我们真的没有准备好解决您在问题标题中提出的主题,因为有更多基本错误和许多歧义需要澄清。错误来自 out[,2]$hacse
。 out[,2]
部分 returns 是向量,您不能使用 $
访问向量的组件。
在您的评论中,您询问回归 object 在哪里。它是 lm(as.data.frame(x))
返回给函数 coef
的内容,然后 coef 函数将其丢弃,但还有其他问题。没有公式。所以我不明白你想做什么。您对 datam
object 的描述过于粗略,无法进一步评论。你为什么不生产 str(datam)
并解释你真正希望做什么。 (默认包中没有函数 rollapplyr
,因此您还需要包含一个 library
调用。)
为了使您的示例可重现,我从 AER
包中提供的格林计量经济学教科书中获取了失业和 GDP 数据。我还采用了 GDP return 而不是 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
是一个时间序列对象(class "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 return 斜率:
plot(out[, 2])
因此,除了需要将这些系数存储在 out
时间序列中之外,还要获得标准误差。可以使用 sandwich
包获得各种类型的 HAC 标准错误(Andrews 内核 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 代码是如何工作的已经很清楚了。
滚动window回归估计如下: data= datam,每周期 60 windows
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)
但是我得到一个错误 -
Error: $ operator is invalid for atomic vectors
请指教我哪里出了问题。
我们真的没有准备好解决您在问题标题中提出的主题,因为有更多基本错误和许多歧义需要澄清。错误来自 out[,2]$hacse
。 out[,2]
部分 returns 是向量,您不能使用 $
访问向量的组件。
在您的评论中,您询问回归 object 在哪里。它是 lm(as.data.frame(x))
返回给函数 coef
的内容,然后 coef 函数将其丢弃,但还有其他问题。没有公式。所以我不明白你想做什么。您对 datam
object 的描述过于粗略,无法进一步评论。你为什么不生产 str(datam)
并解释你真正希望做什么。 (默认包中没有函数 rollapplyr
,因此您还需要包含一个 library
调用。)
为了使您的示例可重现,我从 AER
包中提供的格林计量经济学教科书中获取了失业和 GDP 数据。我还采用了 GDP return 而不是 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
是一个时间序列对象(class "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 return 斜率:
plot(out[, 2])
因此,除了需要将这些系数存储在 out
时间序列中之外,还要获得标准误差。可以使用 sandwich
包获得各种类型的 HAC 标准错误(Andrews 内核 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 代码是如何工作的已经很清楚了。