count/value ("binned") 数据的概率密度图

Probability density plots from count/value ("binned") data

我有一个包含 2700 万个样本的数据集每天。我可以使用 count() 将其减少到每天 1500 个样本,而不会丢失。

例如,当我绘制直方图时,我可以使用 stat="identity" 比原始数据更快地处理计数数据。

有没有类似的方法,利用ggridges::geom_density_ridges()处理计数数据得到脊线,或者类似的方法,不用处理原始数据集就可以得到概率密度?

听起来您当前的 set-up 是这样的(显然有更多的情况):一个包含大量数值测量向量的数据框,至少有一个分组变量来指定不同的脊线。

出于演示目的,我们将坚持使用 2000 个样本而不是 2700 万个样本:

set.seed(1)

df <- data.frame(x = round(c(rnorm(1000, 35, 5), rnorm(1000, 60, 12))),
                 group = rep(c('A', 'B', 'C'), len = 2000))

我们可以使用 count 将这 2000 个观察值减少到 ~200 个,并使用 stat = 'identity' 绘制 geom_histogram:

df %>%
  group_by(x, group) %>%
  count() %>%
  ggplot(aes(x, y = n, fill = group)) + 
  geom_histogram(stat = 'identity', color = 'black')

但我们想根据这 200 行计数而不是原始数据创建密度脊线。当然,我们可以 uncount 它们并正常创建密度脊线,但这会非常低效。我们可以做的是使用计数作为密度计算的权重。似乎 geom_density_ridges 不接受 weight 参数,但 stat_density 接受,你可以告诉 it 使用 density_ridges几何。这允许我们将我们的计数作为密度计算的权重。

library(ggridges)

df %>%
  group_by(x, group) %>%
  count() %>%
  ggplot(aes(x, fill = group)) +
  stat_density(aes(weight = n, y = group, height = after_stat(density)), 
               geom = 'density_ridges', position = 'identity')

请注意,这应该给我们与在计数之前从我们的整个数据集中创建一个 ridgleine 相同的结果,因为我们的 'bins' 是唯一的间隔值。如果您的真实数据在计数之前对连续数据进行分箱,则在使用计数数据时,您的核密度估计会稍微不准确,具体取决于 'thin' 您的分箱情况。