如何提取depmixs4 fit.mod中1&0形式的收敛信息?

How to extract converge information in depmixs4 fit.mod in the form of 1 & 0?

在包depmixs4中,HMM的收敛信息显示在print(fit.mod)中。 但是我正在尝试提取价值。例如,当它收敛时我得到 1。当它不收敛时我得到 0。

这样当它不收敛的时候我可以自动换成状态更少的HMM。 但是我没有在手册中找到解决方案。

    for(i in 3000:(length(p[,2])-252*5)){
  mod <- depmix(p[(i):(252*5-1+i),2] ~ 1, data = p[(i):(252*5-1+i),], nstates = 3, family = gaussian())
  #set.seed(1)
  fit.mod <- fit(mod)}

print(fit.mod) 会得到

print(fit.mod)
Convergence info: 'maxit' iterations reached in EM without convergence. 
'log Lik.' 3478.027 (df=14)
AIC:  -6928.053 
BIC:  -6856.109 

问题是将信息 "iterations reached in EM without convergence" 提取为数字。

收敛 return 值在函数 fit 中赋值。您可以使用

查看代码中的确切位置
getMethods("fit", signature = "mix")

并寻找优化器 Rdonlp2::dolnp2rsolnpsolnp.

黑客可以从 fit 编辑的对象 return 和 grepl 适当的字符串中提取槽 message

converged <- function(object, numeric = TRUE){
  msg <- object@message
  if(numeric) as.integer(grepl("converged", msg)) else msg
}

converged(fm)
#[1] 1

作为测试对象 fm 我使用了来自 help('fit') 的示例。

library(depmixS4)

data(speed) 
mod <- depmix(list(rt~1,corr~1),data=speed,nstates=2,
              family=list(gaussian(),multinomial("identity")),ntimes=c(168,134,137))
# print the model, formulae and parameter values
mod
set.seed(1)
# fit the model by calling fit
fm <- fit(mod, verbose = TRUE)