You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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单位冲击的结果:

  1. 先提取VAR模型中残差的估计标准差
  2. 将每个脉冲响应值除以对应的标准差,就能把“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:02:31