R语言VAR模型单独运行报错:argument is of length zero 求解决建议
解决R中VAR模型单独执行报错的问题
我最近在处理VAR模型代码时遇到了一个诡异的问题:当我单独运行最后一行拟合VAR的代码时,R会抛出如下错误,但如果用Source方式运行全部代码却能正常工作。
我的代码:
unemp <- c(1:10) bsp_li <- list(c(1:10),c(11:20),c(21:30)) var_data_rep <- lapply(bsp_li, function(x) {cbind(as.numeric(x), as.numeric(unemp))} ) # 创建VAR数据矩阵 var_data_rep2 <- lapply(var_data_rep, function(x) {colnames(x) = c("rGDP", "U"); return(x)}) # 命名列名 var_data_rep_ts <- lapply(var_data_rep2, function(x) {ts(x, frequency=1, start=c(1977))} ) # 转换为时间序列对象 var_data_rep_lag <- lapply(var_data_rep_ts, function(x) {VARselect(x, lag.max = 5, type = "const")} ) # 选择SC准则最小的滞后阶数 VARgdp_rep <- lapply(var_data_rep_ts, function(x) {VAR(x, p = var_data_rep_lag$x$selection[['SC(n)']], type = "const"); return(x)} ) # 使用最小SC准则对应的滞后阶数
报错信息:
Error in if ((dimension < 1) | (dimension > n)) stop("wrong embedding dimension") : argument is of length zero Called from: embed(y, dimension = p + 1)
问题根源分析
这个错误的核心是你对var_data_rep_lag的索引方式完全错误:
var_data_rep_lag是lapply生成的列表,每个元素对应var_data_rep_ts中一个时间序列的VAR滞后阶数选择结果,列表的元素名是默认的数字索引(比如[[1]]、[[2]]),根本不存在名为x的元素。- 当你单独运行最后一行时,
var_data_rep_lag$x会返回NULL,导致VAR函数的p参数为空值,进而在内部调用embed函数时,因为dimension参数长度为0触发报错。 - 而批量运行时能正常工作,大概率是环境中残留了之前代码执行时的临时变量
x,巧合让var_data_rep_lag$x能取到值,但这是完全不可靠的偶然情况。
两种解决方法
方法1:用mapply同时遍历时间序列和滞后阶数结果
既然var_data_rep_ts和var_data_rep_lag是一一对应的两个列表,我们可以用mapply同时传入两个列表的元素,避免索引错误:
VARgdp_rep <- mapply(function(ts_data, lag_result) { # 对每个时间序列,使用对应的滞后阶数拟合VAR VAR(ts_data, p = lag_result$selection[['SC(n)']], type = "const") }, var_data_rep_ts, var_data_rep_lag, SIMPLIFY = FALSE)
SIMPLIFY = FALSE确保返回结果是列表,和原代码的输出结构一致。
方法2:合并VAR选择与拟合步骤(更简洁)
其实可以把滞后阶数选择和VAR拟合合并到同一个lapply中,这样不需要单独保存var_data_rep_lag,逻辑更清晰,也彻底避免索引问题:
VARgdp_rep <- lapply(var_data_rep_ts, function(x) { # 先在当前迭代中计算滞后阶数 lag_select <- VARselect(x, lag.max = 5, type = "const") # 用计算出的滞后阶数拟合VAR VAR(x, p = lag_select$selection[['SC(n)']], type = "const") })
内容的提问来源于stack exchange,提问作者yaennu




