计算R中两条密度曲线的交点

时间:2018-10-28 20:59:30

标签: r intersection density-plot

我有两个1000个值的向量(a和b),从中我创建了密度图和直方图。我想检索两个图相交处的坐标(或仅y值)(如果它检测到多个相交无关紧要,那么我以后可以区分它们)。请在以下链接中找到数据。 Sample Data

xlim = c(min(c(a,b)), max(c(a,b)))
hist(a, breaks = 100, 
     freq   = F, 
     xlim   = xlim,
     xlab   = 'Test Subject', 
     main   = 'Difference plots',
     col    = rgb(0.443137, 0.776471, 0.443137, 0.5), 
     border = rgb(0.443137, 0.776471, 0.443137, 0.5))
lines(density(a))

hist(b, breaks = 100, 
     freq   = F,
     col    = rgb(0.529412, 0.807843, 0.921569, 0.5),
     border = rgb(0.529412, 0.807843, 0.921569, 0.5),
     add    = T)
lines(density(b))

使用 locate()并不是最佳方法,因为我需要从多个绘图中进行检索(但如果没有其他可行的方法,将使用该方法)。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我们计算两个系列的密度曲线,并注意使用相同的范围。然后,我们比较在每个x值处a的y值是否大于b。当比较的结果发生翻转时,我们知道界限已经交叉。

df <- merge(
  as.data.frame(density(a, from = xlim[1], to = xlim[2])[c("x", "y")]),
  as.data.frame(density(b, from = xlim[1], to = xlim[2])[c("x", "y")]),
  by = "x", suffixes = c(".a", ".b")
)
df$comp <- as.numeric(df$y.a > df$y.b)
df$cross <- c(NA, diff(df$comp))
points(df[which(df$cross != 0), c("x", "y.a")])

给你

enter image description here