按组识别密度图中的峰值/峰值

时间:2016-02-01 15:37:43

标签: r ggplot2 density-plot

Image

我为ggplot2创建了一个R包的密度图。我想确定图中的峰值/峰值出现在0.01和0.02之间。有太多的传说要拿出来所以我删除了所有的传说。我试图过滤我的数据,以找到一组介于0.01和0.02之间的大多数行。然后我过滤掉了所选的组以查看尖峰/峰值是否消失但是没有,它仍然在那里绘制。你能建议一种方法来识别这些图中的这些峰值/峰值吗?

以下是一些代码:

ggplot(NumofHitsnormalized, aes(NumofHits_norm, fill = name)) + geom_density(alpha=0.2) + theme(legend.position="none") + xlim(0.0 , 0.15) 

## To filter out the data that is in the range of first spike
test <- NumofHitsnormalized[which(NumofHitsnormalized$NumofHits_norm > 0.01 & NumofHitsnormalized$NumofHits_norm <0.02),] 

## To figure it out which group (name column) has the most number of rows ##thus I thought maybe I could get the data that lead to spike
testMatrix <- matrix(ncol=2, nrow= length(unique(test$name))) 
for (i in 1:length(unique(test$name))){ 
testMatrix[i,1] <- unique(test$name)[i] 
testMatrix[i,2] <- nrow(unique(test$name)[i])} 

extremeValues

康拉德,

这是我使用extremevalues包过滤数据后的新图。有新的峰值,它们位于不同的间隔,它还表示96%的初始组在新图中有数据(尽管过滤数据中的行数减少到初始数据集的0.023%),因此我无法识别哪个峰属于哪些群体。

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题。

我是如何使用3窗口创建y值的滚动均值和sd。

计算基线数据的平均值(您知道的数据没有峰值)

设置阈值

如果高于阈值,则为1,否则为0.

d5$roll_mean = runMean(d5$`Current (pA)`,n=3)
d5$roll_sd = runSD(x = d5$`Current (pA)`,n = 3)
d5$delta = ifelse(d5$roll_sd>1,1,0)
currents = subset(d5,d5$delta==1,na.rm=TRUE) # Finds all peaks

我的门槛是sd&gt; 1.根据您的数据,您可能想要使用mean或sd。缓慢上升的峰值意味着比sd更好的主意。

答案 1 :(得分:1)

在不查看代码的情况下,我起草了这个简单的函数,将TRUE/FALSE标志添加到指示异常值的变量中:

GenerateOutlierFlag <- function(x) {
  # Load required packages
  Vectorize(require)(package = c("extremevalues"), char = TRUE)
  # Run check for ouliers
  out_flg <- ifelse(1:length(x) %in% getOutliers(x, method = "I")$iLeft,
                    TRUE,FALSE)
  out_flg <- ifelse(1:length(x) %in% getOutliers(x, method = "I")$iRight,
                    TRUE,out_flg)
  return(out_flg)
}

如果您想了解 extremevalues 套餐,您会发现它在识别异常值方面提供了一定的灵活性,但从广义上讲它是找到各种<的好工具<数据中的em> peak 或 spikes

侧点

您可以通过创建一个与getOutliers(x, method = "I")对应的对象来实际优化它,而不是两次调用该方法。

更明智的语法

GenerateOutlierFlag <- function(x) {
  # Load required packages
  require("extremevalues")
  # Outliers object
  outObj <- getOutliers(x, method = "I")
  # Run check for ouliers
  out_flg <- ifelse(1:length(x) %in% outObj$iLeft,
                    TRUE,FALSE)
  out_flg <- ifelse(1:length(x) %in% outObj$iRight,
                    TRUE,out_flg)
  return(out_flg)
}

结果

x <- c(1:10, 1000000, -99099999)
table(GenerateOutlierFlag(x))
FALSE  TRUE 
   10     2