计算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")])
这给了你
我有两个包含 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")])
这给了你