如何计算两个数据集分布之间的重叠部分?

3
您好,如何在R中计算两列(或一列的两个子集)之间的重叠区域,请参见下面的示例数据:
set.seed(1234)
df <- data.frame(
  Data=factor(rep(c("D1", "D2"), each=200)),
  weight=round(c(rnorm(200, mean=55, sd=5),
                 rnorm(200, mean=65, sd=5)))
)

library(ggplot2)
plot <- ggplot(df, aes(weight,fill = Data))+
  geom_density() 
plot

这导致了下面的图。我想知道如何给重叠区域着色并计算重叠系数(OVL),类似于 这里 使用蒙特卡罗积分的方法。请注意,提供的链接(和上面的示例)使用参数分布,而我正在询问如果我有一组观察值数据集。

enter image description here

1个回答

3

我通常发现直接使用密度并通过geom_area进行绘制更容易。如果在两个分布上获取x轴抽样点的匹配点,则可以使用pmin找到重叠区域,并将其值相加除以两条曲线的值总和,以得出总面积中重叠部分的比例。

d1dens <- with(df, density(weight[Data == "D1"], 
                           from = min(weight), 
                           to = max(weight)))
d2dens <- with(df, density(weight[Data == "D2"], 
                           from = min(weight),
                           to = max(weight)))
joint <- pmin(d1dens$y, d2dens$y)

df2 <- data.frame(x = rep(d1dens$x, 3), 
                  y = c(d1dens$y, d2dens$y, joint),
                  Data = rep(c("D1", "D2", "overlap"), each = length(d1dens$x)))

ggplot(df2, aes(x, y, fill = Data)) + 
  geom_area(position = position_identity(), color = "black") +
  scale_fill_brewer(palette = "Pastel2") +
  theme_bw()

enter image description here

sum(joint) / sum(d1dens$y, d2dens$y)
#> [1] 0.1480701

3
非常感谢您的回复。有一个评论,对于重叠系数的计算,不是应该(sum(joint)/sum(d1dens$y) + sum(joint)/sum(d2dens$y))/2吗?请核实一下。 - Malek Ik

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