Suponha que eu tenha uma função como:
f <- function(x){
exp(x) / (1 + exp(x))
}
ele deve funcionar com qualquer valor real de x, mas na verdade ele retorna NaN quando x é 710 ou maior. Gostaria de saber qual é a maneira correta de lidar com esse problema. Sei que é fácil fazê-lo retornar apenas 1, mas talvez não seja um bom comportamento do ponto de vista estatístico. Alguém tem algum comentário ou sugestão?
Respostas:
Nesse caso, o
NaN
(não é um número) é retornado porque o cálculo do exponencial transborda em aritmética de precisão dupla.Curiosamente,
R
não produzirá umNaN
quando o exponencial for insuficiente . Assim, você pode escolher a versão mais confiável do cálculo, dependendo do sinal dex
, como emEsse problema aparece em quase todas as plataformas de computação (ainda não vi uma exceção) e elas variam na maneira como lidam com estouros e subfluxos. Os exponenciais são notórios por criar esses tipos de problemas, mas não estão sozinhos. Portanto, não basta apenas ter uma solução
R
: um bom estatístico entende os princípios da aritmética computacional e sabe como usá-los para detectar e solucionar as idiossincrasias de seu ambiente de computação.fonte
Outros já discutiram as questões computacionais, então deixarei isso para eles. Como suponho que você esteja trabalhando com R, pensei em apontar que o pacote de inicialização vem com sua própria função de logit inversa para você usar, que é bastante computacionalmente estável:
require(boot) inv.logit(710)
parece avaliar para 1 como desejado.
fonte
plogis(710)
obtém o mesmo resultado. (De fato,inv.logit
é apenas um pseudônimo paraplogis
.) #