簡體   English   中英

R:mix()在mixdist包中返回錯誤

[英]R: mix() in mixdist package returning error

我在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。

我很感激任何幫助來解決這個錯誤。

謝謝,

使用您鏈接的測試數據

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包在這種情況下不起作用。 您可能希望與軟件包維護人員聯系,以了解他們是否了解該問題。 在此期間,您將需要找到另一種方法來估計混合模型的參數。

現在,我不是混合發行版的專家,但我認為@ MrFlick接受的答案對於搜索錯誤消息的人來說有點誤導(盡管毫無疑問,他給出的例子是正確的)。 核心問題是,在您的鏈接代碼和示例中,與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

在此輸入圖像描述

一個底線:如果您可以增加起始參數西格瑪值, mix函數可能會為您找到合理的估計值。 您不一定要嘗試其他包。

此外,如果數據集中缺少數據,則可以收到此消息。

從示例集

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,:參數中缺少值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM