2017-01-28 135 views
2

如何获得重叠密度曲线下的面积?使用R计算重叠密度图的面积ggplot

我该如何解决R问题? (没有为蟒蛇这里的解决方案: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,但我的问题是,我不知道如何减去密度函数。

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

+0

产生一个错误:'GRT < - ggplot(DF,AES(X =重量,颜色=性,填充=性别))+ geom_density(AES(Y = ..密度..),α= 0。5) DPB < - ggplot_build(GRT) X1 < - 分钟(其中(DPB $数据[[1]] $ X> = 50)) X2 < - MAX(其中(DPB $数据[[1 ]]> $ x <= 70)) grt + geom_area(data = data.frame(x = dpb $ data [[1]] $ x [x1:x2], \t y = dpb $ data [[1] ] $ Y [X1:X2]),AES(X = X,Y = Y),填充= “灰色”)' – user5878028

+0

也许这http://stats.stackexchange.com/questions/97596/how-to-calculate重叠经验概率密度可以帮助 – MLavoie

+0

谢谢,看起来不错。但是,由于重新缩放,我仍然可以获得相交的概率吗?现在就试试。 – user5878028

回答

1

我会做一些基地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 
+0

这只适用于一个路口,对吗?所以0.29意味着30%的男人和女人有相同的体重,对吗? – user5878028

+0

刚刚发现我的密度图使用我的实际数据是振荡的,虽然我无法看到它,因为我可以看到的比例和振荡之间的比例是1:10000。然而,如果两个密度分布在y = 0.00 ... 1处似乎是平直的,实际上有一百万个微观尺度的重叠。该死的。通过限制相交以密度尝试一种workaorund>平均(密度)* 0.01 – user5878028

+0

@ user5878028没有,这并不意味着30%的具有相同的重量。这意味着30%的体重比异性更典型。即12%的男性体重更为典型,17名女性体重正常。 WRT多个交叉点,你是对的。这个解决方案假设一个单一的交叉点 – G5W

0

我正在寻找一种方法来为经验数据做到这一点,并有user5878028提到的多个交叉点的问题。一些挖后我发现了一个很简单的解决方案,即使对于一个总的R小白像我:

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

library(overlapping) 
library(lattice) 

然后定义一个变量“x”作为包含您要比较的两个密度分布的列表。在这个例子中,这两个数据集“数据1”和“数据2”是所谓的“yourfile”的文本文件都列:

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

然后,只需告诉它显示输出作为剧情也将显示估计%重叠:

out <- overlap(x, plot=TRUE) 

我希望这可以帮助像它这样的人帮助我!下面是一个例子重叠情节

overlapping plot