You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为VAR模型获取HAC标准误?vcovHAC维度不匹配错误求解

解决VAR模型中调用vcovHAC时的"non-conformable arguments"错误

首先,我得先点出你遇到问题的两个核心原因,然后给你对应的解决办法:

问题根源分析

  1. 样本量与滞后阶数严重不匹配
    你只有6个观测值,却选择了p=4的滞后阶数——这意味着有效样本量只剩下6-4=2个,但你的每个VAR方程里需要估计的参数有:5个变量×4阶滞后 + 1个常数项 = 21个参数!2个样本根本支撑不了这么多参数的估计,模型本身就处于无法识别的状态,这必然会导致后续的稳健方差计算出现维度不匹配的错误。

  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

火山引擎 最新活动