我想绘制数据,使得在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)

你看!内核平滑直方图!
我知道这个长期的回复并不是您问题的真正答案,但也许它会提供一些有关如何滥用您的数据的创意.
您可以通过调用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)
