Ваши данные выглядят далеко не дискретно для меня. Ожидание вероятности при работе с непрерывными данными совершенно неверно. 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")
дает
Если вам действительно нужна вероятность для дискретной переменной, вы используете:
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")
Дает:
Совокупная функция распределения
В случае, если @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")
Дает: