R'deki kümülatif dağılım nasıl hesaplanır?


23

Bir veri örneğinin kümülatif dağılım fonksiyonunu hesaplamam gerekiyor.

R'deki hist () 'e kümülatif yoğunluk fonksiyonunu ölçen benzer bir şey var mı?

Ecdf () denedim ama mantığı anlayamıyorum.

Yanıtlar:


32

ecdfFonksiyon, bir veri örneği döner bir uygulanan fonksiyon ampirik kümülatif dağılım fonksiyonu temsil etmektedir. Örneğin:

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

görüntü tanımını buraya girin

Ampirik CDF'yi temsil eden bir nesnenin belirli değerlerde (bir işlev nesnesi olarak değil) değerlendirilmesini istiyorsanız, o zaman

> 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

Not polarak en fazla bilgi aynı miktarda içerir Psırayla gibi bilgiler, aynı miktarda içeren (ve muhtemelen daha az içerir) X.


Evet biliyorum ama ecdf değerlerine nasıl erişebilirim? bu benim için bir gizem.
emanuele,

2
Size değerini istiyorsanız, xsadece yazın P(x). Not xbir vektör olabilir (benim cevap cümlelerin son çift görüyorum.)
Chris Taylor

@ChrisTaylor Doğru terminoloji, yoğunluk işlevi değil deneysel kümülatif dağılım işlevidir.
Michael R. Chernick

1

İhtiyacınız olan şey, birikmiş dağıtımı elde etmek için (örnekte bir x değerinden <= olması olasılığı), ecdf size bir işlev döndürür, ancak bu, işlemek için yapılmış gibi görünmektedir. Bir merdiven olsaydı, sırtın endeksi olurdu.

Bunu kullanabilirsiniz:

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.

Ne yazık ki bu fonksiyonun kullanımı çok hızlı değil. R'nin size bir işlev döndüren bir işlevi olup olmadığını bilmiyorum, bu daha verimli olur.


3
R[0,1]ecdf(c(-1,0,3,9))(8)0.75quantileR

1

Her zaman ecdf()biraz kafa karıştırıcı buldum . Artı, sadece tek değişkenli durumda işe yaradığını düşünüyorum. Bunun yerine kendi işlevimi yuvarlamayı bıraktım.

İlk önce data.table'ı kurun . Sonra benim paketi, mltools yükleyin (veya sadece empirical_cdf () yöntemini R ortamınıza kopyalayın .)

O zaman bu kadar kolay

# 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

Bir vektörün CDF'si

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

Dt'nin 'x' sütununun CDF'si

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

Dt'nin 'x' ve 'y' sütunlarının CDF'si

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

arkadaşım, bu blogdaki kodu okuyabilirsin.

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

daha fazla ayrıntı aşağıdaki linkte bulunabilir:

r cdf ve histogram

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.