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

如何在R的KFAS包中用fitSSM随机初始化估计Ht和Qt矩阵

使用KFAS包通过随机初始值优化状态空间模型估计

核心解决方案

fitSSM默认使用固定初始值做优化,容易陷入局部最优。我们可以通过多轮随机初始化+追踪最优似然结果的方式解决这个问题:每次从多元均匀分布生成一组初始值,调用fitSSM拟合,最后保留似然值最大的模型结果。

完整代码实现

library(KFAS)

# 替换成你的实际观测数据
set.seed(123)
dt <- rnorm(100)

# 定义状态空间模型基础结构
Zt <- matrix(c(1,rep(0,8)),1,9)
Tt <- t(matrix(c(rep(0,8),1,1,rep(0,9),1,rep(0,9),1,rep(0,9),1,rep(0,9),1,rep(0,9),1,rep(0,9),1,rep(0,9),1,0),9,9))
Rt <- matrix(c(1, rep(0,8)), 9,1)
Ht <- matrix(NA)
Qt <- matrix(NA)
P1 <- 10^(6)*diag(1,9,9)
a1 <- matrix(c(rep(0,9)),9,1)
P1inf <- diag(0,9,9)

model <- SSModel(dt~-1+SSMcustom(Z = Zt, T = Tt, R = Rt, Q = Qt, P1 = P1,a1=a1,P1inf=P1inf), H = Ht)

# --------------------------
# 随机初始化多轮拟合逻辑
# --------------------------
# 根据观测数据方差设置初始值范围(可根据实际情况调整)
var_dt <- var(dt)
init_lower <- c(Ht = 0, Qt = 0)
init_upper <- c(Ht = var_dt*2, Qt = var_dt*2)

# 设置拟合轮数
n_trials <- 20

# 初始化最优结果存储变量
best_loglik <- -Inf
best_fit <- NULL

set.seed(456) # 固定种子保证结果可复现
for(i in 1:n_trials){
  # 生成多元均匀分布初始值
  inits <- runif(n = 2, min = init_lower, max = init_upper)
  names(inits) <- c("Ht", "Qt")
  
  # 尝试拟合模型(捕获错误避免中断循环)
  current_fit <- try(fitSSM(model, inits = inits, method = "BFGS"), silent = TRUE)
  
  # 更新最优结果
  if(!inherits(current_fit, "try-error")){
    current_loglik <- current_fit$loglik
    if(current_loglik > best_loglik){
      best_loglik <- current_loglik
      best_fit <- current_fit
      cat("第", i, "次拟合得到更优似然值:", round(current_loglik, 2), "\n")
    }
  } else {
    cat("第", i, "次拟合失败\n")
  }
}

# 基于最优结果执行滤波和平滑
if(!is.null(best_fit)){
  out <- KFS(best_fit$model, filtering = "state", smoothing = "state")
} else {
  stop("所有拟合尝试均失败,请检查模型结构或初始值范围")
}

fitSSM中updatefn和optim参数详解

1. updatefn:自定义参数到模型的映射

默认情况下,fitSSM会自动将inits中的参数填充到模型的NA矩阵中。但如果需要对参数做约束(比如强制方差为正),就需要自定义这个函数:

# 示例:用指数转换保证Ht/Qt为正数
update_fn <- function(pars, model){
  # pars是优化器传入的无约束参数,转换为正数后赋值给模型
  model$H[] <- exp(pars[1])
  model$Q[] <- exp(pars[2])
  model
}
# 此时inits需要传入对数化的初始值
fit <- fitSSM(model, inits = c(log(0.1), log(0.1)), updatefn = update_fn, method = "BFGS")

这个函数的核心是把优化过程中的无约束参数,转换成模型需要的合法格式。

2. optim:优化器控制参数

这个参数直接传递给R基础包的optim函数,用来设置优化的细节:

fit <- fitSSM(model, inits = c(Ht=0,Qt=0), method = "BFGS",
              optim = list(maxit = 1000, reltol = 1e-8))
  • maxit:设置最大迭代次数
  • reltol:设置收敛的相对容差
  • 其他参数可参考?optim的文档

补充提示

  • 初始值范围要结合观测数据的方差调整,避免取值过于极端导致拟合失败
  • 增加n_trials的数值可以提高找到全局最优的概率,但会增加计算时间
  • 如果模型中的Ht/Qt是多维矩阵,只需调整runif的维度和updatefn中的赋值逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:15:15