Automatische Erfassung von Genexpressionsdaten durch Python und R.

Dieser Beitrag Blue Collar Bioinformatics; Automatisches Abrufen von Expressionsdaten mit Python und R Es ist eine Übersetzung. Es ist ein bisschen alt, aber ich kann auch für mich selbst lernen. Wir freuen uns über Tippfehler oder Fehlübersetzungen.

Übersetzt unten

Diesen Februar gehe ich nach Japan, um am Bio-Hackason 2010 teilzunehmen, der sich auf die Integration biologischer Daten konzentriert. Also dachte ich über einen Anwendungsfall als Vorbereitung nach.

Welche zusätzlichen Daten würden beim Ringen mit einem Datensatz zur Lösung des Problems beitragen? Ein typisches Beispiel sind Informationen zu Daten auf Genexpressionsniveau. Wenn Sie eine Liste von Genen von Interesse haben und deren Expressionsniveaus wissen möchten.

In einer Welt, in der der Traum vom Semantic Web wahr geworden ist, werden Sie wahrscheinlich eine Reihe von RDF-Tripeln wie diese abfragen:

Dann können Sie das Expressionsniveau des interessierenden Zelltumors (proB) unter normalen Bedingungen erhalten, und dann können Sie das Expressionsniveau des vorliegenden Gens erhalten. Idealerweise möchte ich, dass die Ausdrucksebene Metadaten enthält. Dann können Sie im Kontext des Experiments sehen, was die Zahl 7.65 bedeutet.

Sie können diese Abfrage nicht aus einem Kanal im Semantic Web werfen, sondern ähnliche Probleme automatisch lösen. Es gibt viele Werkzeuge.

Der Gene Expression Omnibus (GEO) von NCBI hostet Expressionsdaten online. Sie können den Datensatz mit der API Eutils von Biopython abfragen. Wenn Sie den Datensatz identifiziert haben, an dem Sie interessiert sind, rufen Sie die Daten unter Bioconductor's GEOQuery ab und entsprechen Sie der UCSC RefGene-ID. Sie können. All dies kann durch Ausführen von R aus Python in Rpy2 verknüpft werden.

Übersetzung: Jetzt ist pipeR vielleicht besser

Setzen Sie sich zunächst Ziele auf höchster Ebene. Hier suchen wir nach Wildtyp-Expressionsdaten von Maus-proB-Zellen.

def main():
    organism = "Mus musculus"
    cell_types = ["proB", "ProB", "pro-B"]
    email = "[email protected]"
    save_dir = os.getcwd()
    exp_data = get_geo_data(organism, cell_types, email, save_dir)
    

def _is_wild_type(result):
    """Nach dem Titel zu urteilen, ob es sich bei der Stichprobe um einen Wildtyp handelt"""
    return result.samples[0][0].startswith("WT")

Anschließend wird eine Abfrage an GEO gesendet, um die verfügbaren Daten basierend auf der Art und dem Zelltumor abzurufen. In der Praxis können Sie Ihre private Funktion "_is_wild_type" durch eine Funktion ersetzen, die interaktiv wirkt und Ihren Biowissenschaftler nach Ihrer experimentellen Methode auswählen lässt. Beachten Sie auch, dass das Endergebnis pickle ist und sofort gespeichert wird. Durch nur einmaliges Abfragen auf diese Weise wird die Belastung des externen Servers verringert.

def get_geo_data(organism, cell_types, email, save_dir, is_desired_result):
    save_file = os.path.join(save_dir, "%s-results.pkl" % cell_types[0])
    if not os.path.exists(save_file):
        results = cell_type_gsms(organism, cell_types, email)
        for result in results:
            if is_desired_result(result):
                with open(save_file, "w") as out_handle:
                    cPickle.dump(result, out_handle)
                break

    with open(save_file) as save_handle:
        result = cPickle.load(save_handle)

Die Herausforderung, eine Abfrage an das GEO zu senden und die Ergebnisse zu erhalten, wird von der Entrez-Oberfläche von Biopython erledigt. Nach dem Aufpumpen der Abfrage werden die Ergebnisse in ein einfaches Objekt mit einer Beschreibung analysiert, die die Ausdrucksebene zusammen mit dem Titel und der ID für jede Probe enthält.

def cell_type_gsms(organism, cell_types, email):
    """Erhalten Sie GEO für bestimmte Arten und Zelltumoren mit Entrez.
    """
    Entrez.email = email
    search_term = "%s[ORGN] %s" % (organism, " OR ".join(cell_types))
    print "Searching GEO and retrieving results: %s" % search_term

    hits = []
    handle = Entrez.esearch(db="gds", term=search_term)
    results = Entrez.read(handle)
    for geo_id in results['IdList']:
        handle = Entrez.esummary(db="gds", id=geo_id)
        summary = Entrez.read(handle)
        samples = []
        for sample in summary[0]['Samples']:
            for cell_type in cell_types:
                 if sample['Title'].find(cell_type) >= 0:
                     samples.append((sample['Title'], sample['Accession']))
                     break
        if len(samples) > 0:
            hits.append(GEOResult(summary[0]['summary'], samples))
    return hits

Wenn Sie die Art des Experiments auswählen, durchbrechen Sie damit die erste Barriere. Als nächstes erhalten Sie den Wert der Ausdrucksebenendaten. Dazu wird ein Wörterbuch erstellt, das RefGene-IDs Ausdrucksebenen zuordnet. Mit anderen Worten, das Ergebnis ist:

WT ProB, biological rep1
[('NM_177327', [7.7430266269999999, 6.4795213670000003, 8.8766985500000004]),
('NM_001008785', [7.4671954649999996, 5.4761453329999998]),
('NM_177325', [7.3312364040000002, 11.831475960000001]),
('NM_177323', [6.9779868059999997, 6.3926399939999996]),
('NM_177322', [5.0833683379999997])]

Der eigentliche Aufwand besteht darin, das Expressionsniveau zu ermitteln und es der Gen-ID zuzuordnen, die die GEOquery-Bibliothek von Bioconductor für Sie erledigt. Die Genexpressionskorrespondenztabelle und Metadaten höherer Ordnung werden in einer lokalen Datei gespeichert. Ersteres ist eine tabulatorgetrennte Tabelle im R-Stil, und letzteres befindet sich in JSON. Speichern Sie sowohl lokal als auch in einem einfach zu lesenden Format.

def write_gsm_map(self, gsm_id, meta_file, table_file):
    """Daten zum GEO-Expressionsniveau werden unter Verwendung von Bioconductor erhalten und in einer Tabelle gespeichert.
    """
    robjects.r.assign("gsm.id", gsm_id)
    robjects.r.assign("table.file", table_file)
    robjects.r.assign("meta.file", meta_file)
    robjects.r('''
        library(GEOquery)
        library(rjson)
        gsm <- getGEO(gsm.id)
        write.table(Table(gsm), file = table.file, sep = "\t", row.names = FALSE,
        col.names = TRUE)
        cat(toJSON(Meta(gsm)), file = meta.file)
        ''')

Diese Funktion erstellt eine Korrespondenztabelle zwischen Sondennamen und Ausdrucksebenen. Um es bequemer zu machen, sollte die Sonde des Expressionsmikroarrays an die ID des biologischen Gens angepasst werden. Dies erfolgt durch erneutes Aufrufen der GEO-Bibliothek. Die Daten werden erneut in Form eines R-Datenrahmens abgerufen, und nur die interessierenden Elemente werden in einer durch Tabulatoren getrennten Datei gespeichert.

def _write_gpl_map(self, gpl_id, gpl_file):
    """Verwenden Sie R, um GEO-Plattformdaten abzurufen und in Tabellenform zu speichern"""
    robjects.r.assign("gpl.id", gpl_id)
    robjects.r.assign("gpl.file", gpl_file)
    robjects.r('''
    library(GEOquery)
    gpl <- getGEO(gpl.id)
    gpl.map <- subset(Table(gpl), select=c("ID", "RefSeq.Transcript.ID"))
    write.table(gpl.map, file = gpl.file, sep = "\t", row.names = FALSE,
    col.names = TRUE)
    ''')

Abschließend werde ich die bisherige Verarbeitung zusammenfassen. Laden Sie jede Korrespondenztabellendatei herunter, analysieren Sie sie und verbinden Sie die Korrespondenz mit der Ausdrucksebene-> Sonden-ID-> Transkript-ID. Das endgültige Wörterbuch enthält die ID des Gens, das dem Expressionsniveau zugeordnet ist, und wird daher zurückgegeben.

def get_gsm_tx_values(self, gsm_id, save_dir):
    """"Produkt transkribieren"=> 「GEO,Erstellen Sie eine Korrespondenztabelle mit "Ausdrucksebene aus GSM-Datei erhalten"
    """
    gsm_meta_file = os.path.join(save_dir, "%s-meta.txt" % gsm_id)
    gsm_table_file = os.path.join(save_dir, "%s-table.txt" % gsm_id)
    if (not os.path.exists(gsm_meta_file) or \
        not os.path.exists(gsm_table_file)):
        self._write_gsm_map(gsm_id, gsm_meta_file, gsm_table_file)

    with open(gsm_meta_file) as in_handle:
        gsm_meta = json.load(in_handle)
    id_to_tx = self.get_gpl_map(gsm_meta['platform_id'], save_dir)
    tx_to_vals = collections.defaultdict(list)
    with open(gsm_table_file) as in_handle:
        reader = csv.reader(in_handle, dialect='excel-tab')
        reader.next() # header
        for probe_id, probe_val in reader:
            for tx_id in id_to_tx.get(probe_id, []):
                tx_to_vals[tx_id].append(float(probe_val))
    return tx_to_vals

Das vollständige Skript (https://github.com/chapmanb/bcbb/blob/022c50b3132bc3d009ed1d533a3954bd564a9ed3/rest_apis/find_geo_data.py) ist eine Integration der alten Snippets. Wir haben mit der Abfrage begonnen und schließlich die erforderlichen Daten auf Ausdrucksebene erhalten.

Es ist jedoch ein Umweg im Vergleich zum idealen mit RDF geworden. Der Wunsch, den Zugriff auf fragegesteuerte Daten so einfach wie möglich zu gestalten, ist daher eine wiederkehrende Herausforderung für die Entwickler von Bioinformatik-Tools.


Die Übersetzung endet hier

Das Skript selbst lautet https://github.com/chapmanb/bcbb/blob/022c50b3132bc3d009ed1d533a3954bd564a9ed3/rest_apis/find_geo_data.py Es ist in.

Das Repository des Autors bcbb enthält viele andere nützliche Programme für die Bioinformatik.

Recommended Posts

Automatische Erfassung von Genexpressionsdaten durch Python und R.
Hashing von Daten in R und Python
Empfohlene Bücher und Quellen für die Datenanalyseprogrammierung (Python oder R)
Praxis der Datenanalyse durch Python und Pandas (Tokyo COVID-19 Data Edition)
R- und Python-Schreibvergleich (euklidische Methode der gegenseitigen Teilung)
Automatische Erfassung von Aktienkursdaten mit Docker-Compose
Python / Automatic Low Wrench, nicht für experimentelle Daten geeignet
Analyse von Finanzdaten durch Pandas und deren Visualisierung (2)
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Analyse von Finanzdaten durch Pandas und deren Visualisierung (1)
Visualisierung von Daten anhand einer erklärenden Variablen und einer objektiven Variablen
Verstehen Sie den Status des Datenverlusts - Python vs. R.
Anwendung von Python: Datenbereinigung Teil 3: Verwendung von OpenCV und Vorverarbeitung von Bilddaten
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
Scrapen der gewünschten Daten von der Website durch Verknüpfen von Python und Excel
[Einführung in Data Scientists] Grundlagen von Python ♬ Funktionen und Klassen
Vergleich der Datenrahmenbehandlung in Python (Pandas), R, Pig
Automatisches Update des Python-Moduls
Visualisierung von Daten nach Präfektur
Quellinstallation und Installation von Python
Funktioniert mit Python und R.
"Einführung in die Datenanalyse durch statistische Bayes'sche Modellierung beginnend mit R und Stan" in Python implementiert
Portiert von der R-Sprache von "Sazae-sans Janken Data Analysis" nach Python
Eine einfache Datenanalyse von Bitcoin, die von CoinMetrics in Python bereitgestellt wird
Impressionen von Touch, einem von Python erstellten Datenvisualisierungstool
[Python] Implementierung der Nelder-Mead-Methode und Speichern von GIF-Bildern durch matplotlib
Automatische Erstellung des Monatskalenders 2021 (Nachfüllung für Systemnotizbuch) durch Python
[Einführung in Data Scientists] Grundlagen von Python ♬ Bedingte Verzweigung und Schleifen
[Einführung in Data Scientists] Grundlagen von Python ♬ Funktionen und anonyme Funktionen usw.
Die Geschichte von Python und die Geschichte von NaN
Installation von SciPy und matplotlib (Python)
Datenerfassung mit Python Googlemap API
Erweiterung des Python-Wörterbuchs um Argumente
Dies und das von Python-Eigenschaften
10 Auswahlen der Datenextraktion durch pandas.DataFrame.query
Verhalten von Python3 durch Sakuras Server
Animation von Geodaten durch Geopandas
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Geschichte der Potenznäherung von Python
Zusammenfassung der Python-Indizes und -Slices
Reputation von Python-Büchern und Nachschlagewerken
Vorverarbeitung von Wikipedia-Dump-Dateien und gemeinsame Nutzung großer Datenmengen mit MeCab
Einfacher Datenaustausch zwischen Python, R und Julia im Feather-Format
Ableitung der multivariaten t-Verteilung und Implementierung der Zufallszahlengenerierung durch Python
Erfassung und Visualisierung von Sensordaten für das Pflanzenwachstum mit Intel Edison und Python
Ich habe 0 Jahre Programmiererfahrung und fordere die Datenverarbeitung mit Python heraus
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
__Getattr__ und __getattribute__, um die Erfassung von Objektattributen durch Punkte anzupassen
Python: Vorverarbeitung beim maschinellen Lernen: Umgang mit fehlenden / Ausreißern / unausgeglichenen Daten
[Steuerungstechnik] Berechnung von Übertragungsfunktionen und Zustandsraummodellen durch Python
Ich möchte ein Pfaddiagramm der verteilten co-verteilten Strukturanalyse (SEM) ausgeben, indem ich Python und R verbinde.