如何计算此脉冲响应的置信区间?

时间:2020-02-28 11:36:48

标签: r var confidence-interval statistics-bootstrap

我正在尝试为我的冲动反应创建自举的置信区间。基本上,对于每个变量的每个脉冲响应观察,我需要一个置信区间。对于我来说,举个例子说明我很容易陷入困境。

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个变量的脉冲响应。现在,对于每个变量中的每个观察,我想计算自举置信区间。但是,我可能卡在统计信息上,无法插入该函数。我在缺少的无法写的代码下方用问号表示

? <- 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"))

有人可以帮我吗?

非常感谢!

1 个答案:

答案 0 :(得分: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
}

因此,我们通过向引导程序提供一个列表(按年份划分)来进行引导。引导程序将对该列表的索引进行采样,将采样的年份合并到一个新的数据框中并执行拟合:

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])

enter image description here