如何基于状态数迭代马尔可夫切换向量自回归(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
相关产品推荐
相关产品推荐

