用ggplot2绘制概率(不是密度)

Tim*_*imo 6 r ggplot2

我想绘制数据,使得在y轴上存在概率(在范围[0,1]中)并且在x轴上我具有数据值.数据是连续的(也在范围[0,1]中),因此我想使用一些核密度估计函数并对其进行归一化,使得某个点x处的y值意味着在输入中看到值x的概率数据.

所以,我想问一下:

a)它是否合理?我知道我不可能看到数据中没有的值,但我只想在使用内核密度估计函数的点之间进行插值,然后将其标准化.

b)我可以使用的ggplot中是否有任何内置选项,这会覆盖geom_density()的默认行为,例如这样做?

提前致谢,

蒂莫

编辑:当我之前说"正常化"时,我实际上是指"规模".但我得到了答案,所以谢谢你们清理我的想法.

dar*_*zig 11

只是快速合并@JD Long和@昨天的答案:

ggplot(df, aes(x=x)) +
  geom_histogram(aes(y = ..density..), binwidth=density(df$x)$bw) +
  geom_density(fill="red", alpha = 0.2) +
  theme_bw() +
  xlab('') +
  ylab('')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这样,ggplot2通过density函数计算binwidth ,并且后者在具有良好透明度的直方图的顶部绘制.但你肯定应该调查stat_densitiy,因为@yesterday建议进一步定制.


JD *_*ong 10

这不是ggplot的答案,但如果你想把核平滑和直方图的想法结合在一起,你可以做一个自举和平滑的方法.对于像这样的丑陋事情,你会被统计人员的头部和肩膀击败,所以使用风险自负;)

从一些合成数据开始:

set.seed(1)
randomData <- c(rnorm(100, 5, 3), rnorm(100, 20, 3) )
hist(randomData, freq=FALSE)
lines(density(randomData), col="red")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

密度函数有一个相当智能的带宽计算器,您可以借用:

bw <- density(randomData)$bw
resample <- sample( randomData, 10000, replace=TRUE)
Run Code Online (Sandbox Code Playgroud)

然后使用带宽calc作为SD来产生一些随机噪声

noise <- rnorm(10000, 0, bw)
hist(resample + noise, freq=FALSE)
lines(density(randomData), col="red")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

你看!内核平滑直方图!

我知道这个长期的回复并不是您问题的真正答案,但也许它会提供一些有关如何滥用您的数据的创意.


And*_*rie 7

您可以通过调用stat_density()而不是geom_density()来控制ggplot中密度/内核估计的行为.

请参阅在线用户手册:http://had.co.nz/ggplot2/stat_density.html 您可以指定stats :: density()支持的任何内核估算函数

library(ggplot2)
df <- data.frame(x = rnorm(1000))
ggplot(df, aes(x=x)) + stat_density(kernel="biweight")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述