了解ggplot2中的带宽平滑

时间:2014-07-27 20:28:38

标签: r ggplot2

realdata = https://www.dropbox.com/s/pc5tp2lfhafgaiy/realdata.txt

模拟= https://www.dropbox.com/s/5ep95808xg7bon3/simulation.txt

使用带宽= 1.5的此数据的密度图给出了以下图表:

prealdata = scan("realdata.txt")
simulation = scan("simulation.txt")
plot(density(log10(realdata), bw=1.5))
lines(density(log10(simulation), bw=1.5), lty=2)

enter image description here

但是使用ggplot2绘制相同的数据,带宽参数(adjust)似乎工作方式不同。为什么呢?

vec1 = data.frame(x=log10(realdata))
vec2 = data.frame(x=log10(simulation))
require(ggplot2)
ggplot() +
geom_density(aes(x=x, linetype="real data"), data=vec1, adjust=1.5) +
geom_density(aes(x=x, linetype="simulation"), data=vec2, adjust=1.5) +
scale_linetype_manual(name="data", values=c("real data"="solid", "simulation"="dashed"))

enter image description here

非常欢迎有关如何更好地平滑此数据的建议!

1 个答案:

答案 0 :(得分:6)

adjust=bw=不同。当你绘制

plot(density(log10(realdata), bw=1.5))
lines(density(log10(simulation), bw=1.5), lty=2)

你得到与ggplot

相同的东西

enter image description here

无论出于何种原因,ggplot都不允许您指定bw=参数。默认情况下,density使用bw.nrd0(),因此当您使用基本图形更改此图时,您无法使用ggplot更改此值。但是使用的是adjust*bw。因为我们知道如何计算默认bw,我们可以重新计算adjust=以使用相同的值。

#helper function
bw<-function(b, x) { b/bw.nrd0(x) }

require(ggplot2)
ggplot() +
geom_density(aes(x=x, linetype="real data"), data=vec1, adjust=bw(1.5, vec1$x)) +
geom_density(aes(x=x, linetype="simulation"), data=vec2, adjust=bw(1.5, vec2$x)) +
scale_linetype_manual(name="data", 
    values=c("real data"="solid", "simulation"="dashed"))

导致

enter image description here

与基本图形图相同。