如何计算2个数据集分布之间的重叠度

问题描述 投票:0回答:2

嗨如何计算 R 中 2 列(或列的 2 个子集)之间的重叠面积。 请参阅下面的示例数据:

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),类似于here使用蒙特卡罗积分所做的事情? 请注意,当我询问我是否有观察值的数据集时,提供的链接(以及上面的示例)使用参数分布。

r integration montecarlo
2个回答
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()

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

-1
投票

谢谢你们提供的有用的解决方案!对重叠系数的一点评论是:我认为计算方法取决于你定义它的依据。

© www.soinside.com 2019 - 2024. All rights reserved.