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

时间:2017-01-28 20:03:12

标签: r ggplot2 probability-density density-plot

如何在密度曲线重叠的情况下获得该区域?

如何用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)

&#34;绘图中使用的点由ggplot_build()返回,因此您可以访问它们。&#34;所以现在,我有了积分,我可以将它们喂给大约,但我的问题是我不知道如何减去密度函数。

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

2 个答案:

答案 0 :(得分:3)

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

安装并加载“重叠”(执行计算)和“网格”(显示结果)的库:

<div />

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

library(overlapping)
library(lattice)

然后告诉它将输出显示为绘图,该绘图还将显示估计的重叠百分比:

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

我希望这可以帮助像我这样的人帮助我!这是一个重叠图的示例

overlapping plot

答案 1 :(得分:2)

我将制作一些基础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")

Intersection of density plots

现在我们可以整合以获得重叠区域。

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