使用 R 通过 ggplot 计算重叠密度图的面积

calculate area of overlapping density plot by ggplot using R

如何获得重叠密度曲线下的面积?

如何解决 R 的问题? (这里有 python 的解决方案:Calculate overlap area of two functions

set.seed(1234)
df <- data.frame(
  sex=factor(rep(c("F", "M"), each=200)),
  weight=round(c(rnorm(200, mean=55, sd=5),
                 rnorm(200, mean=65, sd=5)))
  )

(来源:http://www.sthda.com/english/wiki/ggplot2-density-plot-quick-start-guide-r-software-and-data-visualization

ggplot(df, aes(x=weight, color=sex, fill=sex)) + 
 geom_density(aes(y=..density..), alpha=0.5)

"The points used in the plot are returned by ggplot_build(), so you can access them." 所以现在,我有了点,我可以将它们提供给 approxfun,但我的问题是我不知道如何减去密度函数。

非常感谢任何帮助! (而且我相信需求量很大,没有现成的解决方案。)

我会制作一些基本的 R 图,但这些图实际上并不是 解决方案。他们只是在那里确认我做对了 回答。

您可以获得每个密度函数并求​​解它们相交的位置。

##  Create the two density functions and display
FDensity = approxfun(density(df$weight[df$sex=="F"], from=40, to=80))
MDensity = approxfun(density(df$weight[df$sex=="M"], from=40, to=80))
plot(FDensity, xlim=c(40,80), ylab="Density")
curve(MDensity, add=TRUE)

现在求解交集

## Solve for the intersection and plot to confirm
FminusM = function(x) { FDensity(x) - MDensity(x) }
Intersect = uniroot(FminusM, c(40, 80))$root
points(Intersect, FDensity(Intersect), pch=20, col="red")

现在我们可以积分得到重叠的面积。

integrate(MDensity, 40,Intersect)$value + 
    integrate(FDensity, Intersect, 80)$value
[1] 0.2952838

我正在寻找一种方法来对经验数据执行此操作,并且遇到了 user5878028 提到的多个交叉点的问题。经过一番挖掘,我发现了一个非常简单的解决方案,即使对于像我这样的完全 R 菜鸟也是如此:

安装并加载库 "overlapping"(执行计算)和 "lattice"(显示结果):

library(overlapping)
library(lattice)

然后将变量 "x" 定义为包含要比较的两个密度分布的列表。对于此示例,两个数据集 "data1" 和 "data2" 都是名为 "yourfile" 的文本文件中的列:

x <- list(X1=yourfile$data1, X2=yourfile$data2)

然后告诉它以图表的形式显示输出,该图表还会显示估计的重叠百分比:

out <- overlap(x, plot=TRUE)

我希望这对像它帮助过我的人有所帮助!这是一个示例重叠图

以上两种提出的方​​法给出了不同的结果。 如果将第一个答案中的数据提供给重叠函数,它将导致 overlap% 为 0.18,而第一个答案的 overlap% 为 0.29。

X1 = df$weight[df$sex=="F"]
X2 = df$weight[df$sex=="M"]
x=list(X1=X1, X2=X2)

out <- overlap(x, plot=TRUE)
out$OV
 X1-X2 
 0.1754

我认为重叠包的重叠函数有一些缺陷。我认为它忽略了对两种密度使用联合范围。要比较两个密度图,它们应该具有相同的 x 值。