代码之家  ›  专栏  ›  技术社区  ›  Noah

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

  •  0
  • Noah  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Noah    6 年前

    在卡洛斯和其他人的帮助下,我找到了我想要的东西。诚如卡洛斯所说,密度的平滑度通常反映了样本的大小,但在我的例子中,我想要的是两个密度的带宽是相同的;特别是,我想要它们是较小的组的带宽。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

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

        2
  •  0
  •   Carlos Eduardo Lagosta    6 年前

    “平滑度”不是一个参数,是估计带宽的结果。你可以用 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,6,6,6,6)不同。在第一种情况下,很有可能存在未采样的中间值。在第二种情况下,数据很可能以间隔出现。