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