วิธีคำนวณการแจกแจงสะสมใน R


23

ฉันต้องการคำนวณฟังก์ชันการแจกแจงสะสมของตัวอย่างข้อมูล

มีบางอย่างที่คล้ายกับ hist () ใน R ที่วัดฟังก์ชันความหนาแน่นสะสมหรือไม่?

ฉันลอง ecdf () แต่ฉันไม่เข้าใจตรรกะ

คำตอบ:


32

ecdfฟังก์ชั่นที่ใช้กับผลตอบแทนตัวอย่างข้อมูลฟังก์ชั่นที่เป็นตัวแทนของฟังก์ชั่นการแจกแจงสะสมเชิงประจักษ์ ตัวอย่างเช่น:

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

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการให้วัตถุที่เป็นตัวแทนของ CDF เชิงประจักษ์ประเมินที่ค่าเฉพาะ (แทนที่จะเป็นวัตถุฟังก์ชั่น) จากนั้นคุณสามารถทำ

> 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

โปรดทราบว่าpมีจำนวนข้อมูลเท่ากับจำนวนมากที่สุดเท่าที่จะเป็นไปได้P(และอาจมีข้อมูลน้อยกว่า) ซึ่งจะมีข้อมูลจำนวนเท่าXกัน


ใช่ฉันรู้ แต่มันเป็นไปได้อย่างไรที่จะเข้าถึงคุณค่าของ ecdf? นี่เป็นปริศนาสำหรับฉัน
emanuele

2
หากคุณต้องการความคุ้มค่าที่คุณเพียงแค่เขียนx P(x)โปรดทราบว่าxอาจเป็นเวกเตอร์ (ดูประโยคสุดท้ายของคำตอบของฉัน)
Chris Taylor

@ChrisTaylor คำศัพท์ที่ถูกต้องคือฟังก์ชันการแจกแจงสะสมเชิงประจักษ์ไม่ใช่ฟังก์ชันความหนาแน่น
Michael R. Chernick

1

สิ่งที่คุณต้องการคือสิ่งนี้เพื่อรับการแจกแจงแบบ acumulated (ความน่าจะเป็นที่จะได้ค่า <= กว่า x ในตัวอย่าง), ecdf ส่งคืนฟังก์ชันให้คุณ แต่ดูเหมือนว่าจะเกิดขึ้นสำหรับการวางแผน ถ้าเป็นบันไดจะเป็นดัชนีของดอกยาง

คุณสามารถใช้สิ่งนี้:

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.

น่าเสียดายที่การใช้ฟังก์ชั่นนี้ไม่เร็วมาก ฉันไม่รู้ว่า R มีฟังก์ชั่นหรือไม่ที่ส่งคืนฟังก์ชันให้คุณซึ่งจะมีประสิทธิภาพมากกว่า


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

1

ฉันมักจะพบว่าecdf()มีความสับสนเล็กน้อย ฉันคิดว่ามันใช้งานได้เฉพาะในกรณีที่ไม่เปลี่ยนแปลง จบลงด้วยการหมุนฟังก์ชั่นของฉันเองสำหรับสิ่งนี้แทน

ก่อนติดตั้งdata.table จากนั้นติดตั้งแพ็คเกจของฉันmltools (หรือเพียงแค่คัดลอกวิธีempirical_cdf ()ลงในสภาพแวดล้อม R ของคุณ)

จากนั้นมันง่ายเหมือน

# 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 ของเวกเตอร์

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 ของคอลัมน์ '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 ของคอลัมน์ 'x' และ 'y' ของ 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

เพื่อนคุณสามารถอ่านรหัสในบล็อกนี้

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

รายละเอียดเพิ่มเติมสามารถดูได้ที่ลิงค์ต่อไปนี้:

cdf และฮิสโตแกรม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.