Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 找到将在两条曲线之间平均分隔重叠的x值_R_Math_Ggplot2_Curve_Calculus - Fatal编程技术网

R 找到将在两条曲线之间平均分隔重叠的x值

R 找到将在两条曲线之间平均分隔重叠的x值,r,math,ggplot2,curve,calculus,R,Math,Ggplot2,Curve,Calculus,使用上一个问题中@Ramnath的答案中的一些代码,我想找到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)) +

使用上一个问题中@Ramnath的答案中的一些代码,我想找到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