<div dir="ltr"><div>Caros colegas,</div><div><br></div><div>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:</div><div><br></div><div>##############################################</div><div><br></div><div>##### Fornecendo os parâmetros</div><div>##############################</div><div>n<-50</div><div>z<--1.95</div><div>eta<-0.1</div><div>z.est=vector()</div><div>eta.est=vector()</div><div><br></div><div>p=1</div><div>while (p<1001) {</div><div><br></div><div>###### Gerando valores da varíavel cujos parâmetros são z e eta</div><div><br></div><div>u<-runif(n)<span class="" style="white-space:pre">       </span></div><div>y = eta*((1-(u)^((1-z)/(2-z)))/(1-z))</div><div><br></div><div>#### Obtendo as estimativas para z e eta</div><div>########################################</div><div><br></div><div>vero <- function(par,x){</div><div>z = par[1]</div><div>eta = par[2]</div><div>saida<-((sum(log(1 - ((1 - z)*x*(1/eta)))))/(1 - z)) + ((n)*log(2 - z)) + (n*log(1/eta))</div><div>return(-saida)</div><div>}</div><div><br></div><div>saida1<-optim(par=c(-1,4),fn=vero,</div><div>      method="Nelder-Mead",x=y</div><div>      )</div><div>z.est[p]<-saida1[1]$par[1]</div><div>eta.est[p]<-saida1[1]$par[2]</div><div>p=p+1</div><div>}</div><div>mean(z.est)</div><div>mean(eta.est)</div><div><br></div><div>##############################################</div><div><br></div><div>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:</div><div><br></div><div>> mean(z.est)</div><div>[1] -30177882</div><div><br></div><div>> mean(eta.est)</div><div>[1] 964132.7</div><div><br></div><div>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).</div><div><br></div><div><br></div><div>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:</div><div><br></div><div>1: In log(1 - ((1 - z) * x * (1/eta))) : NaNs produzidos</div><div><br></div><div><br></div><div>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...</div><div><br></div><div>Por favor, caso vcs possam me ajudar, eu agradeço imensamente.</div><div><br></div><div>Att,</div><div><br></div><div>Romero.</div><div><br></div><div class="gmail_signature"></div>
</div>