Reputation: 2010
I'm trying to fit simple hidden markov models in R using depmix. But I sometimes get obscure errors (Na/NaN/Inf in foreign function call). For instance
require(depmixS4)
t = data.frame(v=c(0.0622031327669583,-0.12564002739468,-0.117354660120178,0.0115062213361335,0.122992418345013,-0.0177816909620965,0.0164821157439354,0.161981367176501,-0.174367935386872,0.00429417498601576,0.00870091566593177,-0.00324734222267713,-0.0609817740148078,0.0840679943325736,-0.0722982123741866,0.00309386232501072,0.0136237132601905,-0.0569072400881981,0.102323872007477,-0.0390675463642003,0.0373248728294635,-0.0839484669503484,0.0514620475651086,-0.0306598076180909,-0.0664992242224042,0.826857872461293,-0.172970803143762,-0.071091459861684,-0.0128631184461384,-0.0439382422065227,-0.0552809574423446,0.0596321725192134,-0.06043926984848,0.0398700063815422))
mod = depmix(response=v~1, data=t, nstates=2)
fit(mod)
...
NA/NaN/Inf in foreign function call (arg 10)
And I can have input of almost identical size and complexity work fine...Is there a preferred tool to depmixS4 here?
Upvotes: 4
Views: 2822
Reputation: 177
There is no guarantee that the EM algorithm can find a fit for every dataset given an arbitrary number of states. For example were you to try fit a 2 state gaussian model to data generated from a Poisson distribution with lambda = 1 you would receive the same error.
set.seed(3)
ydf <- data.frame(y=rpois(100,1))
m1 <- depmix(y~1,ns=2,family=gaussian(),data=ydf)
fit(m1)
iteration 0 logLik: -135.6268
iteration 5 logLik: -134.2392
iteration 10 logLik: -128.7834
iteration 15 logLik: -111.5922
Error in fb(init = init, A = trDens, B = dens, ntimes = ntimes(object), :
NA/NaN/Inf in foreign function call (arg 10)
With regards to your data, you can fit a model to your data just fine with 1 state. With 2 states the algorithm cannot find a solution (even with 10000 random starts). For 3 states, the issue seems to be with the initialization of the starting states of the model. If one attempts to run the same model 100 times with the data you provided you get a convergence in some of the 100 iterations. Example below:
>require(depmixS4)
>t = data.frame(v=c(0.0622031327669583,-0.12564002739468,-0.117354660120178,0.0115062213361335,0.122992418345013,-0.0177816909620965,0.0164821157439354,0.161981367176501,-0.174367935386872,0.00429417498601576,0.00870091566593177,-0.00324734222267713,-0.0609817740148078,0.0840679943325736,-0.0722982123741866,0.00309386232501072,0.0136237132601905,-0.0569072400881981,0.102323872007477,-0.0390675463642003,0.0373248728294635,-0.0839484669503484,0.0514620475651086,-0.0306598076180909,-0.0664992242224042,0.826857872461293,-0.172970803143762,-0.071091459861684,-0.0128631184461384,-0.0439382422065227,-0.0552809574423446,0.0596321725192134,-0.06043926984848,0.0398700063815422))
>mod = depmix(response=v~1, data=t, nstates=2)
>fit(mod)
...
NA/NaN/Inf in foreign function call (arg 10)
>replicate(100, try(fit(mod, verbose = F)))
[[1]]
[1] "Error in fb(init = init, A = trDens, B = dens, ntimes = ntimes(object), : \n NA/NaN/Inf in foreign function call (arg 10)\n"
[[2]]
[1] "Error in fb(init = init, A = trDens, B = dens, ntimes = ntimes(object), : \n NA/NaN/Inf in foreign function call (arg 10)\n"
[[3]]
Convergence info: Log likelihood converged to within tol. (relative change)
'log Lik.' 34.0344 (df=14)
AIC: -40.0688
BIC: -18.69975
... output truncated
Upvotes: 2