r - 如何计算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),类似于使用蒙特卡洛积分在此处完成的操作?请注意,在我询问我是否有观测值数据集时,提供的链接(和上面的示例)使用参数分布。
解决方案
我通常发现直接使用密度并将它们绘制为更容易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
推荐阅读
- selenium - org.openqa.selenium.os.OsProcess checkForError 和 org.apache.commons.exec.ExecuteException:进程因 Selenium ChromeDriver 错误而退出
- wix - WiX 通过属性静默安装条件
- c++ - 带有 enable_if 和重载的 SFINAE
- symfony - 如何在 symfony 4.2 中根据子域设置默认数据库
- ffmpeg - 在ffmpeg中将RTSP流连续保存到具有特定长度(10分钟)的多个mp4文件中
- arrays - 数组如何通过Swift按多个属性排序?
- java - 无法加载 admob 广告错误:3 ERROR_CODE_NO_FILL
- php - 将数据保存到数据库后发送电子邮件
- kubernetes - kubectl 补丁部署导致 'The "" is invalid'
- android - 与动态集内容视图的数据绑定