【问题标题】:How to compute confidence intervals for this impulse response?如何计算此脉冲响应的置信区间?
【发布时间】:2020-02-28 11:36:48
【问题描述】:

我正在尝试为我的脉冲响应创建自举置信区间。基本上,对于每个变量的每个脉冲响应观察,我需要一个置信区间。用一个我被卡住的例子来展示给你看对我来说更容易。

library(vars)
library(varexternalinstrument)
data(GKdata)

gkvar <- VAR(GKdata[, c("logip", "logcpi", "gs1", "ebp")], p = 12, type = "const")
shockcol <- externalinstrument(gkvar, GKdata$ff4_tc, "gs1")
shockcol

ma_representation <- Phi(gkvar, 50)
irfs <- apply(ma_representation, 3, function(x) x %*% shockcol) #unclear
irfs <- as.data.frame(t(irfs))
colnames(irfs) <- names(shockcol)
irfs

到目前为止一切顺利,我们得到了数据集中 4 个变量的脉冲响应。现在,对于 each 变量中的 each 观察,我想计算自举置信区间。然而,我可能会卡在要插入函数的 statistics 上。我在缺失的代码下方用问号表示我写不出来

? <- function() # I need to create a function that says bootstrap for each observation of each variable, I don't know how to do it

boot <- boot(irfs, ?, R = 1000, stype = "w", sim = "ordinary")

boot_ci <- boot.ci(boot, conf = c(0.90, 0.95), type = c("norm", "basic", "perc", "bca"))

谁能帮我解决这个问题?

非常感谢!

【问题讨论】:

  • 嘿,这不是一个简单的引导程序。我不熟悉 GKdata 中的内容,但我想有一些时间序列信息,您可以从中计算脉冲等。如果您引导,您需要对 GKdata 进行采样,以便保留此信息,这样您就可以计算理智的冲动
  • 好吧,让我来表达这个问题,你能简单地从 GKdata 中取样并计算脉冲响应等吗?如果这样没问题,那我就可以写启动函数了
  • @StupidWolf 感谢您的关注。为了清楚起见,您是在说“而不是做我想做的事,而是从原始数据集中重新采样并从那里得到我需要的一切”?如果这就是你的意思并且我理解正确,是的,它有效
  • 好吧,我想我明白数据是什么了。从参考上看,它是“1979:7至2012:6期间各种经济金融变量的月度数据”。因此,这意味着您以年为单位对数据进行采样。因此 p=12 参数
  • 你可以在下面看到,引导程序或多或少是正确的,我不确定为什么你的 c.i 这么大,也许有一些异常值等等我不知道。你更熟悉这个功能比我还

标签: r var confidence-interval statistics-bootstrap


【解决方案1】:

因此数据是在 1979:7 到 2012:6 期间收集的,因此每 12 行是一年,并且引导程序应该在一个块中对年份进行采样。

我们首先将这些信息添加到数据中:

Data = GKdata
Data$year = (1:nrow(Data) - 1) %/% 12

我们创建了一个函数,它接收一个带有采样索引的列表,将它们重新组合成一个 data.frame 并执行相同的拟合函数。对于启动,您不能返回 data.frame,因此我们返回一个矩阵:

func = function(mylist,ind){

  mydf = do.call(rbind,mylist[ind])
  gkvar <- VAR(mydf[, c("logip", "logcpi", "gs1", "ebp")], p = 12, type = "const")
  shockcol <- externalinstrument(gkvar, mydf$ff4_tc, "gs1")

  ma_representation <- Phi(gkvar, 50)
  irfs <- t(apply(ma_representation, 3, function(x) x %*% shockcol)) #unclear
  colnames(irfs) <- names(shockcol)
  irfs
}

所以我们通过提供一个列表来进行引导,该列表按年份划分。 bootstrapping 将对该列表的索引进行采样,将采样的年份组合成一个新的数据框并执行拟合:

res = boot(split(Data,Data$year),func,100)

我们可以根据原始观察检查函数是否在做正确的事情:

table(res$t0 == irfs)

您的 irfs 有 51 x 4 个值。如果我们查看启动结果中的估计值,就会发现这是平的:

dim(res$t)
[1] 100 204

要恢复每个值或变量的 95% 置信区间,我们这样做:

boot_est= sapply(1:ncol(res$t),function(i){
  boot.ci(res,index=i,type = "perc")$percent[4:5]
})

然后通过将它们放回矩阵来创建上限和下限:

lb = matrix(boot_est[1,],ncol=ncol(res$t0))
ub = matrix(boot_est[2,],ncol=ncol(res$t0))

您可以绘制 irfs 的第一列,不知何故,对于前几个条目来说,ci 确实很大:

plot(irfs[,1],ylim=c(-8,8))
lines(ub[,1])
lines(lb[,1])

【讨论】:

  • 哇!这看起来真的很棒!非常感谢。我也对一开始的 ci 的大小感到困惑。我会考虑的。非常感谢,我自己永远做不到。谢谢
  • 我明白为什么 ci 这么大了。这就是它在论文的注释中所写的内容:“我们正在使用狂野的引导程序,它在异方差和强工具下生成有效的置信带。与工具变量回归相关的估计误差包含在报告的置信带中,因为这两个阶段估计的一部分包含在自举过程中。因此,我们避免了任何潜在的“生成的回归器”问题。”现在的问题是:如果externalinstrument 只显示瞬时响应,我如何获得残差?
  • 从我写的引文中,你明白他们用什么样本来推导 ci 吗?我以为是残差,然后推断,之所以有巨大的乐队是因为他们使用了不同的样本。我的问题仍然存在:他们在引导什么?
  • 哦,我现在明白你的意思了.. 他们使用的是狂野的引导程序,我希望是 en.wikipedia.org/wiki/Bootstrapping_(statistics)#Wild_bootstrap。好的,如果 wiki 是正确的,这意味着您实际上是随机称重残差并重新拟合
  • 是的,你是对的。残差实际上在这里。 gkvar$varresult 包含所有线性模型,因此要获得残差,您可以执行 gkvar$varresult$ebp$residuals
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多