在R中绘制数据集的概率密度/质量函数

22

我有一个数据集,想在 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

我想获取 energy 向量的概率密度函数(PDF)/概率质量函数(PMF);我们考虑的数据是离散的,因此我没有数据分布的特殊类型。


1
“概率密度函数”只适用于连续数据,对于离散数据它只是一个概率,这与密度函数的假设不符。 - IRTFM
所以,您想要经验累积分布函数(ECDF)吗? - Iterator
1个回答

33

根据我的观察,你的数据似乎不是离散的。在处理连续数据时期望得到概率是明显错误的。density()函数提供了一个经验密度函数,它近似于真实密度函数。为了证明它是正确的密度,我们计算曲线下的面积:

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

由于存在一定的舍入误差,曲线下的面积总和为1,因此density()函数的输出满足概率密度函数(PDF)的要求。

使用hist函数的probability=TRUE选项或者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))不是一个解决方案。实际上,它之所以不是解决方案,是因为箱子的值加起来等于一,并不意味着曲线下面积也等于一。为了得到曲线下面积,你必须乘以“箱子”的宽度。以正态分布为例,我们可以使用dnorm()计算PDF。以下代码构造了一个正态分布,计算了密度,并将其与天真的解决方案进行了比较:

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")
给出:

在此输入图片描述


很好的解释。我认为使用 type="s" 是显示经验累积分布函数(不是从密度估计中得出的)更直观的方式,因为它给人一种在所示区间内进行抽样的感觉。 - Andy Barbour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接