如何在R中找到两个密度与ggplot2的交点

Sha*_*ton 3 r ggplot2

如何找到使用创建的两个密度图的交集ggplot2

来自名为combined的数据框的样本:

futureChange direction

2009-10-26    0.9980446      long

2008-04-28    1.0277389  not long

2012-07-09    1.0302413  not long

2010-11-15    1.0017247  not long
Run Code Online (Sandbox Code Playgroud)

我使用此代码创建密度图。

ggplot(combined, aes(futureChange, fill = direction))  
 geom_density(alpha = 0.2) 
 ggtitle(paste(symbol,"Long SB Frequency",sep=" "))
Run Code Online (Sandbox Code Playgroud)

我想找到粉红色密度线与蓝色密度线相交的位置。

我看到了其他提到该intersect功能的帖子,但是ggplot2由于我没有密度矢量,因此我无法弄清楚如何使用该功能。

tkm*_*zie 6

中的stat_density函数ggplot2使用R的density函数。使用该density函数将为我们提供用于密度估计的显式值,可用于找到交点(我在这里生成数据是因为给定的数据不足以执行密度计算):

set.seed(10)
N <- 100
combined <- data.frame(futureChange = c(rnorm(N, mean = -1), rnorm(N, mean = 1)),
                       direction = rep(c("long", "not long"), each = N))

lower.limit <- min(combined$futureChange)
upper.limit <- max(combined$futureChange)
long.density <- density(subset(combined, direction == "long")$futureChange, from = lower.limit, to = upper.limit, n = 2^10)
not.long.density <- density(subset(combined, direction == "not long")$futureChange, from = lower.limit, to = upper.limit, n = 2^10)

density.difference <- long.density$y - not.long.density$y
intersection.point <- long.density$x[which(diff(density.difference > 0) != 0) + 1]

ggplot(combined, aes(futureChange, fill = direction)) + geom_density(alpha = 0.2) + 
  geom_vline(xintercept = intersection.point, color = "red")
Run Code Online (Sandbox Code Playgroud)

逐步进行此操作,我们首先计算应计算每组的密度的极限(lower.limitupper.limit)。之所以这样做,是因为我们需要两个密度计算的范围都相同,以便以后进行比较。此外,我们使用函数中的n参数指定要计算密度的点数density(如果要获得更准确的结果,请增加该值)。

接下来,我们计算数据中每个组的密度。然后,我们想找到交点,这样我们就可以计算出密度的差值,看看它何时从正变为负,反之亦然。该命令which(diff(density.difference > 0) != 0) + 1将为我们提供这些开关发生的索引(由于存在差异,我们加了一个),因此我们可以通过取入中的对应值来获得该交集的值long.density$x(或not.long.density$x由于构造它们是相同的)。

在此处输入图片说明