如何在图中寻找谷底?


10

我正在研究一些基因组覆盖率数据,这些数据基本上是一长串整数(几百万个值),每个整数都表示覆盖基因组中此位置的程度(或“深度”)。

我想在此数据中寻找“山谷”,即比周围环境明显“低”的区域。

请注意,我要寻找的山谷的大小可能在50个碱基到数千个碱基之间。

您会建议使用哪种范例来找到那些山谷?

更新

数据的一些图形示例: 替代文字 替代文字

更新2

定义什么是山谷当然是我一直在努力的问题之一。这些对我来说是显而易见的: 替代文字 替代文字

但是还有一些更复杂的情况。通常,我考虑3个标准:1.相对于全局平均值,窗口中的(平均?最大?)覆盖率。2.窗口中相对于其周围的覆盖范围。3.窗口有多大:如果我看到很短的覆盖范围很有趣,如果我看到很长的覆盖范围很有趣,如果我看到很短的覆盖很短的范围也不是很有趣。 ,但如果我看到很长一段时间的覆盖率偏低-是的,所以这是sapn长度和覆盖率的结合。时间越长,我就越会覆盖,但仍然认为它是一个山谷。

谢谢,

戴夫


您能提供一个小的数据样本吗?
Shane 2010年

@Shane看到更新
David B

@大卫谢谢。正如两个答案所暗示的,由于您已订购观测值,因此可以在此处应用时间序列分析。
Shane 2010年

如果不知道您要寻找的是什么,这很难回答。您能否在要捕获的图上圈出点?您认为什么是“山谷”?它必须走多低,您希望返回什么?在不知道问题(即阈值等)的情况下很难制定解决方案。
Falmarri

@ Shane♦谢谢。由于我也没有时间序列分析的经验,您能否留下一些我应该从哪里开始的建议?
David B

Answers:


5

您可以使用某种蒙特卡洛方法,例如使用数据的移动平均值。

使用适当大小的窗口来获取数据的移动平均值(我想这取决于您决定宽度)。

(当然)数据中的吞吐量将具有较低的平均值,因此现在您需要找到一些“阈值”来定义“低”。

为此,您可以随机交换数据的值(例如使用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)


显然,您可以使用除移动平均线以外的其他方法来应用相同的方法,这只是为了给出一个想法。
nico 2010年

+1非常感谢,nico。让我看看我是否正确:最后,这基本上就像设置一些全局阈值并将任何值<threshold的点定义为谷的一部分。采样等只是用来获取一些有意义的量度(分位数)来设置阈值。我的意思是为什么我们不能对整个点使用单个阈值,如果我们进行了足够的模拟,我们将获得直线(读取和黄色)。另外,如果我弄错了,请纠正我,但这不会考虑周围的环境,而是会检查每个点的绝对值。
David B

@David B:当然,您可以使用全局阈值,这可能会节省一些计算时间。我认为选择全球平均值的1/3可能是一个开始。如果您使用移动平均线以外的其他一些统计信息,则此交换过程可能会更有帮助,它主要是提供一个想法。无论如何,移动平均线将考虑周围环境,在此示例中,它将考虑10点的窗口。
nico 2010年

4

我完全不了解这些数据,但是假设数据是有序的(不是按时间排序,而是按位置排序?),则可以使用时间序列方法。有很多方法可以识别数据中的时间簇。通常,它们用于查找高值,但可以用于分组在一起的低值。我在此考虑的是扫描统计信息,用于检测计数数据中疾病暴发的累积总和统计信息(以及其他统计信息)。这些方法的示例在监视包和DCluster包中。


@cxr感谢您的回复。我查看了surveillanceDCluster ,但请您更具体一点吗?它们都是相对较大的软件包,它们的目标似乎很具体。我不确定从哪里开始。
David B

2

有很多选项,但是有一个很好的选择:您可以使用包中msExtrema函数。msProcess

编辑:

在财务绩效分析中,通常使用“提款”概念进行此类分析。该PerformanceAnalytics软件包具有一些有用的功能来查找这些谷底。如果您将观察结果视为时间序列,则可以在此处使用相同的算法。

下面是一些示例,说明如何将其应用于数据(“日期”无关紧要,但仅用于排序),但是zoo对象中的第一个元素将是您的数据:

library(PerformanceAnalytics)
x <- zoo(cumsum(rnorm(50)), as.Date(1:50))
findDrawdowns(x)
table.Drawdowns(x)
chart.Drawdown(x)

谢谢Shane,但这似乎可以找到局部最小值(或最大值),即区域中的单个点。我的数据(如任何生物学数据)都很嘈杂>我并不真正在乎点最小值本身,而是在关注较低的较大区域。
David B

如果您有局部的最大和最小点,则可以轻松计算出差异。因此,您想知道差异很大且持续时间不同的实例吗?这是时间序列数据吗?
Shane 2010年

@david也许,您可以迭代使用此功能。使用该功能确定最小值。放下该点和周围的点(例如在某个公差级别内的x点)。您可以选择一个公差等级(例如+-10个计数),该等级将为您的应用程序定义一个平坦区域。在新的数据集上找到一个新的最小值。那行得通吗?

@shane我想到的比喻是山区的山谷。我认为目标是确定所有山谷,问题是相对于山脉,有些山谷“更深”,而有些则“浅”。

@Shane不是时间序列,它们是沿着基因组(染色体)的坐标。
David B

2

Bioconductor的某些软件包(例如ShortReadBiostringsBSgenomeIRanges,基因组间隔)提供了处理基因组位置或覆盖载体的工具,例如ChIP-seq和鉴定富集区域。至于其他答案,我同意,任何依靠有序观察和一些基于阈值的滤波器的方法都可以隔离特定带宽内的低信号。

也许您也可以看看用来识别所谓“岛屿”的方法

Zang,C,Schones,DE,Zeng,C,Cui,K,Zhao,K,and Peng,W(2009)。一种从组蛋白修饰ChIP-Seq数据中识别富集域的聚类方法。Bioinformatics,25(15),1952-1958。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.