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

R 按组识别密度图中的峰值/峰值,r,ggplot2,density-plot,R,Ggplot2,Density Plot,我用ggplot2包为R创建了密度图。我想确定图中出现在0.01和0.02之间的峰值/峰值。有太多的图例,所以我删除了所有的图例。我试图筛选出数据,以找到一个组在0.01和0.02之间的大多数行数。然后我过滤掉所选的组,看看尖峰/峰值是否消失了,但没有,它仍然存在。你能建议一种方法来识别这些曲线图中的峰值/峰值吗 下面是一些代码: ggplot(NumofHitsnormalized, aes(NumofHits_norm, fill = name)) + geom_density(alpha=

我用
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])} 
ggplot(numhitsnormalized,aes(numhits_norm,fill=name))+geom_密度(alpha=0.2)+主题(legend.position=“none”)+xlim(0.0,0.15)
##过滤掉第一个峰值范围内的数据

test 0.01&numfohitsnormalized$numfohits\u norm在不查看代码的情况下,我起草了一个简单的函数,为指示异常值的变量添加
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)
}

结果
x在不看代码的情况下,我起草了这个简单的函数,将
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)
}

结果
x我也有类似的问题

我所做的是用3个窗口创建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更好

我也有类似的问题

我所做的是用3个窗口创建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更好

我对“异常值”一词表示怀疑。我似乎模模糊糊地记得一位著名的统计学家说过这样的话:“每当我看到一个极端意外的结果,我永远不知道我应该扔掉它还是为它申请专利。”。当然可以显示一些代码???看看包()它应该提供你需要的。添加到你的帖子中,不在评论部分,您也可以查看pastecs软件包中的turnpoints(),我对术语“异常值”提出质疑。我似乎模模糊糊地记得一位著名的统计学家说过这样的话:“每当我看到一个极端意外的结果,我永远不知道我应该扔掉它还是为它申请专利。”。当然可以显示一些代码???看看包()它应该提供你需要的。添加到你的帖子中,不是在评论部分,你也可以看看pastecs软件包中的turnpoints()。这个caTools软件包是runmean函数吗?是的,zoo软件包中也有rollmean,或者你可以很容易地自己编写它。你挑吧!这是caTools包的runmean函数吗?是的,zoo包中也有rollmean,或者你可以很容易地自己编写。你挑吧!