Wie berechnet man die kumulative Verteilung in R?


23

Ich muss die kumulative Verteilungsfunktion einer Datenprobe berechnen.

Gibt es in R etwas Ähnliches wie hist (), das die kumulative Dichtefunktion misst?

Ich habe versucht, ecdf (), aber ich kann die Logik nicht verstehen.

Antworten:


32

Die ecdfauf eine Datenprobe angewendete Funktion gibt eine Funktion zurück, die die empirische kumulative Verteilungsfunktion darstellt. Beispielsweise:

> X = rnorm(100) # X is a sample of 100 normally distributed random variables
> P = ecdf(X)    # P is a function giving the empirical CDF of X
> P(0.0)         # This returns the empirical CDF at zero (should be close to 0.5)
[1] 0.52
> plot(P)        # Draws a plot of the empirical CDF (see below)

Bildbeschreibung hier eingeben

Wenn Sie ein Objekt haben möchten, das die empirische CDF darstellt, die bei bestimmten Werten ausgewertet wird (und nicht als Funktionsobjekt), können Sie dies tun

> z = seq(-3, 3, by=0.01) # The values at which we want to evaluate the empirical CDF
> p = P(z)                # p now stores the empirical CDF evaluated at the values in z

Beachten Sie, dass phöchstens die gleiche Menge an Informationen wie P(und möglicherweise weniger) enthält, die wiederum die gleiche Menge an Informationen wie enthalten X.


Ja, ich weiß, aber wie ist es möglich, auf die Werte von ecdf zuzugreifen? Das ist ein Rätsel für mich.
Emanuele

2
Wenn Sie seinen Wert an möchten, xschreiben Sie einfach P(x). Beachten Sie, dass xdies ein Vektor sein kann (siehe die letzten paar Sätze meiner Antwort.)
Chris Taylor

@ChrisTaylor Die korrekte Terminologie ist die empirische kumulative Verteilungsfunktion, nicht die Dichtefunktion.
Michael R. Chernick

1

Was Sie anscheinend brauchen, ist dies, um die akkumulierte Verteilung zu erhalten (Wahrscheinlichkeit, einen Wert <= als x für eine Stichprobe zu erhalten), ecdf gibt Ihnen eine Funktion zurück, die jedoch zum Zeichnen gedacht zu sein scheint, und somit das Argument dieser Funktion Wenn es eine Treppe wäre, wäre das der Index des Schrittes.

Sie können dies verwenden:

acumulated.distrib= function(sample,x){
    minors= 0
    for(n in sample){
        if(n<=x){
            minors= minors+1
        }
    }
    return (minors/length(sample))
}

mysample = rnorm(100)
acumulated.distrib(mysample,1.21) #1.21 or any other value you want.

Leider ist die Verwendung dieser Funktion nicht sehr schnell. Ich weiß nicht, ob R eine Funktion hat, die Ihnen eine Funktion zurückgibt, die effizienter wäre.


3
Sie scheinen den ECDF mit seiner Umkehrung zu verwechseln. Rberechnet tatsächlich den ECDF: sein Argument ist ein potentieller Wert der Zufallsvariablen und gibt Werte im Intervall . Dies ist leicht zu überprüfen. Zum Beispiel kehrt zurück . Eine verallgemeinerte Inverse des ECDF ist die von in implementierte Quantilfunktion . [0,1]ecdf(c(-1,0,3,9))(8)0.75quantileR
whuber

1

Ich fand ecdf()es immer etwas verwirrend. Außerdem denke ich, dass es nur im univariaten Fall funktioniert. Ich habe dafür meine eigene Funktion übernommen.

Installieren Sie zuerst data.table . Dann installiere mein Paket, mltools (oder kopiere einfach die Methode empirical_cdf () in deine R-Umgebung.)

Dann ist es so einfach wie

# load packages
library(data.table)
library(mltools)

# Make some data
dt <- data.table(x=c(0.3, 1.3, 1.4, 3.6), y=c(1.2, 1.2, 3.8, 3.9))
dt
     x   y
1: 0.3 1.2
2: 1.3 1.2
3: 1.4 3.8
4: 3.6 3.9

CDF eines Vektors

empirical_cdf(dt$x, ubounds=seq(1, 4, by=1.0))
   UpperBound N.cum  CDF
1:          1     1 0.25
2:          2     3 0.75
3:          3     3 0.75
4:          4     4 1.00

CDF der Spalte 'x' von dt

empirical_cdf(dt, ubounds=list(x=seq(1, 4, by=1.0)))
   x N.cum  CDF
1: 1     1 0.25
2: 2     3 0.75
3: 3     3 0.75
4: 4     4 1.00

CDF der Spalten 'x' und 'y' von dt

empirical_cdf(dt, ubounds=list(x=seq(1, 4, by=1.0), y=seq(1, 4, by=1.0)))
    x y N.cum  CDF
 1: 1 1     0 0.00
 2: 1 2     1 0.25
 3: 1 3     1 0.25
 4: 1 4     1 0.25
 5: 2 1     0 0.00
 6: 2 2     2 0.50
 7: 2 3     2 0.50
 8: 2 4     3 0.75
 9: 3 1     0 0.00
10: 3 2     2 0.50
11: 3 3     2 0.50
12: 3 4     3 0.75
13: 4 1     0 0.00
14: 4 2     2 0.50
15: 4 3     2 0.50
16: 4 4     4 1.00

1

Freund, Sie können den Code auf diesem Blog lesen.

sample.data = read.table ('data.txt', header = TRUE, sep = "\t")
cdf <- ggplot (data=sample.data, aes(x=Delay, group =Type, color = Type)) + stat_ecdf()
cdf

Weitere Details finden Sie unter folgendem Link:

r cdf und histogramm

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.