Bagaimana cara mencari lembah dalam grafik?


10

Saya memeriksa beberapa data cakupan genomik yang pada dasarnya adalah daftar panjang (beberapa juta nilai) bilangan bulat, masing-masing mengatakan seberapa baik (atau "dalam") posisi ini dalam genom tercakup.

Saya ingin mencari "lembah" dalam data ini, yaitu daerah yang secara signifikan "lebih rendah" dari lingkungan sekitarnya.

Perhatikan bahwa ukuran lembah yang saya cari dapat berkisar dari 50 pangkalan hingga beberapa ribu.

Paradigma macam apa yang akan Anda rekomendasikan untuk menemukan lembah itu?

MEMPERBARUI

Beberapa contoh grafis untuk data: teks alternatif teks alternatif

PEMBARUAN 2

Mendefinisikan apa itu lembah tentu saja merupakan salah satu pertanyaan yang saya perjuangkan. Ini jelas bagi saya: teks alternatif teks alternatif

tetapi ada beberapa situasi yang lebih kompleks. Secara umum, ada 3 kriteria yang saya pertimbangkan: 1. Cakupan (rata-rata? Maksimal?) Di jendela sehubungan dengan rata-rata global. 2. Cakupan (...) di jendela sehubungan dengan sekitarnya langsung. 3. Seberapa besar jendelanya: jika saya melihat cakupan sangat rendah untuk rentang pendek itu menarik, jika saya melihat cakupan sangat rendah untuk rentang panjang juga menarik, jika saya melihat cakupan agak rendah untuk rentang pendek itu tidak terlalu menarik , tetapi jika saya melihat cakupan yang agak rendah untuk rentang yang panjang - itu adalah .. Jadi itu adalah kombinasi dari panjang getah dan cakupan itu. Semakin lama, semakin tinggi saya membiarkan cakupan dan masih menganggapnya lembah.

Terima kasih,

Dave


Bisakah Anda memberikan sampel data kecil?
Shane

@Shane, lihat pembaruan
David B

@ David Terima kasih. Karena kedua jawaban tersebut menyiratkan, analisis deret waktu dapat diterapkan di sini karena Anda telah memesan pengamatan.
Shane

Ini agak sulit dijawab tanpa tahu persis apa yang Anda cari. Bisakah Anda melingkari titik-titik pada plot yang ingin Anda tangkap? Apa yang Anda anggap sebagai "lembah"? seberapa rendah harus pergi dan apa yang Anda inginkan untuk kembali? Sulit untuk merumuskan solusi tanpa mengetahui pertanyaannya, yaitu ambang batas dan semacamnya.
Falmarri

@ Shane ♦ Terima kasih. Karena saya tidak memiliki pengalaman dengan analisis deret waktu, dapatkah Anda meninggalkan beberapa petunjuk di mana saya harus memulai?
David B

Jawaban:


5

Anda dapat menggunakan semacam pendekatan Monte Carlo, misalnya menggunakan rata-rata bergerak dari data Anda.

Ambil rata-rata bergerak dari data, menggunakan jendela dengan ukuran yang masuk akal (saya kira terserah Anda memutuskan seberapa lebar).

Melalui data Anda akan (tentu saja) ditandai dengan rata-rata yang lebih rendah, jadi sekarang Anda perlu menemukan beberapa "ambang" untuk mendefinisikan "rendah".

Untuk melakukan itu, Anda menukar nilai data secara acak (misalnya menggunakan sample()) dan menghitung ulang rata-rata bergerak untuk data yang Anda tukar .

Ulangi bagian terakhir ini dengan jumlah yang cukup tinggi (> 5000) dan simpan semua rata-rata dari uji coba ini. Jadi pada dasarnya Anda akan memiliki matriks dengan 5000 baris, satu per percobaan, masing-masing berisi rata-rata bergerak untuk percobaan itu.

Pada titik ini untuk setiap kolom Anda memilih kuantil 5% (atau 1% atau apa pun yang Anda inginkan), yaitu nilai di mana terletak hanya 5% dari rata-rata data acak.

Anda sekarang memiliki "batas kepercayaan" (Saya tidak yakin apakah itu istilah statistik yang benar) untuk membandingkan data asli Anda. Jika Anda menemukan bagian dari data Anda yang lebih rendah dari batas ini maka Anda dapat memanggilnya melalui.

Tentu saja, ingatlah bahwa bukan metode ini atau metode matematika lainnya yang dapat memberi Anda indikasi signifikansi biologis, meskipun saya yakin Anda sangat menyadari hal itu.

EDIT - sebuah contoh

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)

Ini hanya akan memungkinkan Anda untuk menemukan daerah secara grafis, tetapi Anda dapat dengan mudah menemukan mereka menggunakan sesuatu di baris which(values>limits.5).


Tentunya Anda bisa menerapkan pendekatan yang sama menggunakan sesuatu yang lain dari moving average, ini hanya untuk memberikan gambaran.
nico

+1 Terima kasih banyak, nico. Biarkan saya melihat apakah saya membuat Anda benar: pada akhirnya, ini pada dasarnya seperti menetapkan beberapa ambang global dan mendefinisikan titik dengan nilai <ambang batas sebagai bagian dari lembah. Pengambilan sampel dll hanya digunakan untuk mendapatkan beberapa ukuran yang bermakna (kuantil) untuk mengatur ambang batas. Mengapa kita tidak bisa menggunakan ambang tunggal untuk seluruh poin, maksud saya, jika kita melakukan cukup simulasi kita akan mendapatkan garis lurus (baca dan kuning). Juga, koreksi saya jika saya salah, tetapi ini tidak memperhitungkan lingkungan sekitarnya tetapi memeriksa nilai absolut dari setiap poin.
David B

@ David B: tentu saja, Anda bisa menggunakan ambang global dan itu mungkin akan menghemat waktu perhitungan Anda. Saya kira memilih sesuatu seperti 1/3 dari rata-rata global bisa menjadi awal. Proses swapping ini mungkin lebih bermanfaat jika Anda menggunakan beberapa statistik lain daripada moving average, itu sebagian besar untuk memberikan gambaran. Pokoknya moving average akan memperhitungkan sekitarnya, dalam contoh itu akan memperhitungkan jendela 10 poin.
nico

4

Saya sama sekali tidak tahu tentang data ini, tetapi dengan asumsi data tersebut dipesan (tidak tepat waktu, tetapi berdasarkan posisi?) Masuk akal untuk menggunakan metode deret waktu. Ada banyak metode untuk mengidentifikasi kluster temporal dalam data. Umumnya mereka digunakan untuk menemukan nilai tinggi tetapi dapat digunakan untuk nilai rendah yang dikelompokkan bersama. Saya sedang memikirkan statistik pemindaian, statistik jumlah kumulatif (dan lainnya) yang digunakan untuk mendeteksi wabah penyakit dalam data jumlah. Contoh metode ini ada dalam paket pengawasan dan paket DCluster.


@cxr Terima kasih atas tanggapan Anda. Saya sudah melihat surveillancedan DCluster , tapi bisakah Anda sedikit lebih spesifik? Keduanya paket yang relatif besar dan tujuannya agak spesifik. Saya tidak yakin harus mulai dari mana.
David B

2

Ada banyak opsi untuk ini, tetapi satu yang bagus: Anda dapat menggunakan msExtremafungsi dalam msProcesspaket .

Edit:

Dalam analisis kinerja keuangan, analisis semacam ini sering dilakukan dengan menggunakan konsep "drawdown". The PerformanceAnalyticspaket memiliki beberapa fungsi yang berguna untuk menemukan lembah ini . Anda dapat menggunakan algoritma yang sama di sini jika Anda memperlakukan pengamatan Anda sebagai rangkaian waktu.

Berikut adalah beberapa contoh bagaimana Anda dapat menerapkan ini pada data Anda (di mana "tanggal" tidak relevan tetapi hanya digunakan untuk memesan), tetapi elemen pertama dalam zooobjek adalah data Anda:

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

Terima kasih Shane, tetapi ini sepertinya menemukan minimum lokal (atau maksimum) - yaitu satu titik di suatu wilayah. Data saya (seperti data biologis) BISING> Saya tidak terlalu peduli dengan titik minimum sendiri tetapi tentang daerah yang lebih besar yang rendah.
David B

Jika Anda memiliki poin maksimum dan minimum lokal, Anda dapat dengan mudah menghitung perbedaannya. Jadi Anda ingin tahu contoh ketika perbedaan keduanya besar dan dalam "durasi"? Apakah ini data deret waktu?
Shane

@david Mungkin, Anda bisa menggunakan fungsi ini secara iteratif. Gunakan fungsi untuk mengidentifikasi minima. Jatuhkan titik itu dan titik-titik sekitarnya (katakanlah x titik dalam beberapa level toleransi). Anda dapat memilih tingkat toleransi (mis., + - 10 hitungan) yang akan menentukan wilayah datar untuk aplikasi Anda. Temukan minima baru pada dataset baru. Apakah itu akan berhasil?

@shane Analogi yang muncul di benak saya adalah lembah di daerah pegunungan. Saya pikir tujuannya adalah untuk mengidentifikasi semua lembah dan masalahnya adalah beberapa lembah 'lebih dalam' dan beberapa 'dangkal' relatif terhadap pegunungan.

@ Shane Ini bukan deret waktu, ini adalah koordinat sepanjang genom (kromosom).
David B

2

Beberapa paket Bioconductor (misalnya, ShortRead , Biostrings , BSgenome , IRanges , genomeIntervals ) menawarkan fasilitas untuk berurusan dengan posisi genom atau vektor jangkauan, misalnya untuk ChIP-seq dan mengidentifikasi kawasan yang diperkaya. Adapun jawaban lainnya, saya setuju bahwa metode apa pun yang mengandalkan pengamatan yang dipesan dengan beberapa filter berbasis ambang batas akan memungkinkan untuk mengisolasi sinyal rendah dalam bandwidth tertentu.

Mungkin Anda juga bisa melihat metode yang digunakan untuk mengidentifikasi apa yang disebut "pulau"

Zang, C, Schones, DE, Zeng, C, Cui, K, Zhao, K, dan Peng, W (2009). Pendekatan pengelompokan untuk mengidentifikasi domain yang diperkaya dari modifikasi histone data ChIP-Seq . Bioinformatika, 25 (15) , 1952-1958.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.