Wie gehe ich mit Infs in einer statistischen Funktion richtig um?


8

Angenommen, ich habe eine Funktion wie:

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

Es soll für jeden realen Wert von x funktionieren, aber tatsächlich gibt es NaN zurück, wenn x 710 oder größer ist. Ich frage mich, wie ich dieses Problem richtig behandeln kann. Mir ist klar, dass es einfach ist, nur 1 zurückzugeben, aber aus der Sicht eines Statistikers ist es vielleicht kein gutes Verhalten. Hat jemand Kommentare oder Vorschläge?


Ich weiß nicht, ob ich modellbasierten Parameterschätzungen mit so hohen Einflusswerten in der Funktion vertrauen kann. Sie können erwarten, dass Ihre Standard-Newton-Raphson-Algorithmen unsinnige Parameterschätzungen mit solchen Werten von als linearem Prädiktor in logistischen Regressionsmodellen liefern . Quotenverhältnisse können als unendlich bewertet werden. Darüber hinaus glaube ich, dass Sie den Score-Test invertieren können, um ein gültiges Konfidenzintervall für das Odds Ratio zu erhalten. x
AdamO

exp(x)/(1+exp(x))x1exp(x)

Antworten:


11

In diesem Fall wird die NaN(keine Zahl) zurückgegeben, da die Berechnung der exponentiellen Überläufe in Arithmetik mit doppelter Genauigkeit erfolgt.

0

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

x>710exp(710)1030821024 1

Interessanterweise Rwird kein erzeugt, NaNwenn das Exponential unterläuft . Sie können also einfach die zuverlässigere Version der Berechnung auswählen, abhängig vom Vorzeichen von x, wie in

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

Dieses Problem tritt auf fast allen Computerplattformen auf (ich habe noch keine Ausnahme gesehen) und sie unterscheiden sich darin, wie sie mit Über- und Unterläufen umgehen. Exponentiale sind dafür berüchtigt, solche Probleme zu verursachen, aber sie sind nicht allein. Daher reicht es nicht aus, nur eine Lösung zu finden R: Eine gute Statistikerin versteht die Prinzipien der Computerarithmetik und weiß, wie sie diese verwenden kann, um die Eigenheiten ihrer Computerumgebung zu erkennen und zu umgehen.


1
x<361+exp(x)1x>361+exp(x)exp(x)1|x|>710
whuber

1

Andere haben die Rechenprobleme bereits besprochen, deshalb überlasse ich das ihnen. Da ich davon ausgehe, dass Sie mit R arbeiten, dachte ich, ich möchte darauf hinweisen, dass das Boot-Paket über eine eigene inverse Logit-Funktion verfügt, die Sie verwenden können und die ziemlich rechenstabil ist:

require(boot) inv.logit(710)

scheint wie gewünscht auf 1 zu bewerten.


1
Wenn Sie die Einführung einer Paketabhängigkeit vermeiden möchten, plogis(710)erzielen Sie das gleiche Ergebnis. (In der Tat inv.logitist nur ein Alias ​​für plogis.)
Orizon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.