Проблема сходимости при подборе HMM с фиксированной ковариационной матрицей с использованием пакета R depmixS4 - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь установить HMM с фиксированной ковариационной матрицей, но столкнулся с некоторыми проблемами, которые я не могу понять. Буду признателен за любую помощь!

В качестве эксперимента я сначала подгоняю HMM с данными испытаний.

Затем я использую параметры в ранее подобранной модели в качестве начальных значений для нового процесса подгонки. Но ковариационные матрицы в каждом состоянии фиксированы.

Для запуска функции требуется несколько минут. Предполагается, что результат будет очень близок к первой подобранной модели, поскольку все остается таким же, за исключением ограничений на фиксированное значение. Но, как показано в разделе результатов #test, они очень разные.

Что еще хуже, больше проблем возникает, когда тестовая ковариационная матрица более сложна.

Я просто не могу понять это. У кого-нибудь есть ключ? Заранее спасибо!

    library(tidyr)
    library(bayesSurv)
    library(Matrix)
    library(depmixS4)

#data for test
y <- rbind(rMVNorm(500,seq(-0.49,0.5,0.01)[1:100],diag(c(rep(0.003,50),rep(0.007,50)))),
           rMVNorm(500,seq(-0.39,0.6,0.01)[1:100],diag(0.005,100)))
num_assets <- length(y[1,])
num_state <- 2

# now use makeDepmix to create a depmix model for this normal timeseries
# response is a list of response models. 
rModels <-  list()
for(i in 1:num_state){
  rModels[[i]] <- list(MVNresponse(y~1))
}

#trstart=c(0.9,0.1,0.1,0.9)        

transition <- list()
for(i in 1:num_state){
  transition[[i]] <- transInit(~1,nstates = num_state,data = data.frame(1),pstart = c(0.8,rep(0.2/(num_state-1),num_state-1)))
}

instart=runif(num_state)
inMod <- transInit(~1,ns=num_state,ps=instart,data=data.frame(1))        

mod <- makeDepmix(response=rModels,transition=transition,prior=inMod)        

#fit model
fm3 <- fit(mod,emc=em.control(random=FALSE),trace =FALSE)      

#check parameter numbering
setpars(mod, value = 1:npar(mod))
setpars(mod, getpars(mod, which = "fixed"))

#use previous fitted model as initial value
pars <- c(unlist(getpars(fm3)))

#fix parameters of covariance matrices, number 1 is fixed and 0 is free
conpat <- rep(0,length(pars))
for(i in 1:num_state){
  conpat[(num_state+num_state^2+i*num_assets+1+(i-1)*(sum(seq(1,num_assets,1)))):(num_state+num_state^2+i*num_assets+i*(sum(seq(1,num_assets,1))))] <- 
    1
}

#substitute value Inf, if necessary
pars[which(pars==Inf)] <- 0

#fit model
fm4 <- setpars(mod,pars)

fm5 <- fit(fm4,fixed = conpat,verbose =FALSE) #"equal" for equality constraint
#fm5 <- fit(fm4,equal = conpat,emcontrol=em.control(random.start = TRUE,tol = 10^(-100)),solnpcntrl = list(tol=1e-100,delta=1e-20,rho=50,trace=TRUE)) #"equal" for equality constraint

#test result, doesn't comply
fm5@response[[1]][[1]]@parameters$coefficients/fm3@response[[1]][[1]]@parameters$coefficients
...