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

Posted

技术标签:

【中文标题】使用R通过ggplot计算重叠密度图的面积【英文标题】:calculate area of overlapping density plot by ggplot using R 【发布时间】:2017-06-14 07:58:39 【问题描述】:

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

如何解决 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)

“图中使用的点由 ggplot_build() 返回,因此您可以访问它们。”所以现在,我有了这些点,我可以将它们提供给 approxfun,但我的问题是我不知道如何减去密度函数。

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

【问题讨论】:

产生错误:grt &lt;- ggplot(df, aes(x=weight, color=sex, fill=sex)) + geom_density(aes(y=..density..), alpha=0.5) dpb &lt;- ggplot_build(grt) x1 &lt;- min(which(dpb$data[[1]]$x &gt;=50)) x2 &lt;- max(which(dpb$data[[1]]$x &lt;=70)) grt + geom_area(data=data.frame(x=dpb$data[[1]]$x[x1:x2], y=dpb$data[[1]]$y[x1:x2]),aes(x=x, y=y), fill="grey") 这个stats.stackexchange.com/questions/97596/… 可能会有所帮助 谢谢,看起来不错。但是,由于重新缩放,我仍然可以获得相交的概率吗?现在就试试。 【参考方案1】:

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

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

library(overlapping)
library(lattice)

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

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

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

out <- overlap(x, plot=TRUE)

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

【讨论】:

【参考方案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")

现在我们可以积分得到重叠区域。

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

【讨论】:

这只适用于一个路口,对吗?所以 0.29 意味着 30% 的男性和女性体重相同,对吗? 刚刚发现使用我的真实数据的密度图正在振荡,虽然我看不到它,因为我能看到的和振荡之间的比率是 1:10000。但是,如果两个密度分布在 y=0.00...1 处似乎是一条平坦线,那么实际上存在一百万个微观尺度的重叠。该死。通过将相交限制为密度 > mean(density)*0.01 来尝试解决方法 @user5878028 不,这并不意味着 30% 的重量相同。这意味着 30% 的人的体重更典型的异性。 IE。 12% 的男性体重比女性更典型,17 名女性体重比男性更典型。 WRT多个路口,你是对的。此解决方案假设一个交叉点。 你能说在 30% 的人口中,如果你只知道体重就无法确定这个人是女性还是男性? 好吧,对于 100% 的人口,您无法根据体重确定性别。这就是说,如果您根据给定体重最可能的性别来预测性别,那么您将在 30% 的情况下犯错误。

以上是关于使用R通过ggplot计算重叠密度图的面积的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化面积图(Area Chart)通过给坐标轴和曲线之间的区域着色可视化面积图添加标题副标题题注信息

R可视化ggplot2绘制重叠密度图(Overlay Density Plots)

R语言ggplot2可视化2d密度图:可视化二维密度图并将两个二维密度图重叠起来Overlay two ggplot2 stat_density2d plots

ArcGIS怎么分别计算每个重叠的缓冲区与其他多边形的重叠面积?

在ggplot2中强制密度图的颜色

计算 r 中 beta 分布下的中断面积