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

Calculate intersection point of two density curves in R

我有两个包含 1000 个值的向量(a 和 b),我从中创建了密度图和直方图。我想检索两个图交叉的坐标(或只是 y 值)(如果它检测到多个交叉并不重要,我可以在之后区分它们)。请在下面link中查找数据。 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() 不是最优的,因为我需要从几个地块中检索它(但如果没有其他可行的方法,我将使用该方法)。感谢您的帮助。

我们计算了两个系列的密度曲线,注意使用相同的范围。然后,我们比较每个 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")])

这给了你