Làm thế nào để tính phân phối tích lũy trong R?


23

Tôi cần tính toán hàm phân phối tích lũy của một mẫu dữ liệu.

Có cái gì đó tương tự như hist () trong R để đo hàm mật độ tích lũy không?

Tôi đã thử ecdf () nhưng tôi không thể hiểu logic.

Câu trả lời:


32

Các ecdfchức năng áp dụng cho một lợi nhuận mẫu dữ liệu một chức năng đại diện cho hàm phân phối tích lũy kinh nghiệm. Ví dụ:

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

nhập mô tả hình ảnh ở đây

Nếu bạn muốn có một đối tượng đại diện cho CDF theo kinh nghiệm được đánh giá ở các giá trị cụ thể (chứ không phải là một đối tượng chức năng) thì bạn có thể làm

> 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

Lưu ý rằng pcó chứa nhiều nhất cùng một lượng thông tin như P(và có thể nó chứa ít hơn) mà lần lượt chứa cùng một lượng thông tin như X.


Có tôi biết, nhưng làm thế nào có thể truy cập các giá trị của ecdf? đây là một bí ẩn đối với tôi
emanuele

2
Nếu bạn muốn giá trị của nó tại xbạn chỉ cần viết P(x). Lưu ý rằng đó xcó thể là một vectơ (xem vài câu cuối cùng trong câu trả lời của tôi.)
Chris Taylor

@ChrisTaylor Thuật ngữ chính xác là hàm phân phối tích lũy theo kinh nghiệm chứ không phải hàm mật độ.
Michael R. Chernick

1

Những gì bạn dường như cần là để có được phân phối được tính toán (xác suất nhận được giá trị <= x trên một mẫu), ecdf trả về cho bạn một hàm, nhưng dường như nó được tạo ra để vẽ đồ thị, và do đó, đối số của hàm đó , nếu đó là một cầu thang, sẽ là chỉ số của guồng.

Bạn có thể sử dụng điều này:

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.

Đáng buồn là việc sử dụng chức năng này không nhanh lắm. Tôi không biết nếu R có chức năng này sẽ trả lại cho bạn một chức năng, điều đó sẽ hiệu quả hơn.


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

1

Tôi luôn luôn thấy ecdf()có một chút khó hiểu. Thêm vào đó tôi nghĩ rằng nó chỉ hoạt động trong trường hợp đơn biến. Thay vào đó, tôi đã tự mình thực hiện chức năng này.

Đầu tiên cài đặt data.table . Sau đó cài đặt gói của tôi, mltools (hoặc chỉ sao chép phương thức empirical_cdf () vào môi trường R của bạn.)

Sau đó, nó dễ dàng như

# 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 của một vectơ

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 của cột 'x' của 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 của các cột 'x' và 'y' của 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

bạn, bạn có thể đọc mã trên blog này.

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

biết thêm chi tiết có thể được tìm thấy trên liên kết sau:

r cdf và biểu đồ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.