Вероятность построения плотностей / массовая функция набора данных в R - PullRequest
19 голосов
/ 07 августа 2011

У меня есть набор данных, и я хочу проанализировать эти данные с помощью функции плотности вероятности или функции массы вероятности в R, я использовал функцию плотности, но она не дала мне вероятности.

мои данные были такими:

"step","Time","energy"
1, 22469 , 392.96E-03
2, 22547 , 394.82E-03
3, 22828,400.72E-03
4, 21765, 383.51E-03
5, 21516, 379.85E-03
6, 21453, 379.89E-03
7, 22156, 387.47E-03
8, 21844, 384.09E-03
9 , 21250, 376.14E-03
10,  21703, 380.83E-03

Я хочу перевести PDF / PMF в вектор энергии, данные, которые мы принимаем во внимание, являются дискретными по своей природе, поэтому у меня нет специального типа для распределения данных.

1 Ответ

30 голосов
/ 08 августа 2011

Ваши данные выглядят далеко не дискретно для меня. Ожидание вероятности при работе с непрерывными данными совершенно неверно. density() дает вам эмпирическую функцию плотности, которая приближается к истинной функции плотности. Чтобы доказать, что это правильная плотность, мы рассчитываем площадь под кривой:

energy <- rnorm(100)
dens <- density(energy)
sum(dens$y)*diff(dens$x[1:2])
[1] 1.000952

Учитывая некоторую ошибку округления. площадь под кривой суммирует до единицы, и, следовательно, результат density() соответствует требованиям PDF.

Используйте probability=TRUE параметр hist или функцию density() (или оба)

Например:

hist(energy,probability=TRUE)
lines(density(energy),col="red")

дает

enter image description here

Если вам действительно нужна вероятность для дискретной переменной, вы используете:

 x <- sample(letters[1:4],1000,replace=TRUE)
 prop.table(table(x))
x
    a     b     c     d 
0.244 0.262 0.275 0.219 

Редактировать: иллюстрация, почему наивное count(x)/sum(count(x)) не является решением. Действительно, это не потому, что значения бинов суммируются в единицу, что делает область под кривой. Для этого вам нужно умножить на ширину «бункеров». Возьмем нормальное распределение, для которого мы можем рассчитать PDF, используя dnorm(). Следующий код создает нормальное распределение, вычисляет плотность и сравнивает с простым решением:

x <- sort(rnorm(100,0,0.5))
h <- hist(x,plot=FALSE)
dens1 <-  h$counts/sum(h$counts)
dens2 <- dnorm(x,0,0.5)

hist(x,probability=TRUE,breaks="fd",ylim=c(0,1))
lines(h$mids,dens1,col="red")
lines(x,dens2,col="darkgreen")

Дает:

enter image description here


Совокупная функция распределения

В случае, если @Iterator был прав, довольно просто построить интегральную функцию распределения по плотности. CDF является неотъемлемой частью PDF. В случае дискретных значений это просто сумма вероятностей. Для непрерывных значений мы можем использовать тот факт, что интервалы для оценки эмпирической плотности равны, и рассчитать:

cdf <- cumsum(dens$y * diff(dens$x[1:2]))
cdf <- cdf / max(cdf) # to correct for the rounding errors
plot(dens$x,cdf,type="l")

Дает:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...