您可以使用某种蒙特卡洛方法,例如使用数据的移动平均值。
使用适当大小的窗口来获取数据的移动平均值(我想这取决于您决定宽度)。
(当然)数据中的吞吐量将具有较低的平均值,因此现在您需要找到一些“阈值”来定义“低”。
为此,您可以随机交换数据的值(例如使用sample()
),然后重新计算交换数据的移动平均值。
重复此最后一段合理的次数(> 5000),并存储所有这些试验的平均值。因此,基本上,您将拥有一个包含5000行的矩阵,每个试验一个,每个包含该试验的移动平均值。
在这一点上,您为每一列选择5%(或1%或任何您想要的)分位数,该分位数下的值仅是随机数据均值的5%。
现在,您有一个“置信度限制”(我不确定这是否是正确的统计术语)来与您的原始数据进行比较。如果您发现数据中的一部分低于此限制,则可以称其为直通。
当然,尽管我确信您对此很清楚,但是请不要忘记,这种方法或任何其他数学方法都不能给您任何生物学意义的指示。
编辑-一个例子
require(ares) # for the ma (moving average) function
# Some data with peaks and throughs
values <- cos(0.12 * 1:100) + 0.3 * rnorm(100)
plot(values, t="l")
# Calculate the moving average with a window of 10 points
mov.avg <- ma(values, 1, 10, FALSE)
numSwaps <- 1000
mov.avg.swp <- matrix(0, nrow=numSwaps, ncol=length(mov.avg))
# The swapping may take a while, so we display a progress bar
prog <- txtProgressBar(0, numSwaps, style=3)
for (i in 1:numSwaps)
{
# Swap the data
val.swp <- sample(values)
# Calculate the moving average
mov.avg.swp[i,] <- ma(val.swp, 1, 10, FALSE)
setTxtProgressBar(prog, i)
}
# Now find the 1% and 5% quantiles for each column
limits.1 <- apply(mov.avg.swp, 2, quantile, 0.01, na.rm=T)
limits.5 <- apply(mov.avg.swp, 2, quantile, 0.05, na.rm=T)
# Plot the limits
points(limits.5, t="l", col="orange", lwd=2)
points(limits.1, t="l", col="red", lwd=2)
这仅允许您以图形方式找到区域,但是您可以使用上的一行轻松地找到它们which(values>limits.5)
。