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

walmes . walmeszeviani em gmail.com
Sexta Agosto 29 11:32:09 BRT 2014


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.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20140829/5a67c73b/attachment.html>


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