Bir grafikte vadiler nasıl aranır?


10

Temelde tamsayıların uzun bir listesi (birkaç milyon değer) olan bazı genomik kapsama verilerini inceliyorum, her biri genomdaki bu pozisyonun ne kadar iyi (veya "derin") olduğunu söylüyor.

Bu verilerde "vadileri", yani çevrelerinden önemli ölçüde "daha düşük" bölgeleri aramak istiyorum.

Aradığım vadilerin büyüklüğünün 50 baz ile birkaç bin arasında değişebileceğini unutmayın.

Bu vadileri bulmak için ne tür paradigmalar kullanmanızı önerirsiniz?

GÜNCELLEME

Veriler için bazı grafik örnekler: alternatif metin alternatif metin

GÜNCELLEME 2

Vadinin ne olduğunu tanımlamak elbette uğraştığım sorulardan biri. Bunlar benim için bariz olanlar: alternatif metin alternatif metin

ama daha karmaşık durumlar var. Genel olarak, dikkate aldığım 3 kriter vardır: 1. Küresel ortalamaya göre pencerede (ortalama? Maksimum?) Kapsam. 2. Yakın çevresine göre penceredeki (...) kapsama alanı. 3. Pencere ne kadar büyük: Kısa bir açıklık için çok düşük kapsama alanı görüyorsam ilginçtir, uzun bir açıklık için çok düşük kapsama alanı görürsem de ilginçtir, kısa bir açıklık için hafifçe düşük kapsama alanı görürsem gerçekten ilginç değildir , ama uzun bir açıklık için hafif düşük kapsama alanı görürsem - bu .. Yani, bu, sapın uzunluğunun ve kapsama alanının bir kombinasyonudur. Ne kadar uzun olursa, kapsama alanının o kadar yüksek olmasına izin veriyorum ve hala bir vadi olarak görüyorum.

Teşekkürler,

Dave


Küçük bir veri örneği sağlayabilir misiniz?
Shane

@Shane güncelleme güncelleyin
David B

@David Teşekkürler. Her iki cevabın da ima ettiği gibi, gözlemleri sipariş ettiğiniz için zaman serisi analizi burada uygulanabilir.
Shane

Tam olarak ne aradığınızı bilmeden cevap vermek biraz zor. Yakalamak istediğiniz arazilerdeki noktaları daire içine alabilir misiniz? "Vadi" ne düşünüyorsun? ne kadar düşük gitmek zorunda ve ne dönmek istiyorsun? Soruyu bilmeden, yani eşikler ve benzeri bir çözüm formüle etmek zordur.
Falmarri

@ Shane ♦ Teşekkür ederim. Zaman serisi analizi konusunda da deneyimim olmadığından, nereden başlamam gerektiğine dair birkaç ipucu bırakabilir misiniz?
David B

Yanıtlar:


5

Örneğin verilerinizin hareketli ortalamasını kullanarak bir çeşit Monte Carlo yaklaşımı kullanabilirsiniz.

Makul büyüklükte bir pencere kullanarak verilerin hareketli bir ortalamasını alın (Sanırım ne kadar geniş olduğuna karar vermek size kalmış).

Verilerinizdeki dönüşümler (elbette) daha düşük bir ortalama ile karakterize edilecektir, bu yüzden şimdi "düşük" tanımlamak için bazı "eşik" bulmanız gerekir.

Bunu yapmak için verilerinizin değerlerini rastgele değiştirirsiniz (örn. Kullanarak sample()) ve değiştirilen verileriniz için hareketli ortalamayı yeniden hesaplarsınız.

Bu son pasajı oldukça yüksek bir kez tekrarlayın (> 5000) ve bu çalışmaların tüm ortalamalarını saklayın. Yani aslında her biri deneme başına bir tane olan ve her biri o deneme için hareketli ortalamayı içeren 5000 çizgiye sahip bir matriste sahip olacaksınız.

Bu noktada, her sütun için% 5 (veya% 1 veya istediğiniz her şeyi) kantilini seçersiniz, bu da rastgele verilerin ortalamalarının sadece% 5'ini oluşturan değerdir.

Artık orijinal verilerinizi karşılaştırmak için bir "güven sınırınız" var (bunun doğru istatistiksel terim olup olmadığından emin değilim). Verilerinizin bu sınırdan daha düşük bir kısmı bulursanız, bunu a.

Tabii ki, bunun veya başka herhangi bir matematiksel yöntemin size biyolojik önemi hakkında herhangi bir gösterge veremeyeceğini unutmayın, ancak bunun farkında olduğunuzdan eminim.

EDIT - bir örnek

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)

Bu sadece bölgeleri grafik olarak bulmanıza izin verir, ancak çizgilerinde bir şey kullanarak bunları kolayca bulabilirsiniz which(values>limits.5).


Açıkçası, aynı yaklaşımı hareketli ortalamadan başka bir şey kullanarak uygulayabilirsiniz, bu sadece bir fikir vermekti.
nico

+1 Çok teşekkür ederim, nico. Bakalım seni doğru anladım, sonunda, bu temelde küresel bir eşik belirlemeye ve <eşik değerine sahip herhangi bir noktayı bir vadinin parçası olarak tanımlamaya benzer. Örnekleme vs. sadece eşiği ayarlamak için anlamlı bir ölçü (kantil) elde etmek için kullanılır. Neden tüm noktalar için tek bir eşik kullanamıyoruz, yani, yeterince simülasyon yaparsak düz (okuma ve sarı) çizgiler elde ederiz. Ayrıca, yanılıyorsam beni düzeltin, ancak bu çevredeki ortamı dikkate almaz, ancak her noktanın mutlak değerini inceler.
David B

@David B: elbette, küresel bir eşik kullanabilirsiniz ve bu muhtemelen hesaplama süresinden tasarruf etmenizi sağlar. Sanırım küresel ortalamanın 1 / 3'ü gibi bir şey seçmek bir başlangıç ​​olabilir. Hareketli ortalamadan başka bir istatistik kullanırsanız, bu takas işlemi muhtemelen daha yararlıdır, çoğunlukla bir fikir vermekti. Her neyse, hareketli ortalama çevreyi dikkate alacaktır, örnekte 10 puanlık bir pencere dikkate alacaktır.
nico

4

Bu verilerden tamamen habersizim, ancak verilerin zaman içinde (pozisyona göre değil, pozisyona göre mi?) Verilerde zamansal kümeleri tanımlamak için birçok yöntem vardır. Genellikle yüksek değerleri bulmak için kullanılırlar, ancak birlikte gruplandırılmış düşük değerler için kullanılabilirler. Burada sayım verilerinde hastalık salgınlarını tespit etmek için kullanılan tarama istatistikleri, kümülatif toplam istatistikleri (ve diğerleri) düşünüyorum. Bu yöntemlere örnekler gözetim paketinde ve DCluster paketindedir.


@cxr Yanıtınız için teşekkür ederiz. Bir göz atın surveillanceve DCluster lütfen biraz daha açık olabilir misiniz? Her ikisi de nispeten büyük paketlerdir ve amaçları oldukça belirgindir. Nereden başlayacağımdan emin değilim.
David B

2

Bunun için birçok seçenek var, ancak iyi bir seçenek var: pakettekimsExtrema işlevi kullanabilirsiniz .msProcess

Düzenle:

Finansal performans analizinde, bu tür analizler genellikle bir "dezavantaj" kavramı kullanılarak yapılır. PerformanceAnalyticsPaket bazılarına sahiptir bu vadisi bulmak için kullanışlı fonksiyonlar . Gözlemlerinizi bir zaman serisi olarak ele alırsanız, burada aynı algoritmayı kullanabilirsiniz.

Bunu verilerinize nasıl uygulayabileceğinize dair bazı örnekler ("tarihler" ilgisiz ancak sipariş vermek için kullanılır), ancak zoonesnedeki ilk öğeler verilerinizdir:

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

Teşekkürler Shane, ama bu yerel minima (veya maxima) - bir bölgedeki tek bir nokta bulmak gibi görünüyor. Verilerim (herhangi bir biyolojik veri olarak) GÜRÜLTÜDÜR> Point minima'nın kendileri hakkında değil, düşük büyük bölgeler hakkında gerçekten umurumda değil.
David B

Yerel maksimum ve minimum noktalarınız varsa, farkları kolayca hesaplayabilirsiniz. Yani, farklılıkların hem büyüklük hem de "süre" içinde büyük olduğu durumları bilmek ister misiniz? Bu zaman serisi verileri mi?
Shane

@david Belki de bu işlevi yinelemeli olarak kullanabilirsiniz. Bir minimayı tanımlamak için işlevi kullanın. Bu noktayı ve çevresindeki noktaları bırakın (bir miktar tolerans seviyesi dahilinde x noktası deyin). Uygulamanız için düz bir bölge tanımlayacak bir tolerans seviyesi (örneğin, + - 10 sayım) seçebilirsiniz. Yeni veri kümesinde yeni bir minima bulun. Çalışacak mı?

Akla gelen analoji dağlık bir bölgedeki vadilerdir. Bence amaç tüm vadileri tanımlamak ve mesele bazı vadilerin 'daha derin' ve bazıları da dağlara göre 'sığ'.

@Shane Bir zaman dizisi değil, bunlar genom (kromozom) boyunca koordinat.
David B

2

Bazı Bioconductor 'ın paketleri (örneğin ShortRead , Biostrings , BSgenome , IRanges , genomeIntervals ) için örneğin genom pozisyonları veya kapsama vektörler, ilgilenmek için teklif imkanları ChIP-SEQ ve zenginleştirilmiş bölgeleri tespit. Diğer cevaplara gelince, eşik bazlı bir filtreyle düzenli gözlemlere dayanan herhangi bir yöntemin, belirli bir bant genişliği içinde düşük sinyali izole etmesine izin vereceğini kabul ediyorum.

Belki "adaları" tanımlamak için kullanılan yöntemlere de bakabilirsiniz.

Zang, C, Schones, DE, Zeng, C, Cui, K, Zhao, K ve Peng, W (2009). Histon modifikasyonu ChIP-Seq verilerinden zenginleştirilmiş alanların tanımlanması için bir kümeleme yaklaşımı . Biyoinformatik, 25 (15) , 1952-1958.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.