[R-br] Fit não linear com função que aprensenta singularidades.

Michelle Baú Graczyk mbgraczyk em gmail.com
Terça Setembro 2 14:36:48 BRT 2014


Muito obrigada Walmes, consegui entender e resolver o problema.

Michelle


Em 29 de agosto de 2014 11:32, walmes . <walmeszeviani em gmail.com> escreveu:

> Ele mencionou que foi no RStudio. A manipulate, assim como outros pacotes
> são instalados junto com o RStudio. Inclusive, alguns deles só funcionam
> por meio do RStudio, como é o caso da manipulate. Nas minhas tentativas há
> mais de 6 meses atrás eu não consegui usar a manipulate fora do RStudio,
> isso porque ela cria janelas para interação nativas do mesmo tipo que gera
> a interface do RStudio. Formas mais gerais de trabalhar com deslizadores,
> etc, estão disponíveis no pacote rpanel além de outros.
>
> Sobre o modelo a considerar para os dados, é como o Fernando relatou, o
> modelo não descreve o sinal dos dados. Modelo e dados são incompatíveis. Ou
> seja, o modelo não é apropriado para os dados mas isso não significa dizer
> que não seja ajustável. Ajustável quero dizer no sentido de jogar numa
> rotina de ajuste de modelos não lineares de algum aplicativo e convergir.
> Pode muito bem ter convergido para mínimo local. Se você disser o nome do
> aplicativo que ele usa (mas não diga), posso quase garantir que foi o que
> aconteceu. O fato é que não basta convergir. A regra é, depois que
> convergiu, coloque sobre os gráfico a função ajustada para ver se realmente
> faz sentido. A função que você quer usar não condiz com o sinal dos dados,
> então suspeito que você tenha que trocar de modelo. Segue CMR comentado.
>
> require(lattice)
>
> xyplot(y~x, data=dados, type=c("p","smooth"))
>
> ## O sinal do dado aponta que uma função apropriada deve apresentar
> ## concavidade para cima e ser não simétrica ao se afastar do ponto de
> ## mínimo.
>
> ## Valores iniciais.
>
> guess <- list(a=1, b=3, n=3)
>
> ## Modelo não linear.
> func <- function(x, n, a, b){
>     y <- (-(a*(x^(2*n))+b)/((x-186)*(x+186)))
>     return(y)
> }
>
> ## Gráfico da função com os valores iniciais dentro do domínio observado
> ## na amostra.
> with(guess,
>      curve(func(x, a, b, n),
>            min(dados$x), max(dados$x)))
> abline(v=186, lty=2)
>
> ## Ao fazer o estudo da função verifica-se que o denominador tende à
> ## zero quando x tende à 186, com isso, o valor da função tende ao
> ## infinito e isso independe dos parâmetros. A função tem comportamento
> ## não compatível com os dados.
>
> ## Sobrepondo dados e função a partir dos valores iniciais.
> plot(y~x, data=dados)
> with(guess,
>      curve(func(x, a, b, n),
>            add=TRUE, col=2))
> abline(v=186, lty=2)
>
> ## Lower e upper são argumentos não considerados pela nls().
>
> fit <- nls(y~func(x, n, a, b), data=dados, start=guess)
> ## Error in numericDeriv(form[[3L]], names(ind), env) :
> ##   Missing value or an infinity produced when evaluating the model
>
> ## Repare na mensagem de erro que diz **Missing value or an infinity
> ## produced**. Significa que ao avaliar as derivadas parciais do modelo
> ## com relação aos parâmetros nos valores forncecidos como chute e
> ## vindos de x, teve-se elementos NA ou Inf.
>
> f <- expression(-(a*(x^(2*n))+b)/((x-186)*(x+186)))
>
> ## Veja que ocorre um -Inf na avaliação dessas derivadas.
> d.a <- D(f, "a"); d.a
> eval(d.a, envir=c(guess, list(x=dados$x)))
> d.n <- D(f, "n"); d.n
> eval(d.n, envir=c(guess, list(x=dados$x)))
> d.b <- D(f, "b"); d.b
> eval(d.b, envir=c(guess, list(x=dados$x)))
>
> ## Essas derivadas dependem só de x e theta. Se remover o x que confere
> ## o -Inf (posição 187), aquela mensagem de erro some.
>
> dados[187,]
>
> ## Veja que o x=186 é o que faz com que o denominador seja 0 e aí o
> ## valor na função não existe nesse ponto.
>
> fit <- nls(y~func(x, n, a, b), data=dados[-187,], start=guess)
> ## Error in nls(y ~ func(x, n, a, b), data = dados[-187, ], start = guess)
> :
> ##   number of iterations exceeded maximum of 50
>
> ## Agora o erro passa a ser outro. O procedimento de iteração inicia mas
> ## para por execer o número mínimo de passos. Pedir um traço para ver
> ## por onde caminhou é útil.
>
> fit <- nls(y~func(x, n, a, b), data=dados[-187,], start=guess, trace=TRUE)
> ## ... linhas omitidas ...
> ## 744.8148 :  -7.50089e-07  1.20808e+04  2.18981e+00
> ## 743.1941 :  -8.314966e-07  1.211611e+04  2.180563e+00
> ## 741.5353 :  -9.211941e-07  1.215176e+04  2.171376e+00
> ## 739.8368 :  -1.019954e-06  1.218775e+04  2.162250e+00
> ## 738.097 :  -1.128613e-06  1.222408e+04  2.153185e+00
>
> ## Poderia-se aumentar o número de passos ou qualquer outro número para
> ## deixar fazer mais tentativas, porém, do meu ponto de vista, a função
> ## candidata não representa é capaz de representar o sinal dos
> ## dados. Minha opção seria buscar uma função apropriada.
>
> À disposição.
> Walmes.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20140902/95d7c64a/attachment.html>


Mais detalhes sobre a lista de discussão R-br