[PYTHON] J'ai essayé d'analyser les données scRNA-seq en utilisant l'analyse des données topologiques (TDA)

Qu'est-ce que l'analyse des données topologiques?

La topologie est un domaine des mathématiques traitant des «formes». Une méthode d'analyse de données appelée analyse des données topologiques (TDA) capture la forme représentée par un grand nombre de données dans un espace de grande dimension en tant que caractéristique des données et l'analyse. TDA est appliqué dans divers domaines tels que le traitement du langage naturel et la reconnaissance d'images. J'ai essayé d'analyser les données scRNA-seq en utilisant ce TDA. Single cell RNA-seq(scRNA-seq) Au sein d'un organisme multicellulaire individuel, toutes les cellules portent fondamentalement le même gène. Cependant, les gènes qui y sont exprimés diffèrent d'une cellule à l'autre. RNA-seq est une technologie qui détecte tous les gènes exprimés dans les cellules, et un seul ARN-seq (scRNA-seq) est une technologie qui effectue cet ARN-seq au niveau de la cellule unique. scRNA-seq est une technique appropriée pour analyser la diversité cellulaire au niveau de l'expression génique. Récemment, la diversité des cellules souches cancéreuses et la diversité des cellules dans le processus de différenciation ont été bien étudiées.

Analyse des données scRNA-seq

Actuellement, plus de 20 000 gènes ont été identifiés chez l'homme. RNA-seq peut être utilisé pour obtenir les niveaux d'expression de tous les gènes. Puisque scRNA-seq gère les données de milliers à des dizaines de milliers de cellules, il est nécessaire d'analyser des données de milliers à des dizaines de milliers d'environ 20 000 dimensions. TDA est une bonne méthode pour analyser une si grande quantité de données de grande dimension.

base de données

Dans cette analyse, nous avons utilisé des données publiées dans une base de données publique. Publié dans la base de données GEO, le numéro d'accès est GSE67310est. Vous pouvez obtenir les données que le niveau d'expression appelé GSE67310_iN_data_log2FPKM_annotated.txt.gz est converti en valeur FPKM. Des informations telles que le niveau d'expression de chaque gène, le moment (time_point) et le type de cellule (affectation) sont décrites. iNeuron L'expression forcée du gène Ascl1 dans le fibroblaste embryonnaire de souris provoque une reprogrammation cellulaire, revenant à un état indifférencié et lui permettant de se différencier en cellules nerveuses. Les cellules sont collectées à 5 moments (jour0, jour2, jour5 jour20, jour22) à partir du début de la différenciation et scRNA-seq est effectué.

code python

Exécutez la filtration Vietris-Rips pour obtenir un seul complexe. Une unité principale est une ligne reliant des points de données. J'ai essayé d'illustrer cela comme un graphique non orienté en utilisant networkx.

Load libraries
import numpy as np
import pandas as pd
import gudhi as gd
import networkx as nx
Reading data
x = pd.read_csv('GSE67310_iN_data_log2FPKM_annotated.txt', delimiter = '\t')
Triming data
y = x.drop('cell_name', axis = 1)
y = y.drop('assignment', axis = 1)
y = y.drop('log_tauGFP_intensity', axis = 1)
y = y.drop('experiment', axis = 1)
y = y.drop('time_point', axis = 1)
y.index = x.cell_name
Creating color table by day
day_color = pd.DataFrame()
for i in range(len(x)):
  if x.time_point[i] == 0:
    day_color[y.index[i]] = 'red'
  elif x.time_point[i] == 2:
    day_color[y.index[i]] = 'yellow'
  elif x.time_point[i] == 5:
    day_color[y.index[i]] = 'green'
  elif x.time_point[i] == 20:
    day_color[y.index[i]] = 'purple'
  else:
     day_color[y.index[i]] = 'blue'
Creating color table by cell type
type_color = pd.Series()
for i in range(len(x)):
  if x.assignment[i] == 'MEF':
    type_color[y.index[i]] = 'red'
  elif x.assignment[i] == 'd2_induced':
    type_color[y.index[i]] = 'yellow'
  elif x.assignment[i] == 'd2_intermediate':
    type_color[y.index[i]] = 'orange'
  elif x.assignment[i] == 'd5_earlyiN':
    type_color[y.index[i]] = 'skyblue'
  elif x.assignment[i] == 'd5_earlyMyocyte':
    type_color[y.index[i]] = 'lightgeen'
  elif x.assignment[i] == 'd5_intermediate':
    type_color[y.index[i]] = 'brown'
  elif x.assignment[i] == 'd5_failedReprog':
    type_color[y.index[i]] = 'gray'
  elif x.assignment[i] == 'd22_failedReprog':
    type_color[y.index[i]] = 'black'
  elif x.assignment[i] == 'Neuron':
    type_color[y.index[i]] = 'blue'
  elif x.assignment[i] == 'Myocyte':
    type_color[y.index[i]] = 'green'
  else:
    type_color[y.index[i]] = 'white'
Computing Vietris-Rips complex
rips = gd.RipsComplex(y.values, max_edge_length = 250)
Computing simplex tree
simplex_tree = rips.create_simplex_tree(max_dimension = 2)
Computing skeleton
skeleton = simplex_tree.get_skeleton(2)
Getting persistence diagram
diag = simplex_tree.persistence()
Plotting persistence diagram
gd.plot_persistence_diagram(diag)
Plotting persistence density
gd.plot_persistence_density(diag)
Constructing netowrk
g = nx.Graph()
for i in range(len(skeleton)):
  if len(skeleton[i][0]) == 2:
    g.add_edge(y.index[skeleton[i][0][0]], y.index[skeleton[i][0][1]])
layout = nx.kamada_kawai_layout(g)
nx.draw_networkx_nodes(g,layout,lineidths=0.2, edgecolors='black', node_size=20, node_color = day_color[list(g.nodes())].values)
nx.draw_networkx_edges(g, layout, width = 0.2, edge_color = 'gray')
nx.draw_networkx_nodes(g,layout,lineidths=0.2, edgecolors='black', node_size=20, node_color = type_color[list(g.nodes())].values)
nx.draw_networkx_edges(g, layout, width = 0.2, edge_color = 'gray')

iNeuron_Persistence_diagram.tiff iNeuron_Persistence_density.tiff iNeuron_Network_time_point_samll.tiff iNeuron_Network_cell_type_small.tiff Lorsqu'il est codé par couleur par point temporel, il se propage du jour 0 (rouge) au jour 22 (bleu), et on peut voir que le modèle d'expression génique se diversifie. Si vous codez par couleur par type de cellule, vous pouvez voir que les cellules du jour 22 sont divisées en neurone (bleu) et myocyte (vert).

Conclusion

J'ai analysé les données scRNA-seq avec TDA. Les cellules sont séparées par point temporel et type de cellule, et je pense que nous avons pu les regrouper proprement. Le TDA n'est-il pas efficace pour analyser les données scRNA-seq?

référence

GUDHI Python modules documentation Treutlein B, Lee QY, Camp JG, Mall M et al. Dissecting direct reprogramming from fibroblast to neuron using single-cell RNA-seq. Nature 2016 Jun 16;534(7607):391-5. GSE67310

Recommended Posts

J'ai essayé d'analyser les données scRNA-seq en utilisant l'analyse des données topologiques (TDA)
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai essayé d'analyser mon chanteur préféré (SHISHAMO) en utilisant l'API Spotify
J'ai essayé de visualiser les données BigQuery à l'aide de Jupyter Lab avec GCP
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc Préparation 1
J'ai essayé d'utiliser Azure Speech to Text.
J'ai essayé d'utiliser l'API de données YOUTUBE V3
J'ai essayé l'analyse factorielle avec des données Titanic!
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé l'analyse de données IRMf avec python (Introduction au décodage des informations cérébrales)
J'ai essayé d'analyser la carte du Nouvel An par moi-même en utilisant python
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de synthétiser des fichiers WAV en utilisant Pydub.
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
J'ai essayé d'obtenir des données CloudWatch avec Python
Qiita Job J'ai essayé d'analyser le travail
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé d'expliquer l'analyse de régression multiple aussi facilement que possible à l'aide d'exemples concrets.
J'ai essayé de faire MAP rapidement une personne suspecte en utilisant les données d'adresse Geolonia
J'ai essayé d'utiliser paramétré
Analyse des données à l'aide de xarray
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai commencé à analyser
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé de déboguer.
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai essayé de regrouper les données ECG en utilisant la méthode K-Shape
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai essayé de devenir un Ann Man en utilisant OpenCV