В этом примере показано, как Toolbox™ биоинформатики можно использовать для работы и визуализации графиков.
Графы, в смысле теории графов, являются математическим способом представления связей или отношений между объектами. Есть много приложений в биоинформатике, где понимание отношений между объектами очень важно. Такие применения включают филогенетический анализ, белково-белковые взаимодействия, анализ путей и многое другое. Инструментарий биоинформатики предоставляет набор общих функций для работы с графиками и их визуализации.
Функции теории графов в 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
Часто задаваемый вопрос о графе - это кратчайший путь между двумя узлами. Обратите внимание, что в этом примере все кромки имеют длину 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.