在软件包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中达到的迭代而没有收敛”提取为数字。
收敛返回值在功能fit
中分配。您可以使用
getMethods("fit", signature = "mix")
并寻找优化器Rdonlp2::dolnp2
,rsolnp
和solnp
。
黑客可以从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)