如何计算此脉冲响应的置信区间?
How to compute confidence intervals for this impulse response?
我正在尝试为我的脉冲响应创建自举置信区间。基本上,我需要每个变量的 each 脉冲响应观察的置信区间。我可以更容易地向您展示我遇到的问题。
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"))
有人可以帮我吗?
非常感谢!
因此数据是在 1979:7 到 2012:6 期间收集的,因此每 12 行是一年,bootstrap 应该在一个块中对年份进行采样。
我们首先将这些信息添加到数据中:
Data = GKdata
Data$year = (1:nrow(Data) - 1) %/% 12
然后我们创建一个函数,它接收一个列表,其中包含采样索引,将它们重新组合成 data.frame 并执行相同的拟合函数。对于启动,你不能 return 一个 data.frame 所以我们 return 一个矩阵:
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
}
所以我们 bootstrap 通过给它提供一个按年份划分的列表来完成。 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])
我正在尝试为我的脉冲响应创建自举置信区间。基本上,我需要每个变量的 each 脉冲响应观察的置信区间。我可以更容易地向您展示我遇到的问题。
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"))
有人可以帮我吗?
非常感谢!
因此数据是在 1979:7 到 2012:6 期间收集的,因此每 12 行是一年,bootstrap 应该在一个块中对年份进行采样。
我们首先将这些信息添加到数据中:
Data = GKdata
Data$year = (1:nrow(Data) - 1) %/% 12
然后我们创建一个函数,它接收一个列表,其中包含采样索引,将它们重新组合成 data.frame 并执行相同的拟合函数。对于启动,你不能 return 一个 data.frame 所以我们 return 一个矩阵:
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
}
所以我们 bootstrap 通过给它提供一个按年份划分的列表来完成。 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])