含外生变量的VECM模型IRF绘制问题(R语言)
纳入外生变量绘制VECM的脉冲响应函数(IRF)
可以纳入外生变量绘制IRF,但你当前的方法存在问题:vec2var基于仅含内生变量的协整检验结果生成VAR,这个VAR模型不包含外生变量,因此IRF无法体现外生变量的影响。正确的做法是基于你已经估计好的**包含外生变量的VECM模型(est_tsdyn1)**直接计算IRF,具体方案如下:
方案1:直接用tsdyn包的irf函数计算IRF
tsdyn包的VECM对象支持直接计算包含外生变量的IRF,既可以控制外生变量的影响(即IRF反映内生变量对内生脉冲的响应,同时保持外生变量不变),也可以将外生变量作为脉冲变量,观察其对内生变量的冲击效果。
代码示例:
# 基于含外生变量的VECM计算内生变量的IRF(控制外生变量影响) irf_result <- irf(est_tsdyn1, response = "log_msci", impulse = c("log_gdp", "log_cci", "log_interest_rate"), boot = TRUE, ci = 0.95) # 绘制IRF plot(irf_result, ylab = "MSCI") # 可选:将外生变量作为脉冲,观察其对内生变量的响应 irf_result_exog_impulse <- irf(est_tsdyn1, response = "log_msci", impulse = c("log_gdp", "log_cci", "log_interest_rate", "trade.balance", "inflation"), boot = TRUE, ci = 0.95) plot(irf_result_exog_impulse, ylab = "MSCI")
方案2:将含外生变量的VECM转换为VAR后计算IRF
如果偏好使用vars包的irf函数,需要先将包含外生变量的VECM转换为带外生变量的VAR。由于vec2var不支持直接处理外生变量,你可以从est_tsdyn1中提取模型信息手动构造varest对象,或者直接用vars::VAR函数估计包含外生变量的无约束VAR(注意:无约束VAR和VECM的系数约束不同,结果会有差异)。
代码示例(直接估计带外生变量的VAR):
library(vars) # 估计包含外生变量的VAR(滞后阶数与VECM一致,VECM的lag是差分滞后,VAR的p是原变量滞后,这里p=lag+1=3) var_with_exog <- VAR(df11[, c("log_msci", "log_gdp", "log_cci", "log_interest_rate")], p = 3, exogen = df11[, c("trade.balance", "inflation")]) # 计算并绘制IRF suppressWarnings({ plot(irf(var_with_exog, response = "log_msci", impulse = c("log_gdp", "log_cci", "log_interest_rate"), boot = TRUE, ci = 0.95), ylab = "MSCI") })
关键说明
- 你之前用
conin_test1做协整检验时仅用了内生变量,因此vec2var生成的VAR不含外生变量,无法用于绘制包含外生变量的IRF。 - 优先使用方案1,因为它基于你已经估计好的带约束的VECM模型,结果更符合协整关系的设定;方案2的无约束VAR是另一种模型设定,适用于不需要协整约束的场景。
内容的提问来源于stack exchange,提问作者Laura_777
相关产品推荐
相关产品推荐

