【问题标题】:Plotting Probability Density / Mass Function of Dataset in R在 R 中绘制数据集的概率密度/质量函数
【发布时间】:2021-09-06 23:08:24
【问题描述】:

我有一个数据集,我想用 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 ;我们考虑的数据本质上是离散的,所以我没有任何特殊的数据分布类型。

【问题讨论】:

  • “概率密度函数”只是离散数据的概率,这不是密度函数所假设的。
  • 那么,你想要经验 CDF?

标签: r plot


【解决方案1】:

在我看来,您的数据远非离散。在处理连续数据时期望概率是完全错误的。 density() 给你一个经验密度函数,它接近真实的密度函数。为了证明它是一个正确的密度,我们计算曲线下的面积:

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

考虑到一些舍入误差。曲线下面积之和为 1,因此density() 的结果满足 PDF 的要求。

使用histprobability=TRUE 选项或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)) 不是解决方案。事实上,曲线下的面积并不是因为箱的值总和为 1。为此,您必须乘以“箱”的宽度。采用正态分布,我们可以使用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" 是一种更直观的方式来显示经验 cdf(不是来自密度估计),因为它给人一种在所示区间内进行采样的感觉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2011-08-11
  • 2013-01-27
  • 2016-06-07
相关资源
最近更新 更多