如何修改R语言中irf()函数的冲击规模?——基于VAR模型脉冲响应分析的需求
调整R中
irf()函数的冲击规模:设置为1单位冲击 当然可以修改irf()函数的冲击规模!你提到的默认行为确实是对的——vars包中的irf()函数默认会用扰动项的估计标准差作为正交化冲击的规模。下面给你两种直接实现1单位冲击的方法,以及手动调整现有结果的思路:
方法1:直接在irf()中设置参数
vars包的irf()函数自带scale参数,专门用来控制冲击的缩放:
- 默认
scale=TRUE:将冲击缩放为1个标准差的大小 - 设置
scale=FALSE:使用1单位的冲击规模
根据你是否需要正交化冲击,分两种场景:
场景1:正交化的1单位冲击(保持Cholesky分解)
如果你想保留正交化处理(也就是默认的ortho=TRUE),只需要加上scale=FALSE参数:
vardata1 <- cbind(DBausgaben1ts, DBIP1ts) Var1 <- VAR(vardata1, p = 3, type = "none", exogen = sdd) # 生成正交化、1单位冲击的脉冲响应 Var1irf_unit_ortho <- irf(Var1, n.ahead = 10, ortho = TRUE, scale = FALSE)
此时得到的IRF展示的是变量对1单位正交化扰动项的反应,而非1个标准差的冲击。
场景2:非正交化的1单位原始冲击
如果你不需要正交化(也就是直接对每个方程的原始残差施加1单位冲击),可以同时设置ortho=FALSE和scale=FALSE:
# 生成非正交化、1单位原始冲击的脉冲响应 Var1irf_unit_raw <- irf(Var1, n.ahead = 10, ortho = FALSE, scale = FALSE)
这种情况下,冲击是直接作用于原始扰动项(可能存在同期相关性),规模为1单位。
方法2:手动调整已计算的IRF结果
如果你已经计算了默认的IRF(1个标准差冲击),也可以通过简单的数学转换得到1单位冲击的结果:
- 先提取VAR模型中残差的估计标准差
- 将每个脉冲响应值除以对应的标准差,就能把“1个标准差冲击的反应”转换成“1单位冲击的反应”
代码示例:
# 获取VAR模型残差的标准差 resid_sd <- sqrt(diag(Var1$sigma)) # 调整已有的默认IRF结果 Var1irf_adjusted <- Var1irf # 遍历每个IRF组件,除以标准差 for (i in seq_along(Var1irf_adjusted$irf)) { Var1irf_adjusted$irf[[i]] <- Var1irf_adjusted$irf[[i]] / resid_sd }
这样调整后的Var1irf_adjusted就是1单位冲击对应的脉冲响应结果了。
内容的提问来源于stack exchange,提问作者Joe94
相关产品推荐
相关产品推荐

