我想绘制数据,使得在y轴上存在概率(在范围[0,1]中)并且在x轴上我具有数据值。数据是连续的(也在范围[0,1]中),因此我想使用一些核密度估计函数并对其进行归一化,使得某个点x处的y值意味着在输入中看到值x的概率数据
所以,我想问:
a)一点都合理吗?据我所知,我不可能看到数据中没有的值,但我只想在使用核密度估计函数的点之间进行插值,然后将其标准化。
b)我可以使用的ggplot中是否有任何内置选项可以覆盖geom_density()的默认行为,例如这样做?
提前致谢,
蒂莫
编辑: 当我之前说“正常化”时,我实际上是指“规模”。但我得到了答案,所以谢谢你们清理我的想法。
答案 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('')
这种方式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")
密度函数有一个相当智能的带宽计算器,您可以借用:
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")
嘿,看!内核平滑直方图!
我知道这个长期回复并不是您问题的真正答案,但也许它会提供一些有关如何滥用您的数据的创意。
答案 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")