<НА ГЛАВНУЮ

Создание и визуализация биологических графов знаний с PyBEL: подробный туториал в Google Colab

В этом уроке показано, как построить и проанализировать сложный граф знаний болезни Альцгеймера с использованием PyBEL в Google Colab, включая продвинутые сетевые метрики и визуализацию.

Установка необходимых пакетов

В этом уроке мы начинаем с установки экосистемы PyBEL и ключевых библиотек, таких как NetworkX, Matplotlib, Seaborn и Pandas, в Google Colab. Это обеспечивает готовность всех инструментов для построения и анализа биологических графов знаний.

!pip install pybel pybel-tools networkx matplotlib seaborn pandas -q
 
import pybel
import pybel.dsl as dsl
from pybel import BELGraph
from pybel.io import to_pickle, from_pickle
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from collections import Counter
import warnings
warnings.filterwarnings('ignore')

Построение графа знаний болезни Альцгеймера

Инициализируется BELGraph для моделирования молекулярных взаимодействий, связанных с болезнью Альцгеймера. Белки, такие как APP, Abeta, tau и GSK3B, а также биологические процессы, например воспаление и апоптоз, определяются с помощью DSL PyBEL. Демонстрируется кодирование причинно-следственных связей, модификаций белков (например, фосфорилирование tau) и ассоциаций с указанием ссылок на литературу.

graph = BELGraph(
   name="Alzheimer's Disease Pathway",
   version="1.0.0",
   description="Example pathway showing protein interactions in AD",
   authors="PyBEL Tutorial"
)
 
app = dsl.Protein(name="APP", namespace="HGNC")
abeta = dsl.Protein(name="Abeta", namespace="CHEBI")
tau = dsl.Protein(name="MAPT", namespace="HGNC")
gsk3b = dsl.Protein(name="GSK3B", namespace="HGNC")
inflammation = dsl.BiologicalProcess(name="inflammatory response", namespace="GO")
apoptosis = dsl.BiologicalProcess(name="apoptotic process", namespace="GO")
 
 
graph.add_increases(app, abeta, citation="PMID:12345678", evidence="APP cleavage produces Abeta")
graph.add_increases(abeta, inflammation, citation="PMID:87654321", evidence="Abeta triggers neuroinflammation")
 
 
tau_phosphorylated = dsl.Protein(name="MAPT", namespace="HGNC",
                               variants=[dsl.ProteinModification("Ph")])
graph.add_increases(gsk3b, tau_phosphorylated, citation="PMID:11111111", evidence="GSK3B phosphorylates tau")
graph.add_increases(tau_phosphorylated, apoptosis, citation="PMID:22222222", evidence="Hyperphosphorylated tau causes cell death")
graph.add_increases(inflammation, apoptosis, citation="PMID:33333333", evidence="Inflammation promotes apoptosis")
 
 
graph.add_association(abeta, tau, citation="PMID:44444444", evidence="Abeta and tau interact synergistically")
 
print(f"Создан BEL граф с {graph.number_of_nodes()} узлами и {graph.number_of_edges()} ребрами")

Продвинутый сетевой анализ

В уроке применяется расчет центральностей (degree, betweenness, closeness) с помощью NetworkX для выявления ключевых узлов графа. Этот анализ помогает определить важные белки и процессы, критичные для болезни.

degree_centrality = nx.degree_centrality(graph)
betweenness_centrality = nx.betweenness_centrality(graph)
closeness_centrality = nx.closeness_centrality(graph)
 
most_central = max(degree_centrality, key=degree_centrality.get)
print(f"Наиболее связанный узел: {most_central}")
print(f"Степень центральности: {degree_centrality[most_central]:.3f}")

Классификация биологических сущностей

Узлы классифицируются по функциям — белки или биологические процессы, что позволяет получить количественную оценку состава графа.

node_types = Counter()
for node in graph.nodes():
   node_types[node.function] += 1
 
print("Распределение узлов:")
for func, count in node_types.items():
   print(f"  {func}: {count}")

Анализ состава пути и типов связей

Разделение белков и процессов для оценки сложности пути. Подсчет типов ребер показывает преобладающие виды взаимодействий, например, «увеличение» или «ассоциация».

proteins = [node for node in graph.nodes() if node.function == 'Protein']
processes = [node for node in graph.nodes() if node.function == 'BiologicalProcess']
 
print(f"Белков в пути: {len(proteins)}")
print(f"Биологических процессов: {len(processes)}")
 
edge_types = Counter()
for u, v, data in graph.edges(data=True):
   edge_types[data.get('relation')] += 1
 
print("\nТипы отношений:")
for rel, count in edge_types.items():
   print(f"  {rel}: {count}")

Анализ литературных данных

Извлечение идентификаторов цитат и доказательств из ребер для оценки научной обоснованности графа. Отчет о количестве всех и уникальных цитат.

citations = []
evidences = []
for _, _, data in graph.edges(data=True):
   if 'citation' in data:
       citations.append(data['citation'])
   if 'evidence' in data:
       evidences.append(data['evidence'])
 
print(f"Всего цитат: {len(citations)}")
print(f"Уникальных цитат: {len(set(citations))}")
print(f"Доказательств: {len(evidences)}")

Извлечение подграфа воспаления

Создается подграф, сосредоточенный вокруг воспаления и соседних узлов, для более детального изучения механизмов болезни.

inflammation_nodes = [inflammation]
inflammation_neighbors = list(graph.predecessors(inflammation)) + list(graph.successors(inflammation))
inflammation_subgraph = graph.subgraph(inflammation_nodes + inflammation_neighbors)
 
print(f"Подграф воспаления: {inflammation_subgraph.number_of_nodes()} узлов, {inflammation_subgraph.number_of_edges()} ребер")

Запросы к графу для анализа путей

Перебор простых путей между APP и апоптозом для поиска механистических маршрутов, а также список факторов, увеличивающих апоптоз.

try:
   paths = list(nx.all_simple_paths(graph, app, apoptosis, cutoff=3))
   print(f"Пути от APP к апоптозу: {len(paths)}")
   if paths:
       print(f"Длина кратчайшего пути: {len(paths[0])-1}")
except nx.NetworkXNoPath:
   print("Пути между APP и апоптозом не найдены")
 
apoptosis_inducers = list(graph.predecessors(apoptosis))
print(f"Факторы, увеличивающие апоптоз: {len(apoptosis_inducers)}")

Визуализация и экспорт данных

Создаются несколько графиков для визуализации структуры сети, распределения центральностей, пропорций типов узлов и типов связей, что помогает глубже интерпретировать биологический граф знаний.

adj_matrix = nx.adjacency_matrix(graph)
node_labels = [str(node) for node in graph.nodes()]
 
plt.figure(figsize=(12, 8))
 
plt.subplot(2, 2, 1)
pos = nx.spring_layout(graph, k=2, iterations=50)
nx.draw(graph, pos, with_labels=False, node_color='lightblue',
       node_size=1000, font_size=8, font_weight='bold')
plt.title("BEL Network Graph")
 
plt.subplot(2, 2, 2)
centralities = list(degree_centrality.values())
plt.hist(centralities, bins=10, alpha=0.7, color='green')
plt.title("Распределение степени центральности")
plt.xlabel("Центральность")
plt.ylabel("Частота")
 
plt.subplot(2, 2, 3)
functions = list(node_types.keys())
counts = list(node_types.values())
plt.pie(counts, labels=functions, autopct='%1.1f%%', startangle=90)
plt.title("Распределение типов узлов")
 
plt.subplot(2, 2, 4)
relations = list(edge_types.keys())
rel_counts = list(edge_types.values())
plt.bar(relations, rel_counts, color='orange', alpha=0.7)
plt.title("Типы отношений")
plt.xlabel("Отношение")
plt.ylabel("Количество")
plt.xticks(rotation=45)
 
plt.tight_layout()
plt.show()

Этот урок показывает мощь и гибкость PyBEL для моделирования сложных биологических систем, создания, аннотирования и визуализации графов знаний. Пользователям рекомендуется расширять этот подход на собственные данные, интегрировать омics-данные и применять машинное обучение.

🇬🇧

Switch Language

Read this article in English

Switch to English