如何可视化概率分布函数之间的差异?

3
我尝试着将两个分布函数的直方图差异可视化,例如以下两条曲线的区别:
当差异很大时,你可以将两条曲线叠加在一起,并按上面所示填充差异,但是当差异变得非常小时,这种方法就不太方便。另一种绘制方式是绘制差异本身,如下所示:
然而,对于第一次看到这种图表的人来说,这似乎非常难以理解,所以我想知道:是否有其他方法可以将两个分布函数之间的差异可视化呢?

我认为这是一个有趣的问题,但它太过开放和基于个人观点,不适合在SO上讨论。(而且它也不是关于编程的。)也许在交叉验证网站上会更适合讨论? - Gregor Thomas
1
只是为了确保我们谈论的是同一件事情:您想通过考虑所述概率分布的实现的直方图来可视化概率密度函数,对吗?因为累积分布函数是完全不同的东西... - Eike P.
最好提供一些示例数据集。 - Eike P.
@jhin 有没有办法在 SO 上放置示例数据? - ruben baetens
对于小数据集,您可以始终使用 dput,但对于非常大的数据集,我不知道是否有任何特殊的方法。也许您可以将其放在 gist 上(同样使用 dput)? - Eike P.
我刚刚意识到第二张图片实际上写着“CDF差异”。这与第一张图片不一致,因为第一张图片显然没有显示CDF... - Eike P.
1个回答

3

我认为也许将您的两个提议简单地合并,同时放大差异以使其更加明显可能是一个选择。

以下是使用ggplot2尝试实现此目标。实际上,这比我最初想象的要复杂得多,我对结果肯定不是百分之百满意; 但也许它仍然有所帮助。欢迎评论和改进。

library(ggplot2)
library(dplyr)

## function that replicates default ggplot2 colors
## taken from [1]
gg_color_hue <- function(n) {
  hues = seq(15, 375, length=n+1)
  hcl(h=hues, l=65, c=100)[1:n]
}

## Set up sample data
set.seed(1)
n <- 2000
x1 <- rlnorm(n, 0, 1)
x2 <- rlnorm(n, 0, 1.1)
df <- bind_rows(data.frame(sample=1, x=x1), data.frame(sample=2, x=x2)) %>%
  mutate(sample = as.factor(sample))

## Calculate density estimates
g1 <- ggplot(df, aes(x=x, group=sample, colour=sample)) +
  geom_density(data = df) + xlim(0, 10)
gg1 <- ggplot_build(g1)

## Use these estimates (available at the same x coordinates!) for
## calculating the differences.
## Inspired by [2]
x <- gg1$data[[1]]$x[gg1$data[[1]]$group == 1]
y1 <- gg1$data[[1]]$y[gg1$data[[1]]$group == 1]
y2 <- gg1$data[[1]]$y[gg1$data[[1]]$group == 2]
df2 <- data.frame(x = x, ymin = pmin(y1, y2), ymax = pmax(y1, y2), 
                  side=(y1<y2), ydiff = y2-y1)
g2 <- ggplot(df2) +
   geom_ribbon(aes(x = x, ymin = ymin, ymax = ymax, fill = side, alpha = 0.5)) +
   geom_line(aes(x = x, y = 5 * abs(ydiff), colour = side)) +
   geom_area(aes(x = x, y = 5 * abs(ydiff), fill = side, alpha = 0.4))
g3 <- g2 + 
   geom_density(data = df, size = 1, aes(x = x, group = sample, colour = sample)) +
   xlim(0, 10) +
   guides(alpha = FALSE, colour = FALSE) +
   ylab("Curves: density\n Shaded area: 5 * difference of densities") +
   scale_fill_manual(name = "samples", labels = 1:2, values = gg_color_hue(2)) +
   scale_colour_manual(limits = list(1, 2, FALSE, TRUE), values = rep(gg_color_hue(2), 2))

print(g3)

enter image description here

来源: SO答案1SO答案2


根据评论中@Gregor的建议,这里有一个版本,它在下方绘制了两个分别独立的图表,但共享相同的x轴缩放。至少图例应该明显地调整。

library(ggplot2)
library(dplyr)
library(grid)

## function that replicates default ggplot2 colors
## taken from [1]
gg_color_hue <- function(n) {
  hues = seq(15, 375, length=n+1)
  hcl(h=hues, l=65, c=100)[1:n]
}

## Set up sample data
set.seed(1)
n <- 2000
x1 <- rlnorm(n, 0, 1)
x2 <- rlnorm(n, 0, 1.1)
df <- bind_rows(data.frame(sample=1, x=x1), data.frame(sample=2, x=x2)) %>%
  mutate(sample = as.factor(sample))

## Calculate density estimates
g1 <- ggplot(df, aes(x=x, group=sample, colour=sample)) +
  geom_density(data = df) + xlim(0, 10)
gg1 <- ggplot_build(g1)

## Use these estimates (available at the same x coordinates!) for
## calculating the differences.
## Inspired by [2]
x <- gg1$data[[1]]$x[gg1$data[[1]]$group == 1]
y1 <- gg1$data[[1]]$y[gg1$data[[1]]$group == 1]
y2 <- gg1$data[[1]]$y[gg1$data[[1]]$group == 2]
df2 <- data.frame(x = x, ymin = pmin(y1, y2), ymax = pmax(y1, y2), 
                  side=(y1<y2), ydiff = y2-y1)
g2 <- ggplot(df2) +
   geom_ribbon(aes(x = x, ymin = ymin, ymax = ymax, fill = side, alpha = 0.5)) +
   geom_density(data = df, size = 1, aes(x = x, group = sample, colour = sample)) +
  xlim(0, 10) +
  guides(alpha = FALSE, fill = FALSE)
g3 <- ggplot(df2) +
   geom_line(aes(x = x, y = abs(ydiff), colour = side)) +
   geom_area(aes(x = x, y = abs(ydiff), fill = side, alpha = 0.4)) +
   guides(alpha = FALSE, fill = FALSE)
## See [3]
grid.draw(rbind(ggplotGrob(g2), ggplotGrob(g3), size="last"))

输入图像描述

……或者在第二个绘图的构建中使用ydiff替换abs(ydiff)

输入图像描述

来源:SO answer 3


1
由于y轴刻度不同,将两个图绘制在单列中可能更可取。 - Gregor Thomas
是的!现在您不必担心差异的比例。 - Gregor Thomas
你可能是对的,这似乎是一个更简洁的解决方案! - Eike P.
抱歉如果我有点固执,但这些不是CDF而是PDF! - Eike P.
您想如何比较超过2个PDF文件呢?绘制成对差异图表吗?因此,对于3个PDF文件,将会有3个差异,对于4个PDF文件,则为6个差异,以此类推。或者您有其他想法吗? - Eike P.
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接