R语言stochvol包svsample()拟合后获取残差报错问题
stochvol包
svsample()对象残差获取问题解决 报错根因
该报错与R版本无关,是stochvol包内置resid()方法的实现缺陷:方法内部默认object$latent为纯数值矩阵,未兼容当前版本中该字段返回mcmc类或其他非纯矩阵结构的情况,直接对非纯数值类型做转置、除法运算时,触发二元运算符参数类型不匹配的报错。
快速修复方案
可通过字段类型强制转换的方式绕过问题,直接复用包内置的残差计算逻辑,操作代码如下:
# 将latent字段强制转换为普通数值矩阵 modStoch$latent <- as.matrix(modStoch$latent) # 正常调用残差计算函数 res <- resid(modStoch)
手动计算残差的替代方案
若需要灵活控制残差计算逻辑,可基于随机波动率模型的定义手动推导计算,逻辑与包内置方法完全等价:
- SV模型观测方程为 $y_t = \exp(h_t/2) \cdot \varepsilon_t$,其中$h_t$为对数潜波动率,$\varepsilon_t$为服从标准正态分布的扰动项,对应的标准化残差即为$\varepsilon_t = y_t / \exp(h_t/2)$
- 提取
svsample()输出中潜波动率$h_t$的后验均值作为点估计:h_point_est <- colMeans(modStoch$latent) - 代入公式计算残差:
res_manual <- y / exp(h_point_est / 2)
扩展用法说明
若需要基于潜变量后验分布的其他分位数计算残差,只需将colMeans替换为对应分位数的计算逻辑即可,例如按后验2.5%分位数计算残差:
h_low_est <- apply(modStoch$latent, 2, quantile, probs = 0.025) res_quantile <- y / exp(h_low_est / 2)
上述两种方式得到的残差,与包内置
resid()方法正常运行时的输出结果完全一致。
内容的提问来源于stack exchange,提问作者Javier Rionegro
相关产品推荐
相关产品推荐

