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:
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:
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
Antworten:
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
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)
.quelle
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.
quelle
surveillance
undDCluster
, 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.Hierfür gibt es viele Optionen, aber eine gute: Sie können die
msExtrema
Funktion immsProcess
Paket verwenden .Bearbeiten:
In der finanziellen Leistungsanalyse wird diese Art der Analyse häufig unter Verwendung eines "Drawdown" -Konzepts durchgeführt. Das
PerformanceAnalytics
Paket 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
zoo
Objekt wären Ihre Daten:quelle
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.
quelle