使用depmixS4的模型中的“ if(!all(pars <1e-06))pars [pars <1e-06] <-0中的错误”错误

时间:2019-06-24 11:16:48

标签: r glm model-fitting

问题

我想在r中使用depmixS4包运行潜在类分析。尝试仅使用一个类(或depmixS4包中的状态)拟合模型时出现问题。当我尝试使用6000个案例的数据集调整模型时,出现以下错误。但是,当案例为5000时,就没有问题。

library(depmixS4)
#> Loading required package: nnet
#> Loading required package: MASS
#> Loading required package: Rsolnp
a <- sample(0:1, size = 6000, replace = T)
b <- sample(0:1, size = 6000, replace = T)

foo_large <- data.frame(a,b)

set.seed(123)
mod1 <- mix(response = list(a~1, b~1),
            data=foo_large, # the dataset to use
            nstates=1, # the number of latent classes
            family=list(multinomial("identity"),multinomial("identity")))

fmod1 <- fit(mod1, verbose=TRUE)
#> Error in if (!all(pars < 1e-06)) pars[pars < 1e-06] <- 0: missing value where TRUE/FALSE needed

问题出在哪里?有人可以帮助我了解为什么会发生此错误吗?

可复制的示例

案例A(n = 6000) 对于偶然变量,也会发生相同的情况。为了有一个可重现的示例,首先我生成一个数据集(n = 6000 ),该数据集包含两个随机变量(a和b)以及两个可能的值(0和1)。

library(depmixS4)
#> Loading required package: nnet
#> Loading required package: MASS
#> Loading required package: Rsolnp
c <- sample(0:1, size = 5000, replace = T)
d <- sample(0:1, size = 5000, replace = T)

foo_short <- data.frame(c,d)

set.seed(123)
mod1 <- mix(response = list(c~1, d~1),
            data=foo_short, # the dataset to use
            nstates=1, # the number of latent classes
            family=list(multinomial("identity"),multinomial("identity")))

fmod1 <- depmixS4::fit(mod1, verbose=TRUE)
#> iteration 0 logLik: -6928.943 
#> converged at iteration 1 with logLik: -6928.943

案例B(n = 5000)但是,对于数据集(n = 5000 ),该数据集具有两个随机变量,它们的特征与先前的特征相同,因此没有错误。

$.ajax({
   url: url + file,
   data:base64content,
   type: 'PUT',
   crossDomain: true,
   headers:{'content-type':'image/png'},
   xhrFields:{withCredentials: true}
});

1 个答案:

答案 0 :(得分:1)

我做了一些挖掘工作,并且出现错误似乎是由于depmixS4提供了用于初始化EM算法的随机起始值的方式(它会为具有Dirichlet分布的类成员生成随机概率,而我们用来从该分布中绘制的代码不会对于一维Dirichlet效果不佳)。我们将在即将发布的版本中解决此问题。目前,您可以使用以下方法运行EM,而无需使用随机起始值:

fmod1 <- fit(mod1, emcontrol=em.control(random.start=FALSE), verbose=TRUE)

这在您的两个示例中均有效。

请注意,此问题不是由于观察数(n = 5000)(n = 6000)的不同而引起的。代码收敛为(n = 6000)是使用set.seed(123)的幸运巧合。删除此行后,您很可能会得到与(n = 6000)相同的错误。如果您设置了set.seed(1234),您可能恰好开始使用后者。