如何在密度曲线重叠的情况下获得该区域?
如何用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)))
)
ggplot(df, aes(x=weight, color=sex, fill=sex)) +
geom_density(aes(y=..density..), alpha=0.5)
&#34;绘图中使用的点由ggplot_build()返回,因此您可以访问它们。&#34;所以现在,我有了积分,我可以将它们喂给大约,但我的问题是我不知道如何减去密度函数。
任何帮助非常感谢! (而且我相信需求很高,现在没有解决方案。)
答案 0 :(得分:3)
我正在寻找一种方法来为经验数据做这件事,并且遇到了user5878028提到的多个交叉点的问题。经过一番挖掘后,我找到了一个非常简单的解决方案,即使对于像我这样的总R菜鸟也是如此:
安装并加载“重叠”(执行计算)和“网格”(显示结果)的库:
<div />
然后将变量“x”定义为包含要比较的两个密度分布的列表。对于此示例,两个数据集“data1”和“data2”都是名为“yourfile”的文本文件中的列:
library(overlapping)
library(lattice)
然后告诉它将输出显示为绘图,该绘图还将显示估计的重叠百分比:
x <- list(X1=yourfile$data1, X2=yourfile$data2)
我希望这可以帮助像我这样的人帮助我!这是一个重叠图的示例
答案 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")
现在我们可以整合以获得重叠区域。
integrate(MDensity, 40,Intersect)$value +
integrate(FDensity, Intersect, 80)$value
[1] 0.2952838