Як обчислити кумулятивний розподіл у 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може бути вектором (див. Останню пару речень моєї відповіді.)
Кріс Тейлор

@ChrisTaylor Правильна термінологія - це емпірична функція кумулятивного розподілу, а не функція щільності.
Майкл Р. Черник

1

Вам здається, що це потрібно для отримання накопиченого розподілу (ймовірність отримання значення <= ніж 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 (або просто скопіюйте метод emirical_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

Більш детальну інформацію можна знайти за наступним посиланням:

r cdf та гістограма

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.