
Caros colegas, estou com um problema que não consigo resolver... Na verdade acredito que já identifiquei o problemas, mas não sei como contornar esse tipo de situação no R. É o seguinte estou maximizando a função de log-verossimilhança de uma dist. de probabilidade, com o intuito de estimar os parâmetros da dist. Entretanto a otimização não está convergindo para o parâmetro conhecido. Essa dist. possui dois parâmetros, onde um deles o "z" assume valores menores que 2, e o outro parâmetro "eta" assume valores maiores que 0. Consegui simular situações para os casos que tenho 1<z<2 e para 0<z<1, entretanto para valores negativos de z, não estou conseguindo convergência para o parâmetro. Estou usando a função optim() do R, selecionando nessa função o método de Nelder-Mead (já usei outros métodos e nenhum convergiu). O problema que ocorre é que para z negativo, durante as iterações ocorrem o cálculo de logaritmos cujos argumentos estão com valores negativos, tenho quase certeza que o problema da não convergência está aí, aí eu gostaria de saber se tem como colocar alguma restrição durante o processo de iteração para que os argumentos das funções logarítmicas nunca sejam valores negativos. A seguir coloco o código que estou usando: ############################################## ##### Fornecendo os parâmetros ############################## n<-50 z<--1.95 eta<-0.1 z.est=vector() eta.est=vector() p=1 while (p<1001) { ###### Gerando valores da varíavel cujos parâmetros são z e eta u<-runif(n) y = eta*((1-(u)^((1-z)/(2-z)))/(1-z)) #### Obtendo as estimativas para z e eta ######################################## vero <- function(par,x){ z = par[1] eta = par[2] saida<-((sum(log(1 - ((1 - z)*x*(1/eta)))))/(1 - z)) + ((n)*log(2 - z)) + (n*log(1/eta)) return(-saida) } saida1<-optim(par=c(-1,4),fn=vero, method="Nelder-Mead",x=y ) z.est[p]<-saida1[1]$par[1] eta.est[p]<-saida1[1]$par[2] p=p+1 } mean(z.est) mean(eta.est) ############################################## Como estou replicando o procedimento mil vezes, irei utilizar a média das 1000 estimativas encontradas para z e para eta... Então fazendo isso tenho a seguinte saída:
mean(z.est) [1] -30177882
mean(eta.est) [1] 964132.7
Conforme observamos as estimativas estão muito distantes dos parâmetros reais definidos no início do código (z = -1.95 e eta = 0.1). Dessa forma, desconfio que o problema seja decorrente dos vários erros de logaritmos, que se repetem durante a interação e são da seguinte forma: 1: In log(1 - ((1 - z) * x * (1/eta))) : NaNs produzidos Então tem alguma forma de controlar esse problema que ocorre durante a interação??? Tenho que fazer de alguma forma com que os argumentos fiquem sempre positivos, ou seja: (1-((1-z)*x*(1/eta))) tem que ser sempre positivo... Por favor, caso vcs possam me ajudar, eu agradeço imensamente. Att, Romero.