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

How do I make densities with different sizes have the same smoothness in ggplot2?

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

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

现在,假设我的组大小不同,但每个变量在每个组中的相对频率相同。在下面的示例中,我只是多次复制其中一组的行,同时保持另一组不变。

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)

看起来不太流畅。有没有办法按组调整平滑度参数,以便第二个图看起来更类似于第一个图?也就是说,我能否将平滑度参数更改为最小公分母,以便更容易地直观比较密度?

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

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

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

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)

这是一个简单的解决方案。检查此 post 以获得有关如何使用更好的函数计算每个组的值的建议:Understanding bandwidth smoothing in ggplot2

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

在@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)

这肯定会掩盖较大分布中的一些细节,但就我的目的而言,这已经足够了。