Jak obliczyć skumulowany rozkład w R?

23

Muszę obliczyć funkcję skumulowanego rozkładu próbki danych.

Czy istnieje coś podobnego do hist () w R, które mierzy funkcję gęstości skumulowanej?

Próbuję ecdf (), ale nie rozumiem logiki.

emanuele
źródło

Odpowiedzi:

32

ecdfFunkcja dodawane do próbki danych wraca do funkcji reprezentujący empiryczną dystrybuantę. Na przykład:

> 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)

wprowadź opis zdjęcia tutaj

Jeśli chcesz, aby obiekt reprezentujący empiryczny CDF był oceniany według określonych wartości (a nie jako obiekt funkcji), możesz to zrobić

> 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

Zauważ, że pzawiera co najwyżej tyle samo informacji co P(i być może zawiera mniej), co z kolei zawiera tyle samo informacji co X.

Chris Taylor
źródło
Tak, wiem, ale jak można uzyskać dostęp do wartości ecdf? to dla mnie tajemnica.
emanuele
2
Jeśli chcesz mieć na to swoją wartość x, po prostu napisz P(x). Zauważ, że xmoże to być wektor (zobacz ostatnie kilka zdań mojej odpowiedzi.)
Chris Taylor,
@ChrisTaylor Prawidłowa terminologia to empiryczna funkcja rozkładu skumulowanego, a nie funkcja gęstości.
Michael R. Chernick
1

Wydaje się, że potrzebujesz tego, aby uzyskać skumulowany rozkład (prawdopodobieństwo uzyskania wartości <= niż x na próbce), ecdf zwraca ci funkcję, ale wydaje się, że została stworzona do kreślenia, a więc argument tej funkcji , gdyby były schodami, byłyby wskaźnikiem stopnia.

Możesz użyć tego:

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.

Niestety korzystanie z tej funkcji nie jest bardzo szybkie. Nie wiem, czy R ma funkcję, która robi to, zwracając ci funkcję, która byłaby bardziej wydajna.

Casas
źródło
3
R[0,1]ecdf(c(-1,0,3,9))(8)0.75quantileR
1

Zawsze czułem ecdf()się trochę zagubiony. Plus, myślę, że to działa tylko w przypadku pojedynczego wariantu. Zamiast tego skończyło się na tym, że uruchomiłem własną funkcję.

Najpierw zainstaluj tabelę danych . Następnie zainstaluj mój pakiet, mltools (lub po prostu skopiuj metodę empirical_cdf () do swojego środowiska R.)

To takie proste

# 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 wektora

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 kolumny „x” 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 kolumn „x” i „y” z 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
Ben
źródło
1

przyjacielu, możesz przeczytać kod na tym blogu.

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

więcej szczegółów można znaleźć pod następującym linkiem:

r cdf i histogram

CrossWorld2
źródło