You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于状态数迭代马尔可夫切换向量自回归(VAR)函数?

扩展马尔可夫切换VAR函数至支持多状态的实现方案

原代码通过硬编码case_when分支仅支持2种状态,要适配任意数量的状态,核心是避免固定状态的硬编码,用动态匹配的方式处理不同状态的常数项。以下是两种高效的实现方式:

方法一:状态索引直接匹配(推荐)

利用状态值作为索引,直接提取对应状态的常数项,无需编写多个分支,代码简洁且支持任意数量的状态:

# 假设:
# - constant是矩阵,每一列对应一个状态的常数项(列数=状态数)
# - states是向量,每个元素为当前时间步的状态(取值1到n_states)

for (i in 2:length(states)){
  current_state <- states[i]
  y[, i] <- constant[, current_state] + theta %*% (y[, (i-1)] - mean) + et[, i]
}

说明

  • 只要states中的取值范围是1到状态总数,且constant的列数与状态数一致,就能自动适配3种及以上的状态。
  • 这种方法避免了冗余的条件判断,运行效率更高。

方法二:动态生成case_when分支

如果需要保留case_when的结构,可以通过动态生成条件分支来适配多状态:

n_states <- ncol(constant)

for (i in 2:length(states)){
  # 动态生成每个状态的条件与表达式
  case_branches <- lapply(1:n_states, function(s) {
    rlang::expr(states[[i]] == !!s ~ constant[, !!s] + theta %*% (y[, (i-1)] - mean) + et[,i])
  })
  
  y[, i] <- dplyr::case_when(!!!case_branches)
}

说明

  • 用rlang::expr和非标准求值(!!、!!!)动态构建每个状态的分支,无需手动添加新状态的代码。
  • 这种方法适合需要额外状态判断逻辑的场景,但代码复杂度高于索引匹配法。

内容的提问来源于stack exchange,提问作者Sheila Murunga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:45:28