找到 x 的值,该值将平均划分两条曲线之间的重叠
Find value of x that will equally devide overlap between two curves
使用从@Ramnath 在 this 上一个问题中的回答中获取的一些代码,我想找到 x 的值,它将两条曲线之间的重叠区域平均分开。请参阅以下示例:
library(ggplot2)
x = seq(-7, 10, length = 200)
y1 = dnorm(x, mean = 0,sd = 1)
y2 = dnorm(x, mean = 3,sd = 2)
mydf = data.frame(x, y1, y2)
p0 = ggplot(mydf, aes(x = x)) +
geom_line(aes(y = y1), colour = 'blue') +
geom_line(aes(y = y2), colour = 'red') +
geom_area(aes(y = pmin(y1, y2)), fill = 'gray60')
如有任何建议,我们将不胜感激!
在下面的方法中,我们找到重叠的累积面积,然后找到这个累积面积是总重叠面积一半的x值。
为了说明,我添加了额外的数据列来标记所有步骤,但如果您只想直接找到分界线的位置,则不需要这样做。
# overlap
mydf$overlap = apply(mydf[,c("y1","y2")], 1, min)
# area of overlap
mydf$overlap.area = cumsum(mydf$overlap * median(diff(mydf$x)))
# Find x that divides overlap area in half
# Method 1: Directly from the data. Could be inaccurate if x values are
# not sufficiently close together.
x0a = mydf$x[which.min(abs(mydf$overlap.area - 0.5*max(mydf$overlap.area)))]
# Method 2: Use uniroot function to find x value where cumulative overlap
# area is 50% of total overlap area. More accurate.
# First generate an interpolation function for cumulative area.
# Subtract half the cumulative area so that function will cross
# zero at the halfway point
f = approxfun(mydf$x, mydf$overlap.area - 0.5*max(mydf$overlap.area))
# Find x value at which interpolation function crosses zero
x0b = uniroot(f, range(mydf$x))$root
p0 = ggplot(mydf, aes(x = x)) +
geom_line(aes(y = y1), colour = 'blue') +
geom_line(aes(y = y2), colour = 'red') +
geom_area(aes(y = pmin(y1, y2)), fill = 'gray60') +
geom_line(aes(y=overlap), colour="purple") +
geom_line(aes(y=overlap.area), colour="green") +
geom_vline(xintercept=c(x0a,x0b), color=c("orange","darkgreen"),
linetype=c("solid", "dashed")) +
theme_classic()
p0
使用从@Ramnath 在 this 上一个问题中的回答中获取的一些代码,我想找到 x 的值,它将两条曲线之间的重叠区域平均分开。请参阅以下示例:
library(ggplot2)
x = seq(-7, 10, length = 200)
y1 = dnorm(x, mean = 0,sd = 1)
y2 = dnorm(x, mean = 3,sd = 2)
mydf = data.frame(x, y1, y2)
p0 = ggplot(mydf, aes(x = x)) +
geom_line(aes(y = y1), colour = 'blue') +
geom_line(aes(y = y2), colour = 'red') +
geom_area(aes(y = pmin(y1, y2)), fill = 'gray60')
如有任何建议,我们将不胜感激!
在下面的方法中,我们找到重叠的累积面积,然后找到这个累积面积是总重叠面积一半的x值。
为了说明,我添加了额外的数据列来标记所有步骤,但如果您只想直接找到分界线的位置,则不需要这样做。
# overlap
mydf$overlap = apply(mydf[,c("y1","y2")], 1, min)
# area of overlap
mydf$overlap.area = cumsum(mydf$overlap * median(diff(mydf$x)))
# Find x that divides overlap area in half
# Method 1: Directly from the data. Could be inaccurate if x values are
# not sufficiently close together.
x0a = mydf$x[which.min(abs(mydf$overlap.area - 0.5*max(mydf$overlap.area)))]
# Method 2: Use uniroot function to find x value where cumulative overlap
# area is 50% of total overlap area. More accurate.
# First generate an interpolation function for cumulative area.
# Subtract half the cumulative area so that function will cross
# zero at the halfway point
f = approxfun(mydf$x, mydf$overlap.area - 0.5*max(mydf$overlap.area))
# Find x value at which interpolation function crosses zero
x0b = uniroot(f, range(mydf$x))$root
p0 = ggplot(mydf, aes(x = x)) +
geom_line(aes(y = y1), colour = 'blue') +
geom_line(aes(y = y2), colour = 'red') +
geom_area(aes(y = pmin(y1, y2)), fill = 'gray60') +
geom_line(aes(y=overlap), colour="purple") +
geom_line(aes(y=overlap.area), colour="green") +
geom_vline(xintercept=c(x0a,x0b), color=c("orange","darkgreen"),
linetype=c("solid", "dashed")) +
theme_classic()
p0