如何为VAR模型获取HAC标准误?vcovHAC维度不匹配错误求解
解决VAR模型中调用vcovHAC时的"non-conformable arguments"错误
首先,我得先点出你遇到问题的两个核心原因,然后给你对应的解决办法:
问题根源分析
样本量与滞后阶数严重不匹配
你只有6个观测值,却选择了p=4的滞后阶数——这意味着有效样本量只剩下6-4=2个,但你的每个VAR方程里需要估计的参数有:5个变量×4阶滞后 + 1个常数项 = 21个参数!2个样本根本支撑不了这么多参数的估计,模型本身就处于无法识别的状态,这必然会导致后续的稳健方差计算出现维度不匹配的错误。vars包返回的单个方程对象并非标准lm对象
varmodel$varresult$diff.data.stir虽然表面上是lm类,但它附带了VAR模型的特殊属性,和普通lm拟合出来的对象结构有差异,这会让vcovHAC(来自sandwich包)在计算面包(bread)和肉(meat)部分时出现维度不一致的问题。
分步解决方案
第一步:先解决样本量与滞后阶数的矛盾
这是最优先要处理的问题,否则任何后续操作都没有意义:
- 大幅降低滞后阶数,比如尝试
p=1,这样有效样本量是6-1=5,每个方程的参数数量是5×1+1=6(虽然样本还是偏少,但至少能完成基本估计); - 如果可能的话,增加样本量——时间序列模型对样本量的要求本来就高,尤其是要做稳健方差估计,足够的观测值是基础。
第二步:用标准lm对象重新拟合单个方程
当样本量和滞后阶数调整合理后,不要直接用vars包返回的varresult对象,而是手动生成滞后项并拟合标准lm模型,这样vcovHAC就能正常工作了。示例代码如下:
# 加载所需包 library(vars) library(sandwich) # 假设你的差分后数据框是newdata,先调整滞后阶数,比如p=1 p <- 1 # 生成所有变量的p阶滞后项 lagged_vars <- lapply(colnames(newdata), function(var) { lagmatrix(newdata[[var]], k = 1:p) }) # 合并滞后项为数据框并命名 lagged_df <- do.call(cbind, lagged_vars) colnames(lagged_df) <- paste(rep(colnames(newdata), each = p), "lag", 1:p, sep = "_") # 合并原始数据与滞后项,去掉前p行(滞后项缺失的观测) model_data <- cbind(newdata[(p+1):nrow(newdata), ], lagged_df[(p+1):nrow(newdata), ]) # 拟合diff.data.stir的单个方程 lm_stir <- lm(diff.data.stir ~ ., data = model_data) # 现在调用vcovHAC就不会报错了 vcov_hac_result <- vcovHAC(lm_stir) print(vcov_hac_result)
补充说明
你提到“不关注预测,仅探究变量间关系”,但即使如此,样本量不足的VAR模型估计结果也是不可靠的,建议尽量扩充样本。如果实在无法扩充,也可以考虑改用向量误差修正模型(VECM)的简化形式,或者直接做两两变量的格兰杰因果检验(但同样要注意样本量问题)。
内容的提问来源于stack exchange,提问作者Andrew




