Wie suche ich in einem Diagramm nach Tälern?


10

Ich untersuche einige genomische Abdeckungsdaten, bei denen es sich im Grunde genommen um eine lange Liste (einige Millionen Werte) von ganzen Zahlen handelt, die jeweils angeben, wie gut (oder "tief") diese Position im Genom abgedeckt ist.

Ich möchte in diesen Daten nach "Tälern" suchen, dh nach Regionen, die deutlich "niedriger" sind als ihre Umgebung.

Beachten Sie, dass die Größe der Täler, die ich suche, zwischen 50 Basen und einigen Tausend liegen kann.

Welche Paradigmen würden Sie empfehlen, um diese Täler zu finden?

AKTUALISIEREN

Einige grafische Beispiele für die Daten: Alt-Text Alt-Text

UPDATE 2

Die Definition eines Tals ist natürlich eine der Fragen, mit denen ich zu kämpfen habe. Dies sind für mich offensichtlich: Alt-Text Alt-Text

aber es gibt einige komplexere Situationen. Im Allgemeinen gibt es drei Kriterien, die ich berücksichtige: 1. Die (durchschnittliche? Maximale?) Abdeckung im Fenster in Bezug auf den globalen Durchschnitt. 2. Die (...) Abdeckung im Fenster in Bezug auf seine unmittelbare Umgebung. 3. Wie groß ist das Fenster: Wenn ich für eine kurze Zeitspanne eine sehr geringe Abdeckung sehe, ist es interessant, wenn ich für eine lange Zeitspanne eine sehr geringe Abdeckung sehe, ist es auch interessant, wenn ich für eine kurze Zeitspanne eine leicht geringe Abdeckung sehe, ist es nicht wirklich interessant , aber wenn ich über einen langen Zeitraum eine leicht geringe Abdeckung sehe, ist dies eine Kombination aus der Länge des Sapn und seiner Abdeckung. Je länger es ist, desto höher lasse ich die Abdeckung sein und betrachte es immer noch als Tal.

Vielen Dank,

Dave


Könnten Sie eine kleine Datenprobe bereitstellen?
Shane

@ Shane siehe Update
David B

@ David Danke. Wie beide Antworten implizieren, kann hier eine Zeitreihenanalyse angewendet werden, da Sie Beobachtungen angeordnet haben.
Shane

Dies ist schwer zu beantworten, ohne genau zu wissen, wonach Sie suchen. Können Sie vielleicht die Punkte auf den Plots kreisen, die Sie erfassen möchten? Was halten Sie für ein "Tal"? Wie tief muss es gehen und was willst du zurück? Es ist schwierig, eine Lösung zu formulieren, ohne die Frage zu kennen, dh Schwellenwerte und dergleichen.
Falmarri

@ Shane ♦ Danke. Da ich auch keine Erfahrung mit Zeitreihenanalysen habe, können Sie ein paar Hinweise geben, wo ich anfangen soll?
David B

Antworten:


5

Sie könnten eine Art Monte-Carlo-Ansatz verwenden, beispielsweise den gleitenden Durchschnitt Ihrer Daten.

Nehmen Sie einen gleitenden Durchschnitt der Daten und verwenden Sie ein Fenster mit einer angemessenen Größe (ich denke, es liegt an Ihnen, zu entscheiden, wie breit Sie sind).

Durchgänge in Ihren Daten werden (natürlich) durch einen niedrigeren Durchschnitt gekennzeichnet sein. Daher müssen Sie jetzt einen "Schwellenwert" finden, um "niedrig" zu definieren.

Dazu tauschen Sie die Werte Ihrer Daten nach dem Zufallsprinzip aus (z. B. mithilfe von sample()) und berechnen den gleitenden Durchschnitt für Ihre ausgetauschten Daten neu.

Wiederholen Sie diese letzte Passage relativ oft (> 5000) und speichern Sie alle Durchschnittswerte dieser Versuche. Sie haben also im Wesentlichen eine Matrix mit 5000 Zeilen, eine pro Versuch, von denen jede den gleitenden Durchschnitt für diesen Versuch enthält.

An diesem Punkt wählen Sie für jede Spalte das Quantil 5% (oder 1% oder was auch immer Sie wollen) aus, dh den Wert, unter dem nur 5% der Mittelwerte der randomisierten Daten liegen.

Sie haben jetzt ein "Konfidenzlimit" (ich bin nicht sicher, ob dies der richtige statistische Begriff ist), mit dem Sie Ihre Originaldaten vergleichen können. Wenn Sie einen Teil Ihrer Daten finden, der unter diesem Grenzwert liegt, können Sie dies als "Durch" bezeichnen.

Bedenken Sie natürlich, dass weder diese noch eine andere mathematische Methode Ihnen jemals einen Hinweis auf die biologische Bedeutung geben könnte, obwohl Sie sich dessen sicher bewusst sind.

EDIT - ein Beispiel

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)

Auf diese Weise können Sie die Regionen nur grafisch finden, aber Sie können sie leicht finden, indem Sie etwas in den Linien von verwenden which(values>limits.5).


Offensichtlich können Sie den gleichen Ansatz mit etwas anderem als dem gleitenden Durchschnitt anwenden. Dies war nur, um eine Idee zu geben.
Nico

+1 Vielen Dank, Nico. Lassen Sie mich sehen, ob ich Sie richtig verstanden habe: Am Ende ist dies im Grunde so, als würde man einen globalen Schwellenwert festlegen und einen beliebigen Punkt mit dem Wert <Schwellenwert als Teil eines Tals definieren. Die Abtastung usw. wird nur verwendet, um ein aussagekräftiges Maß (Quantil) zum Einstellen des Schwellenwerts zu erhalten. Warum können wir nicht einen einzigen Schwellenwert für die gesamten Punkte verwenden? Ich meine, wenn wir genug Simulationen durchführen würden, würden wir gerade (gelesene und gelbe) Linien erhalten. Korrigieren Sie mich auch, wenn ich mich irre, aber dies berücksichtigt nicht die Umgebung, sondern untersucht den absoluten Wert jedes Punktes.
David B

@ David B: Natürlich könnten Sie einen globalen Schwellenwert verwenden, und das würde Ihnen wahrscheinlich einige Rechenzeit sparen. Ich denke, etwas wie 1/3 des globalen Mittelwerts zu wählen, könnte ein Anfang sein. Dieser Austauschprozess ist wahrscheinlich hilfreicher, wenn Sie andere Statistiken als den gleitenden Durchschnitt verwenden. Er diente hauptsächlich dazu, eine Idee zu geben. Auf jeden Fall berücksichtigt der gleitende Durchschnitt die Umgebung, im Beispiel ein Fenster mit 10 Punkten.
Nico

4

Ich kenne diese Daten überhaupt nicht, aber wenn die Daten geordnet sind (nicht zeitlich, sondern nach Position?), Ist es sinnvoll, Zeitreihenmethoden zu verwenden. Es gibt viele Methoden zum Identifizieren von zeitlichen Clustern in Daten. Im Allgemeinen werden sie verwendet, um hohe Werte zu finden, können jedoch für niedrige Werte verwendet werden, die zusammen gruppiert sind. Ich denke hier an Scan-Statistiken, kumulative Summenstatistiken (und andere), die zum Erkennen von Krankheitsausbrüchen in Zähldaten verwendet werden. Beispiele für diese Methoden finden Sie im Überwachungspaket und im DCluster-Paket.


@cxr Vielen Dank für Ihre Antwort. Ich habe einen Blick auf surveillanceund DCluster , aber könnten Sie bitte etwas genauer sein? Sie sind beide relativ große Pakete und ihr Ziel scheint ziemlich spezifisch zu sein. Ich bin mir nicht sicher, wo ich anfangen soll.
David B

2

Hierfür gibt es viele Optionen, aber eine gute: Sie können die msExtremaFunktion im msProcessPaket verwenden .

Bearbeiten:

In der finanziellen Leistungsanalyse wird diese Art der Analyse häufig unter Verwendung eines "Drawdown" -Konzepts durchgeführt. Das PerformanceAnalyticsPaket enthält einige nützliche Funktionen, um diese Täler zu finden . Sie können hier denselben Algorithmus verwenden, wenn Sie Ihre Beobachtungen als Zeitreihen behandeln.

Hier sind einige Beispiele, wie Sie dies möglicherweise auf Ihre Daten anwenden können (wobei die "Daten" irrelevant sind, aber nur für die Bestellung verwendet werden), aber die ersten Elemente im zooObjekt wären Ihre Daten:

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

Vielen Dank, Shane, aber dies scheint lokale Minima (oder Maxima) zu finden - dh einen einzelnen Punkt in einer Region. Meine Daten (wie alle biologischen Daten) sind laut> Ich interessiere mich nicht wirklich für Punktminima selbst, sondern für größere Regionen, die niedrig sind.
David B

Wenn Sie lokale Maximal- und Minimalpunkte haben, können Sie die Unterschiede leicht berechnen. Sie möchten also Fälle kennen, in denen die Unterschiede sowohl in der Größe als auch in der "Dauer" groß sind? Sind das Zeitreihendaten?
Shane

@david Vielleicht können Sie diese Funktion iterativ verwenden. Verwenden Sie die Funktion, um ein Minimum zu identifizieren. Lassen Sie diesen Punkt und die umgebenden Punkte fallen (sagen wir x Punkte innerhalb eines Toleranzniveaus). Sie können eine Toleranzstufe (z. B. + - 10 Zählungen) auswählen, die einen flachen Bereich für Ihre Anwendung definiert. Suchen Sie im neuen Datensatz nach neuen Minima. Wird es funktionieren?

@shane Die Analogie, die mir in den Sinn kommt, ist die von Tälern in einer Bergregion. Ich denke, das Ziel ist es, alle Täler zu identifizieren, und das Problem ist, dass einige Täler "tiefer" und andere "flach" im Verhältnis zu den Bergen sind.

@Shane Es ist keine Zeitreihe, diese sind entlang des Genoms (Chromosom) koordiniert.
David B

2

Einige der Bioconductor -Pakete (z. B. ShortRead , Biostrings , BSgenome , IRanges , Genomintervalle ) bieten Möglichkeiten zum Umgang mit Genompositionen oder Abdeckungsvektoren, z. B. für ChIP-seq und zur Identifizierung angereicherter Regionen. Was die anderen Antworten betrifft, stimme ich zu, dass jede Methode, die sich auf geordnete Beobachtungen mit einem schwellenbasierten Filter stützt, es ermöglichen würde, ein niedriges Signal innerhalb einer bestimmten Bandbreite zu isolieren.

Vielleicht können Sie sich auch die Methoden ansehen, mit denen sogenannte "Inseln" identifiziert werden.

Zang, C, Schones, DE, Zeng, C, Cui, K, Zhao, K und Peng, W (2009). Ein Clustering-Ansatz zur Identifizierung angereicherter Domänen aus Histonmodifikations-ChIP-Seq-Daten . Bioinformatics, 25 (15) , 1952-1958.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.