¿Cómo manejar adecuadamente Infs en una función estadística?

8

Supongamos que tengo una función como:

f <- function(x){
  exp(x) / (1 + exp(x))
}

se supone que funciona para cualquier valor real de x, pero en realidad devuelve NaN cuando x es 710 o mayor. Me pregunto cuál es la forma correcta de manejar este problema. Me doy cuenta de que es fácil hacer que solo devuelva 1, pero tal vez no sea un buen comportamiento desde el punto de vista de un estadístico. ¿Alguien tiene algunos comentarios o sugerencias?

David Z
fuente
No sé si podría confiar en las estimaciones de parámetros basados ​​en modelos con valores de influencia tan altos en la función. Puede esperar que sus algoritmos estándar de Newton-Raphson le den estimaciones de parámetros sin sentido con tales valores dexcomo predictor lineal en modelos de regresión logística. Las proporciones de probabilidades se pueden informar como valor infinito. Además, creo que puede invertir la prueba de puntuación para obtener un intervalo de confianza válido para el odds ratio.
AdamO
Realmente depende de a qué propósito se están volcando los valores. exp(x)/(1+exp(x)) para grande x va a 1exp(x); Esto puede ser útil para algunos propósitos y no muy bueno para otros.
Glen_b -Reinstate Monica el

Respuestas:

11

En este caso, NaNse devuelve (no un número) porque el cálculo de los desbordamientos exponenciales en aritmética de doble precisión.

Una expresión algebraicamente equivalente, expandida en una serie de MacLaurin alrededor 0, es

exp(x)1+exp(x)=11+exp(x)=1exp(x)+exp(2x).

Debido a que esta es una serie alterna, el error cometido al descartar cualquier término no es mayor que el tamaño del siguiente término. Así cuandox>710, el error no es mayor que exp(710)1030821024 relativo al valor verdadero. Eso es mucho más preciso de lo que debe ser cualquier cálculo estadístico, por lo que está bien reemplazando el valor de retorno por1 en esta situación.

Curiosamente, Rno producirá un NaNcuando el exponencial se desborde . Por lo tanto, podría elegir la versión más confiable del cálculo, según el signo de x, como en

f <- function(x) ifelse(x < 0, exp(x) / (1 + exp(x)), 1 / (1 + exp(-x)))

Este problema aparece en casi todas las plataformas informáticas (aún no he visto una excepción) y variarán en la forma en que manejan los desbordamientos y los desbordamientos. Los exponenciales son conocidos por crear este tipo de problemas, pero no están solos. Por lo tanto, no es suficiente tener una solución R: un buen estadístico comprende los principios de la aritmética informática y sabe cómo usarlos para detectar y solucionar las idiosincrasias de su entorno informático.

whuber
fuente
1
Puede valer la pena señalar que cuando x<36 más o menos, 1+exp(x) evaluará a 1( exactamente ) debido al redondeo de coma flotante. Del mismo modo, cuandox>36, 1+exp(x) evalúa a exp(x), de donde el cociente produce un valor exacto de1. Los problemas de precisión cuando|x|>710son astronómicamente más pequeños!
whuber
1

Otros ya han discutido los problemas computacionales, por lo que se los dejaré Dado que supongo que está trabajando con R, pensé en señalar que el paquete de arranque viene con su propia función de logit inverso para su uso que es bastante estable desde el punto de vista computacional:

require(boot) inv.logit(710)

parece evaluar a 1 según lo deseado.

Samuel Benidt
fuente
1
O si desea evitar la introducción de una dependencia de paquete, plogis(710)logra el mismo resultado. (De hecho, inv.logites solo un alias para plogis.)
orizon