使用 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)))
)
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 值。
如何获得重叠密度曲线下的面积?
如何解决 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)
"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 值。