R, filter-matrix basierend auf einer Varianz-cut-offs
Siehe edit unten
Mit R, ich möchte filter eine matrix (der gen-expression-Daten) und behalten nur die Zeilen (Gene/Sonden), die haben Werte mit einer hohen Varianz. Zum Beispiel würde ich gerne nur die Zeilen, deren Werte in der unteren und oberen Perzentile (z.B. unter 20% und über 80%). Ich möchte die Grenze meiner Studie nur Gene, die unter hoher Varianz für downstream-Analysen. Gibt es gemeinsame Möglichkeiten für die gen-Filterung in R?
Meine matrix hat 18 Proben (Spalten) und 47000 Sonden (Zeilen) mit den Werten, sind log2 transformiert und normalisiert. Ich weiß, die quantile()
Funktion identifizieren können, die 20% und 80% Abkürzungen innerhalb der einzelnen sample-Spalte. Ich kann nicht herausfinden, wie zu finden, diese Werte für die gesamte matrix, und dann Teilmenge der ursprünglichen matrix zu entfernen Sie alle "non-varying" Zeilen.
Beispiel matrix mit einem Mittelwert von 5.97, damit die letzten drei Zeilen sollten entfernt werden, denn Sie enthalten Werte zwischen 20% und 80% Abkürzungen:
> m
sample1 sample2 sample3 sample4 sample5 sample6
ILMN_1762337 7.86 5.05 4.89 5.74 6.78 6.41
ILMN_2055271 5.72 4.29 4.64 5.00 6.30 8.02
ILMN_1736007 3.82 6.48 6.06 7.13 8.20 4.06
ILMN_2383229 6.34 4.34 6.12 6.83 4.82 5.57
ILMN_1806310 6.15 6.37 5.54 5.22 4.59 6.28
ILMN_1653355 7.01 4.73 6.62 6.27 4.77 6.12
ILMN_1705025 6.09 6.68 6.80 6.85 8.35 4.15
ILMN_1814316 5.77 5.17 5.94 6.51 7.12 7.20
ILMN_1814317 5.97 5.97 5.97 5.97 5.97 5.97
ILMN_1814318 5.97 5.97 5.97 5.97 5.97 5.97
ILMN_1814319 5.97 5.97 5.97 5.97 5.97 5.97
Ich würde schätzen, Anregungen oder Funktionen, die ich in Aussehen sollte.
Danke!
BEARBEITEN
Sorry, ich war nicht sehr klar in den OP. (1) ich würde gerne wissen, die 20% - und 80% - cutoff-Werte für die gesamte matrix (nicht nur für jede einzelne Probe). (2) Dann, wenn jede Zeile enthält einen Wert, der in den oberen oder unteren Perzentile, R halten diese Zeilen. Wenn eine Zeile enthält Werte (für alle Proben), die fallen in der Nähe der meine, diese Zeilen werden weggeworfen.
- Vielen Dank für die Klarstellung. Ich habe auch aktualisiert, meine Antwort zu reflektieren, was Sie hofften, zu erreichen. Kurze Frage - haben Sie eine matrix oder ein dataframe (also ist die ID-Spalte der rownames deiner matrix oder die erste Spalte der dataframe?). Ein schneller Weg, um zu überprüfen, wäre
class(m)
. - Es sollte eine matrix (nur Ausdruck von Daten) und die Spalte ID ist der rownames für meine matrix (ich hätte das "ID" - Namen aus meinem Beispiel).
- Ok Super!!! Das meinte ich mit meinem Beispiel.
- Ich landete mit dem bioconductor-Paket "genefilter', die unten vorgeschlagen, mit diesem code:
m.var <- varFilter(m, var.func=IQR, var.cutoff=0.6, filterByQuantile=TRUE)
und verwendetnrow(m)
undrow(m.var)
zum vergleichen der Anzahl der verbleibenden Sonden nach der Filterung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, angenommen Sie haben eine matrix (also ich gehe davon aus, dass deine ID-Spalte ist eigentlich rownames), dann ist dies sehr einfach zu tun.
Den
any( x < qt[1] | x > qt[2] )
Teil derapply
- Funktion (die ausgelegt ist zum anwenden einer Funktion über die Ränder einer matrix) gibtTRUE
wenn alle Wert in dieser Zeile ist außerhalb der 20% und 80% Quantile Ihrer Probenmatrix. Per definition, wenn kein Wert außerhalb dieser Grenzen gibt esFALSE
angibt, wir werden Tropfen, der in der Zeile in der nächsten Zeile.Den Biocondcutor genefilter Paket bietet common-Filter wichtig, um die microarray-Analyse. Eine typische filter basierend auf den row-wise Variabilität wäre
Paket landing-page-Referenzen Vignetten illustriert die grundlegende Bedienung und die Bereitstellung von Diagnose-Anleitung für die Verwendung von filtern.
Einem grundlegenden Prinzip in der Analyse von microarrays ist, dass die Werte in einer Zeile sind vergleichbar, aber nicht die Werte zwischen den Zeilen. Dies ist, weil die Sonden im Zusammenhang mit der jeweiligen Zeile haben verschiedene Merkmale, die eine Einführung Reihe-spezifische bias -- ein Wert in der ersten Zeile vernünftigerweise angeben, mehr, weniger oder gleich der Genexpression im Vergleich zu einem Wert für die gleiche Probe in einer zweiten Reihe. Dies bedeutet, dass @Todd, den Wunsch zu normalisieren, basierend auf den zwischen-Zeilen-Vergleich (größte und kleinste Werte in der gesamten matrix) wird nicht empfohlen. Stattdessen varFilter berechnet ein Maß der Variabilität der einzelnen Zeilen (Zeile inter-Quartil-Bereich) und wählt eine Fraktion (die var.cutoff-argument) mit den meisten Variabilität.
Eine schnelle peak bei der definition von
varFilter
zeigt, dass dies im Allgemeinen nicht komplizierter als, für ein gewisses Maß an row-wise Variabilitätvar.func
und einer (einzigen) quantilevar.cutoff
mm <- as.matrix(dat[,-1]);rownames(mm) <- dat[,1];rr <- varFilter(mm,var.cutoff=c(0.2,0.8))
, aber ich bekomme Warnungen, hat ich etwas verpasst?Ich bin kein Statistiker, Also ich weiß nicht, ob es eine Allgemeine Methode, diese zu lösen. Für mich das problem wird einfacher, wenn Sie Umgestaltung Ihrer Daten im long-format.
Dann für jede variable Sie Folgendes tun :
Können Sie dies tun, zum Beispiel mit
ddply
ausplyr
:BEARBEITEN nach der OP Klärung , wenn Sie wollen, dass die 20% - und 80% - cutoff-Werte für die gesamte matrix nicht nur für jede einzelne Probe, die Sie berechnen qq außerhalb der
ddply
Dann kommentieren Sie die entsprechende Zeile , wie hier :
PS hier dat :