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

时间:2014-08-22 18:49:41

标签: r ggplot2

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

来自名为组合的数据框的样本:

  

futureChange direction

     

2009-10-26 0.9980446 long

     

2008-04-28 1.0277389不久

     

2012-07-09 1.0302413不久

     

2010-11-15 1.0017247不久

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

ggplot(combined, aes(futureChange, fill = direction))  
+ geom_density(alpha = 0.2) 
+ ggtitle(paste(symbol,"Long SB Frequency",sep=" "))

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

我看到其他提到 intersect 函数的帖子,但我无法弄清楚如何使用密度ggplot2,因为我没有密度向量。

1 个答案:

答案 0 :(得分:3)

stat_density中的ggplot2功能使用R&#39 {s} 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")

一步一步地,我们首先计算应计算每组密度的限值(lower.limitupper.limit)。我们这样做是因为我们需要这些范围对于两个密度计算都是相同的,以便我们以后可以比较它们。另外,我们使用n函数中的density参数指定计算密度的点数(如果您想要更准确的结果,请增加此值)。

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

enter image description here