4

我已经在 R 中安装了 mixdist 包来组合发行版。具体来说,我正在使用该mix()功能。请参阅文档。 基本上,我得到

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

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

我的第一个参数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。

我将不胜感激在解决此错误方面的任何帮助。

谢谢,

4

3 回答 3

5

使用您链接到的测试数据

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") 

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

该数据的问题在于两组之间的概率在某些时候变得无法区分。然后发生这种情况,算法的“E”步骤无法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包在这种情况下不起作用。您可能希望联系包维护者,看看他们是否知道这个问题。同时,您将需要找到另一种方法来估计混合模型的参数。

于 2014-07-07T18:35:08.110 回答
4

现在,我不是混合分布方面的专家,但我认为@MrFlick 接受的答案对于任何在谷歌上搜索错误消息的人来说都有点误导(尽管对于他给出的例子来说无疑是正确的)。核心问题是,在您的链接代码和示例中,与sigma值相比,值都非常小mu。我认为该算法无法找到具有如此小的起始 sigma 值的解决方案。如果增加 sigma 值,您将得到解决方案。以链接代码为例:

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

在此处输入图像描述

底线:如果您可以增加起始参数的 sigma 值,mix函数可能会为您找到合理的估计值。您不一定要尝试其他软件包。

于 2016-11-01T15:28:14.043 回答
2

此外,如果您的数据集中缺少数据,您也会收到此消息。

从示例集

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,:参数中缺少值

于 2017-11-16T12:53:09.600 回答