调用VARselect选择时间序列滞后阶数时出现NAs in y报错
VARselect 报 NAs in y 错误的原因与解决方法 这个报错的触发逻辑非常直接:你传入函数的时间序列对象dset中存在缺失值(NA),VAR类模型计算需要完整的连续观测序列,存在缺失时会直接终止运行抛出该错误。
结合你贴的代码,缺失值通常来自以下几种情况:
- 原始数据框
PAISES_ANUAL本身存在缺失:你调用的MK、GDP PC、DCPS等9个变量中,至少有一个列存在空值、或者用非数值占位符(比如"-"、"/"、"无数据"这类字符串)标记的缺失记录,转成时间序列时会被自动识别为NA - 不同变量的时间覆盖范围不一致:比如部分变量的有效观测是1990-2021年,另一部分是1993-2023年,用
cbind拼接不同长度的时间序列时,时间不匹配的位置会自动填充NA - 带空格的列名调用出错:你用到的
GDP PC列名带空格,如果attach绑定数据时出现索引异常,可能会生成全为NA的无效序列 - 不推荐长期使用
attach()绑定数据,很容易出现变量名冲突、调用到内存中同名旧变量的问题,这类隐式错误很难排查。
排查步骤
先运行以下代码定位缺失值位置,不要直接猜问题:
# 统计每个变量的缺失值数量 colSums(is.na(dset)) # 定位存在缺失值的行对应的年份 time(dset)[which(rowSums(is.na(dset)) > 0)]
修复方案
根据排查到的缺失位置对应处理即可:
- 如果缺失值出现在序列首尾:是不同变量时间长度不匹配导致的,直接截取所有变量都有有效观测的共同时间区间即可,比如确认1995-2020年所有变量无缺失,就用
dset_clean <- window(dset, start = 1995, end = 2020)截取后再传入VARselect - 如果缺失值零散出现在序列中间:可以根据你的数据属性选择线性插值、临近值填充等方法补全,或者直接删除缺失值所在的时间段,确保传入模型的序列没有NA即可
- 如果某一列全是NA:检查列名调用是否正确,尤其是带空格的
GDP PC列,建议放弃attach写法,显式引用数据框列,比如ARGDP.ts <- ts(PAISES_ANUAL$GDP PC, start = 1990, frequency = 1),避免索引错误。
内容的提问来源于stack exchange,提问作者Amanda VA
相关产品推荐
相关产品推荐

