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

时间:2011-02-17 18:52:35

标签: r ggplot2

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

所以,我想问:

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

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

提前致谢,

蒂莫

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

3 个答案:

答案 0 :(得分: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('')

enter image description here

这种方式ggplot2的binwidth由density函数计算,后者也是在具有良好透明度的直方图的顶部绘制的。但是你应该查看stat_densitiy,因为@yesterday建议进一步定制。

答案 1 :(得分:10)

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

从一些合成数据开始:

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

enter image description here

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

bw <- density(randomData)$bw
resample <- sample( randomData, 10000, replace=TRUE)

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

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

enter image description here

嘿,看!内核平滑直方图!

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

答案 2 :(得分: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")

enter image description here