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

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_laglapply生成的列表,每个元素对应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_tsvar_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

火山引擎 最新活动