R: mix() в пакете mixdist возвращает ошибку

Я установил пакет mixdist в R для объединения дистрибутивов. В частности, я использую функцию 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.

Буду признателен за любую помощь в устранении этой ошибки.

Спасибо,
Н.И.


person swetharevanur    schedule 07.07.2014    source источник
comment
Создайте минимально воспроизводимый пример, чтобы мы могли копировать и вставлять код, чтобы получить ту же ошибку. Гораздо легче помочь, если мы сможем воссоздать проблему, не тратя много времени на угадывание того, какие значения на самом деле находятся в вашем конкретном datapar или как он структурирован.   -  person MrFlick    schedule 07.07.2014
comment
Я бы с удовольствием, но, к сожалению, данные, которые я использую, являются собственностью. Однако я нашел это ссылка с данными, которые дают ту же ошибку. Мой код выглядит почти так же.   -  person swetharevanur    schedule 07.07.2014


Ответы (3)


Использование тестовых данных, на которые вы ссылались

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 не будет работать в этом сценарии. Вы можете связаться с сопровождающим пакета, чтобы узнать, знают ли они о проблеме. Тем временем вам нужно будет найти другой способ оценить параметры вашей смешанной модели.

person MrFlick    schedule 07.07.2014

Теперь я не эксперт в распределении смесей, но я думаю, что принятый ответ @MrFlick немного вводит в заблуждение любого, кто гуглит сообщение об ошибке (хотя, несомненно, правильно для примера, который он привел). Основная проблема заключается в том, что в обоих случаях ваш связанный код и ваш пример, значения sigma очень малы по сравнению со значениями mu. Я думаю, что алгоритм просто не может найти решение с такими маленькими начальными значениями сигмы. Если вы увеличите значения сигмы, вы получите решение. Связанный код В качестве примера:

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 может найти для вас разумные оценки. Вам не обязательно пробовать другой пакет.

person Mikko    schedule 01.11.2016

Кроме того, вы можете получить это сообщение, если в вашем наборе данных отсутствуют данные.

Из набора примеров

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, : отсутствует значение в параметре

person Cedric    schedule 16.11.2017