我为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包过滤数据后的新图。有新的峰值,它们位于不同的间隔,它还表示96%的初始组在新图中有数据(尽管过滤数据中的行数减少到初始数据集的0.023%),因此我无法识别哪个峰属于哪些群体。
答案 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