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?
Antworten:
In diesem Fall wird die
NaN
(keine Zahl) zurückgegeben, da die Berechnung der exponentiellen Überläufe in Arithmetik mit doppelter Genauigkeit erfolgt.Interessanterweise
R
wird kein erzeugt,NaN
wenn das Exponential unterläuft . Sie können also einfach die zuverlässigere Version der Berechnung auswählen, abhängig vom Vorzeichen vonx
, wie inDieses 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.quelle
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.
quelle
plogis(710)
erzielen Sie das gleiche Ergebnis. (In der Tatinv.logit
ist nur ein Alias fürplogis
.)