Как рассчитать совокупное распределение в R?

23

Мне нужно рассчитать интегральную функцию распределения выборки данных.

Есть ли что-то похожее на hist () в R, которое измеряет функцию кумулятивной плотности?

У меня есть попытки ecdf (), но я не могу понять логику.

Emanuele
источник

Ответы:

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? это загадка для меня
Эммануил
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 функция, которая делает это, возвращая вам функцию, которая была бы более эффективной.

Casas
источник
3
Вы, кажется, перепутали ECDF с его инверсией. Rдействительно, вычисляет ECDF: его аргумент является потенциальным значением случайной величины и возвращает значения в интервале . Это легко проверить. Например, возвращает . Обобщенной инверсией ECDF является квантильная функция, реализованная в . [0,1]ecdf(c(-1,0,3,9))(8)0.75quantileR
whuber
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

более подробную информацию можно найти по следующей ссылке:

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

CrossWorld2
источник