按组识别密度图中的 spikes/peaks

Identify spikes/peaks in density plot by group

我用 ggplot2 包为 R 创建了一个密度图。我想确定图中出现在 0.01 和 0.02 之间的 spikes/peaks。图例太多挑不出来所以我删掉了所有的图例。我试图过滤我的数据以找到一个组在 0.01 到 0.02 之间的最多行数。然后我过滤掉选定的组以查看 spike/peak 是否消失但没有,它仍然在那里绘制。你能建议一种在这些图中识别这些 spikes/peaks 的方法吗?

这是一些代码:

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])} 

康拉德,

这是我用极值包过滤掉我的数据后制作的新图。有新的峰值,它们位于不同的间隔,它还说 96% 的初始组在新图中有数据(尽管过滤数据中的行数减少到初始数据集的 0.023%)所以我无法确定是哪个峰属于哪些组。

没有看代码,我起草了这个简单的函数来向变量添加 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 包,您会发现它在识别异常值方面提供了一些灵活性,但从广义上讲,它是一个很好的查找异常值的工具数据中的各种 peaksspikes


侧点

您实际上可以显着优化它,方法是创建一个对应于 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 

我遇到了类似的问题。

我是如何用 3 window.

创建 y 值的滚动平均值和 sd

计算你的基线数据的平均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 > 1。根据您的数据,您可能想要使用均值或 sd。对于缓慢上升的峰值,意味着比 sd 更好。