exponenta event banner

Работа с функциями теории графов

В этом примере показано, как Toolbox™ биоинформатики можно использовать для работы и визуализации графиков.

Графы, в смысле теории графов, являются математическим способом представления связей или отношений между объектами. Есть много приложений в биоинформатике, где понимание отношений между объектами очень важно. Такие применения включают филогенетический анализ, белково-белковые взаимодействия, анализ путей и многое другое. Инструментарий биоинформатики предоставляет набор общих функций для работы с графиками и их визуализации.

Создание графика на основе модели SimBiology ®

Функции теории графов в Bioinformatics Toolbox работают на разреженных матрицах. Единственным ограничением является то, что матрица является квадратной. В этом примере график был создан из модели SimBiology ® колебательной сети репрессилатора [1]. В этой модели белок А подавляет белок В, белок В подавляет белок С, который в свою очередь подавляет белок А.

load oscillatorgraph

Существует две переменные: g, разреженная матрица и names, список имен узлов графа.

whos g names
  Name        Size            Bytes  Class     Attributes

  g          65x65             2544  double    sparse    
  names      65x1              7820  cell                

При наличии SimBiology можно создать график с помощью следующих команд:

% sbioloadproject oscillator
% class(m1)
% Now get the adjacency matrix
% [g,names] = getadjacencymatrix(m1);

Визуализация графика

В MATLAB ® существует множество функций для работы с разреженными матрицами. spy функция отображается как * там, где имеется ненулевой элемент матрицы.

spy(g)

Это дает некоторое указание на число рёбер графа, а также показывает, что граф не симметричен и, следовательно, является направленным графом. Однако трудно представить, что происходит. biograph объект является еще одним способом представления графика в панели инструментов биоинформатики.

gObj = biograph(g,names)
Biograph object with 65 nodes and 123 edges.

view метод размещает график и отображает его на рисунке.

gObj = view(gObj);

Вы можете взаимодействовать с графиком с помощью мыши. Можно также программно изменить способ отображения графика.

% find the nodes pA, pB, and pC
pANode = find(strcmp('pA', names));
pBNode = find(strcmp('pB',names));
pCNode = find(strcmp('pC', names));
% Color these red, green, and blue
gObj.nodes(pANode).Color = [1 0 0];
gObj.nodes(pANode).Size = [40 30];
gObj.nodes(pBNode).Color = [0 1 0];
gObj.nodes(pBNode).Size = [40 30];
gObj.nodes(pCNode).Color = [0 0 1];
gObj.nodes(pCNode).Size = [40 30];
dolayout(gObj);

Использование функций теории графов

В инструментарии биоинформатики имеется несколько функций для работы с графиками. К ним относятся graphshortestpath, который находит кратчайший путь между двумя узлами, graphisspantree, который проверяет, является ли граф покрывающим деревом, и graphisdag, который проверяет, является ли граф направленным ациклическим графом.

graphisdag(g)
ans =

  logical

   0

Существуют также соответствующие методы объекта-биографа. Они имеют имена, аналогичные функциям для работы с разреженными матрицами, но без префикса «graph».

isdag(gObj)
ans =

  logical

   0

Поиск кратчайшего пути между узлами pA и pC

Часто задаваемый вопрос о графе - это кратчайший путь между двумя узлами. Обратите внимание, что в этом примере все кромки имеют длину 1.

[dist,path,pred] = shortestpath(gObj,pANode,pCNode);

Окраска узлов и краев кратчайшего пути

set(gObj.Nodes(path),'Color',[1 0.4 0.4])
edges = getedgesbynodeid(gObj,get(gObj.Nodes(path),'ID'));
set(edges,'LineColor',[1 0 0])
set(edges,'LineWidth',1.5)

Вы можете использовать allshortestpaths для вычисления кратчайших путей от каждого узла ко всем другим узлам.

allShortest = allshortestpaths(gObj);

Тепловая карта этих расстояний показывает некоторые интересные закономерности.

imagesc(allShortest)
colormap(pink);
colorbar
title('All Shortest Paths for Oscillator Model');

Обход графика

Другой распространенной задачей с графами является поиск эффективного способа прохождения графа путём перемещения между смежными узлами. traverse по умолчанию метод использует поиск по глубине, но можно также использовать поиск по ширине.

order = traverse(gObj,pANode);

Возвращаемое значение order показывает порядок прохождения узлов, начиная с pA. Это можно использовать для поиска альтернативного пути от pA к pC.

alternatePath = order(1:find(order == pCNode));
set(gObj.Nodes(alternatePath),'Color',[0.4 0.4 1])
edges = getedgesbynodeid(gObj,get(gObj.Nodes(alternatePath),'ID'));
set(edges,'LineColor',[0 0 1])
set(edges,'LineWidth',1.5)

Поиск связанных компонентов на графике

Модель генератора является циклической с подключенными pA, pB и pC. Метод conncomp находит связанные компоненты. Сильно связная составляющая графа - это максимальная группа узлов, взаимно достижимых без нарушения рёберных направлений. Вы можете использовать conncomp способ определения, какие узлы не являются частью основного цикла.

[S,C] = conncomp(gObj);

% Mark the nodes for each component with different color
colors = flipud(jet(S));
for i = 1:numel(gObj.nodes)
    gObj.Nodes(i).Color = colors(C(i),:);
end

Вы заметите, что «мусорный» узел является раковиной. Несколько узлов подключаются к этому узлу, но нет пути от «корзины» к любому другому узлу.

Моделирование выбивания реакции

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

Найдите узлы, в которых вы заинтересованы.

r1Node = find(strcmp( 'Reaction1', names));
r2Node = find(strcmp( 'Reaction2', names));

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

gNoR1 = g;
gNoR1(r1Node,:) = 0;
gNoR1(:,r1Node) = 0;
gNoR2 = g;
gNoR2(r2Node,:) = 0;
gNoR2(:,r2Node) = 0;

В случае, когда мы удаляем Reaction2, все еще есть пути от pA к pC и обратно, и структура не очень изменилась.

distNoR2CA = graphshortestpath(gNoR2,pCNode,pANode)
distNoR2AC = graphshortestpath(gNoR2,pANode,pCNode)
% Display the graph from which Reaction2 was removed.
gNoR2Obj = view(biograph(gNoR2,names));
[S,C] = conncomp(gNoR2Obj);
% Mark the nodes for each component with different color
colors = flipud(jet(S));
for i = 1:numel(gNoR2Obj.nodes)
    gNoR2Obj.Nodes(i).Color = colors(C(i),:);
end
distNoR2CA =

    10


distNoR2AC =

    14

Однако в случае, когда мы удаляем Reaction1, больше нет пути от pC обратно к pA.

distNoR1AC = graphshortestpath(gNoR1,pANode,pCNode)
distNoR1CA = graphshortestpath(gNoR1,pCNode,pANode)
distNoR1AC =

    14


distNoR1CA =

   Inf

Когда вы визуализируете график, из которого Reaction1 был удален, вы увидите значительное изменение в структуре графика.

% Display the graph from which Reaction1 was removed.
gNoR1Obj = view(biograph(gNoR1,names));
[S,C] = conncomp(gNoR1Obj);
% Mark the nodes for each component with different color
colors = flipud(jet(S));
for i = 1:numel(gNoR1Obj.nodes)
    gNoR1Obj.Nodes(i).Color = colors(C(i),:);
end

Ссылки

[1] Эловиц, М.Б, и Лейблер, С., «Синтетическая колебательная сеть регуляторов транскрипции», Nature, 403 (6767): 335-8, 2000.