2017-07-05 2 views
1

Ich möchte einige Daten, die eine Quantil-Funktion entsprechen generieren. Aber die Daten benötigen einen min und einen max Wert.R: Runif produziert NAN

set.seed(30) 
a1<-950 ; a2<-0; a3<-2.48; a4<-1.92 
invcdf<-function (x)(a1+a2*a3*((-log(x))^(1/a4)))/(a3*((-log(x))^(1/a4))+1) 
t<-invcdf(runif(2000,min=80,max=800)) 

Wenn ich min und max in der runif Funktion NaN ‚s produziert. Wie kann ich diesen Code verbessern, um NaN zu vermeiden? Ich kann die Parameter nicht ändern.

+4

Ihre 'invcdf' ist wahrscheinlich falsch und das Problem hat wenig mit "Runif" selbst zu tun. Sie sollten erkennen, dass 'invcdf' nicht für x außerhalb des (0,1) Bereichs definiert ist (siehe warum? Hinweis:' (-log (x))^(1/a4) '). – nicola

+2

https://math.stackexchange.com/questions/317528/how-do-you-compute-negative-numbers-to-fractional-powers – user20650

+0

'1/a4' ist um 0,5 und'^0,5' ist das gleiche wie die Wurzel nehmen –

Antwort

2

Da Sie nicht erklären, was genau Sie versuchen zu tun (welche Verteilung versuchen Sie zu probieren?), Alles was ich tun kann ist dies zu interpretieren als Versuch, Zufallsvariable nach einer bestimmten Verteilung mit seiner inversen CDF zu generieren Funktion. Weil ich nicht weiß, was es ist, kann ich nicht sagen, ob Ihre Implementierung korrekt ist.

Wenn Sie diese Methode verwenden, sollten Sie jedoch wissen, dass die CDF-Funktion Werte zwischen 0 und 1 annimmt, da es sich um eine kumulative Dichte handelt, die bei 0 beginnt und in einem Limit auf 1 geht.

Die Umkehrung dieser Funktion ist nur dann sinnvoll, wenn Sie Werte zwischen 0 und 1 eingeben, und dort liegt ein möglicher Fehler. runif(2000,min=80,max=800) generiert zufällige Werte zwischen 80 und 800, weit außerhalb des (0,1) Intervalls.

Wenn Sie diese stattdessen tun:

t <- invcdf(runif(2000))

Wir tun Ergebnisse (die zwischen 80 und 800 meist zu liegen kommen) erhalten:

enter image description here

Verwandte Themen