如何在ggplot2中使不同大小的密度具有相同的平滑度?

时间:2018-07-14 17:21:19

标签: r ggplot2 density-plot

我有一个数据集,其中包含一个要显示其密度的连续变量和一个我想用于拆分密度的分组变量。当组的大小相似时,密度图可以很好地显示出来:

library(ggplot2)
data("lalonde", package = "cobalt")
ggplot(lalonde, aes(x = educ, fill = factor(treat))) + 
   geom_density(alpha = .5)

enter image description here

现在,假设我的小组人数不同,但是每个小组中每个变量的相对频率相同。在下面的示例中,我简单地复制了一个组中的行多次,而另一个组则保持原样。

bigll <- do.call("rbind", c(list(lalonde), replicate(100, 
             lalonde[lalonde$treat == 0,], simplify = FALSE)))
ggplot(bigll, aes(x = educ, fill = factor(treat))) + 
       geom_density(alpha = .5)

enter image description here

它看起来不那么光滑。有没有一种方法可以将平滑度参数按组调整为,以便第二个图看起来更像第一个图?也就是说,我可以将平滑度参数更改为最低的公分母,以便可以更容易地在视觉上比较密度吗?

2 个答案:

答案 0 :(得分:1)

在@Carlos和其他人的帮助下,我找到了想要的东西。诚然,密度的平滑度通常应反倒卡洛斯(Carlos)提到的样本大小,但在我的情况下,我想要的是使两个密度的带宽相同。特别是,我希望他们成为较小的团体的成员。 ggplot2中的默认带宽为bw.nrd0;我可以在较小的组中使用它,然后将其设置为绘图的全局带宽。

bw <- bw.nrd0(bigll$educ[bigll$treat == 1])
ggplot(bigll, aes(x = educ, fill = factor(treat))) + 
       geom_density(alpha = .5, bw = bw)

enter image description here

这肯定掩盖了较大版本中的某些细节,但就我的目的而言,这已经足够了。

答案 1 :(得分:0)

“平滑度”不是参数,而是估计带宽的结果。您可以使用adjust通过乘数来更改带宽,从而增加两组的平滑度:

ggplot(bigll, aes(x = educ, fill = factor(treat))) + 
  geom_density(alpha = .5, adjust = 2)

enter image description here

按照该逻辑,您可以分别绘制每个组并为每个组应用不同的乘数:

ggplot() + 
  geom_density(
    aes(x = educ),
    data = subset(bigll, treat == 0),
    fill = '#EB675F', alpha = .5,
    adjust = 3) +
  geom_density(
    aes(x = educ),
    data = subset(bigll, treat == 1),
    fill = '#35C1C4', alpha = .5,
    adjust = 1.5)

enter image description here

这是一个简单的解决方案。请查看此帖子,以获取有关如何使用更好的函数为每个组计算值的建议:Understanding bandwidth smoothing in ggplot2

但是在分析数据时要小心。当您将其中一组乘以一个较大的粗糙度时,可以正确反映所做的更改。由(2,4,6)形成的一组数据与(2,2,2,2,4,4,4,4,4,6,6,6,6)不同。在第一种情况下,很有可能会有未采样的中间值。在第二种情况下,数据很有可能会定期出现。