Bagaimana cara menghitung distribusi kumulatif dalam R?

23

Saya perlu menghitung fungsi distribusi kumulatif dari sampel data.

Apakah ada sesuatu yang mirip dengan hist () dalam R yang mengukur fungsi kepadatan kumulatif?

Saya sudah mencoba ecdf () tetapi saya tidak dapat memahami logikanya.

emanuele
sumber

Jawaban:

32

The ecdffungsi diterapkan pada data sampel kembali sebuah fungsi yang mewakili fungsi distribusi kumulatif empiris. Sebagai contoh:

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

masukkan deskripsi gambar di sini

Jika Anda ingin memiliki objek yang mewakili CDF empiris dievaluasi pada nilai-nilai tertentu (bukan sebagai objek fungsi) maka Anda dapat melakukan

> 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

Catatan yang pberisi paling banyak jumlah informasi yang sama P(dan mungkin mengandung lebih sedikit) yang pada gilirannya mengandung jumlah informasi yang sama X.

Chris Taylor
sumber
Ya saya tahu, tetapi bagaimana mungkin mengakses nilai-nilai ecdf? ini adalah misteri bagiku.
emanuele
2
Jika Anda ingin nilainya, xtulis saja P(x). Catatan yang xbisa menjadi vektor (lihat beberapa kalimat terakhir dari jawaban saya.)
Chris Taylor
@ ChrisTaylor Terminologi yang benar adalah fungsi distribusi kumulatif empiris bukan fungsi kepadatan.
Michael R. Chernick
1

Apa yang Anda tampaknya perlu adalah ini untuk mendapatkan distribusi terakumulasi (probabilitas mendapatkan nilai <= daripada x pada sampel), ecdf mengembalikan Anda fungsi, tetapi tampaknya dibuat untuk memplot, dan argumen dari fungsi itu , jika itu adalah tangga, akan menjadi indeks tapak.

Anda bisa menggunakan ini:

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.

Sayangnya penggunaan fungsi ini tidak terlalu cepat. Saya tidak tahu jika R memiliki fungsi yang mengembalikan fungsi Anda, itu akan lebih efisien.

Casas
sumber
3
Anda tampaknya mencampur ECDF dengan kebalikannya. Rmemang, menghitung ECDF: argumennya adalah nilai potensial dari variabel acak dan mengembalikan nilai dalam interval . Ini sudah diperiksa. Misalnya, kembali . Kebalikan umum dari ECDF adalah fungsi kuantil, diimplementasikan oleh dalam . [0,1]ecdf(c(-1,0,3,9))(8)0.75quantileR
whuber
1

Saya selalu merasa ecdf()sedikit membingungkan. Ditambah lagi, saya pikir itu hanya berfungsi dalam kasus univariat. Akhirnya menggulung fungsi saya sendiri untuk ini sebagai gantinya.

Pertama instal data.table . Kemudian instal paket saya, mltools (atau salin saja metode empirical_cdf () ke lingkungan R. Anda.)

Maka semudah itu

# 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 suatu vektor

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 kolom 'x' dari 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 kolom 'x' dan 'y' dari 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
sumber
1

teman, Anda dapat membaca kode di blog ini.

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

lebih detail dapat ditemukan di tautan berikut:

r cdf dan histogram

CrossWorld2
sumber