Оценка максимального правдоподобия в симуляционном исследовании с R - PullRequest
0 голосов
/ 25 октября 2018

Я генерирую 10000 значений из своего дистрибутива и сохраняю в объекте val_1.Затем я сохранил val_1 в объекте pop.
Затем оценил параметр того же распределения в исследовании повторной выборки без.итераций 5000 и размер выборки 100. Ниже код дал следующую ошибку:

Error in optim(par = starts, fn = likelihood, x = data, method = "BFGS",  : 
non-finite finite-difference value [1]
In addition:   
There were 50 or more warnings (use warnings() to see the first 50)

Мой код:

set.seed(83)
pop <- val_1
head(pop)
sam.size <- 100
sam <- sample(pop, sam.size, replace = T)
length(sam)
nsims <- 5000
bs <-array(0,dim=c(nsims ,4))
for(i in 1:nsims)  {   #bs sims
    bs.sam.ind <- sample(1:sam.size, sam.size, replace = T)
    repest<- (goodness.fit(pdf = pdf_ngexp , cdf = cdf_ngexp,
    starts = c(1,1,1,1), sam[bs.sam.ind], method = "BFGS",
    domain = c(0,Inf),mle = NULL, lim_inf = c(0,0,0,0),
    lim_sup = c(2,2,2,2), S = 250, prop=0.1, N=50))
    bs[i,] <-  repest$mle
     }
    head(bs);tail(bs) 
   > head(bs)
      [,1]      [,2]     [,3]     [,4]
[1,] 1.3047830 2.0713999 1.615993 1.953030
[2,] 0.3889123 0.1611767 6.671304 4.033765
[3,] 0.7419812 0.7278994 2.856462 3.914601
[4,] 0.6067144 0.1701769 2.512169 3.086249
[5,] 0.9250573 1.1543839 3.925454 9.867746
[6,] 0.4469384 0.1334538 4.648391 4.711571
 > tail(bs)
    [,1] [,2] [,3] [,4]
[4995,]    0    0    0    0
[4996,]    0    0    0    0
[4997,]    0    0    0    0
[4998,]    0    0    0    0
[4999,]    0    0    0    0
[5000,]    0    0    0    0

1 Ответ

0 голосов
/ 25 октября 2018

У нас нет ваших данных, поэтому мы не можем воспроизвести ошибку.Но вот общий способ отладки таких проблем:

  • Сохраните набор данных, вызвавший ошибку.Это все еще может быть в переменных, построенных в цикле;если нет, добавьте сообщения печати в свой цикл, чтобы вы могли выяснить, какая итерация вызывает его, выполнить снова и остановиться на неправильной итерации.(Хорошо, что у вас есть set.seed(83); без set.seed() этот шаг может быть очень трудным.)

  • Подтвердите, что вы по-прежнему получаете ту же ошибку, начиная с неверного набора данных.Надеемся, что в этом нет ничего случайного.

  • Теперь, используя неверный набор данных, попробуйте отладку goodness.fit непосредственно в этом наборе данных.Сделайте это, позвонив debug(goodness.fit), а затем повторив вызов из вашего цикла.Найдите, какое утверждение в этой функции не выполнено, и повторите этот процесс: сохраните все отправляемые ему данные, подтвердите, что ошибка воспроизводима и т. Д.

  • В какой-то момент вы сузилисьот ошибки до ее причины.Затем вам нужно решить, была ли это вызвана ошибкой в ​​вашем коде, ошибкой в ​​коде пакета, или это просто неизбежно.

...