R:mix()在mixdist包中返回错误

时间:2014-07-07 16:10:37

标签: r normal-distribution mixed-models nlm

我在R中安装了mixdist包来组合发行版。具体来说,我正在使用mix()函数。 See documentation. 基本上,我得到了

    Error in nlm(mixlike, lmixdat = mixdat, lmixpar = fitpar, ldist = dist, : missing value in parameter

我用Google搜索了错误消息,但没有弹出有用的结果。

我对mix()的第一个参数是一个名为data.df的数据框。它的格式与内置数据集pike65完全相同。我也做过data.df <- as.mixdata(data.df)

我的第二个参数有两行。它是一个名为datapar的数据框,格式与pikepar完全相同。我的pi值为0.5和0.5。我的mu值为250和463(基于我的数据集)。我的sigma值为0.5和1.

我对mix()的呼吁如下:
fitdata <- mix(data.df, datapar, "norm", constr = mixconstr(consigma="CCV"), emsteps = 3, print.level = 2)

打印显示我的pi值在第一次迭代后从0.5变为NaN,并且我的渐变变为0。

我很感激在解决此错误方面提供任何帮助。

谢谢,
n.i。

3 个答案:

答案 0 :(得分:4)

使用您链接的测试数据

library(mixdist) 
time <- seq(673,723) 
counts <-c(3,12,8,12,18,24,39,48,64,88,101,132,198,253,331,
   419,563,781,1134,1423,1842,2505,374,6099,9343,13009, 
   15097,13712,9969,6785,4742,3626,3794,4737,5494,5656,4806,
   3474,2165,1290,799,431,213,137,66,57,41,35,27,27,27) 
data.df <- data.frame(time=time, counts=counts) 

我们可以看到

startparam <- mixparam(c(699,707),1 )
data.fit <- mix(data.mix, startparam, "norm") 

给出同样的错误。此错误似乎与数据密切相关(因此,此数据不起作用的原因可能与您的工作不起作用的原因不同,但这是您提供的唯一示例)。

这些数据的问题在于,两组之间的概率在某些时候变得难以区分。然后就会发生这种情况,&#34; E&#34;算法的步骤无法正确估计pi变量。这里

pnorm(717,707,1)
# [1] 1
pnorm(717,699,1)
# [1] 1

两者都是1,这似乎导致错误。当mix取1减去此值并将比率与估算组进行比较时,它会获得NaN个值,这些值会传播到比例估算值。当内部这些NaN值传递给nlm()进行估算时,您会收到错误消息

Error in nlm(mixlike, lmixdat = mixdat, lmixpar = fitpar, ldist = dist,  : 
  missing value in parameter

可以使用

复制相同的错误消息
f <- function(x) sum((x-1:length(x))^2)
nlm(f, c(10,10))
nlm(f, c(10,NaN)) #error

所以看来maxdist包在这种情况下不起作用。您可能希望与软件包维护人员联系,以了解他们是否了解该问题。在此期间,您将需要找到另一种方法来估计混合模型的参数。

答案 1 :(得分:1)

现在,我不是混合发行版的专家,但我认为@ MrFlick接受的答案对于搜索错误消息的人来说有点误导(尽管毫无疑问,他给出的例子是正确的)。核心问题是,在linked code和您的示例中,与sigma值相比,mu值非常小。我认为算法无法找到具有如此小的起始sigma值的解决方案。如果您增加西格玛值,您将获得一个解决方案。以Linked code为例:

library(mixdist) 
time <- seq(673,723) 
counts <- c(3, 12, 8, 12, 18, 24, 39, 48, 64, 88, 101, 132, 198, 253, 331, 419, 563, 781, 1134, 1423, 1842, 2505, 374, 6099, 9343, 13009, 15097, 13712, 9969, 6785, 4742, 3626, 3794, 4737, 5494, 5656, 4806, 3474, 2165, 1290, 799, 431, 213, 137, 66, 57, 41, 35, 27, 27, 27) 
data.df <- data.frame(time=time, counts=counts) 
data.mix <- as.mixdata(data.df) 
startparam <- mixparam(mu = c(699,707), sigma = 1) 
data.fit <- mix(data.mix, startparam, "norm") ## Leads to the error message 

startparam <- mixparam(mu = c(699,707), sigma = 5) # Adjust start parameters
data.fit <- mix(data.mix, startparam, "norm")
plot(data.fit)
data.fit ### Estimates somewhat reasonable mixture distributions
# Parameters:
#     pi    mu sigma
# 1 0.853 699.3 4.494
# 2 0.147 708.6 2.217

enter image description here

一个底线:如果您可以增加起始参数西格玛值,mix函数可能会为您找到合理的估算值。你不一定要尝试另一个包。

答案 2 :(得分:0)

此外,如果数据集中缺少数据,则可以收到此消息。

来自示例集

data(pike65)
data(pikepar)
pike65$freq[10] <- NA
fitpike1 <- mix(pike65, pikepar, "lnorm", constr = mixconstr(consigma = "CCV"), emsteps = 3)
  

nlm中的错误(mixlike,lmixdat = mixdat,lmixpar = fitpar,ldist =   dist,:参数

中缺少值