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