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

问题描述 投票:0回答:1

在软件包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 

问题是将信息“在EM中达到的迭代而没有收敛”提取为数字。

r hidden-markov-models
1个回答
0
投票

收敛返回值在功能fit中分配。您可以使用

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

并寻找优化器Rdonlp2::dolnp2rsolnpsolnp

黑客可以从message返回的对象中提取插槽fit,并从grepl返回适当的字符串。

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)
© www.soinside.com 2019 - 2024. All rights reserved.