Этот пример показов, как Bioinformatics Toolbox™ может использоваться для работы и визуализации графиков.
Графики в смысле теории графиков являются математическим способом представления связей или отношений между объектами. Существует много применений в биоинформатике, где понимание отношений между объектами очень важно. Такие применения включают филогенетический анализ, белко-белковые взаимодействия, путевой анализ и многое другое. Bioinformatics Toolbox предоставляет набор типовых функций для работы с графиками и визуализации.
Функции теории графиков в Bioinformatics Toolbox работают с разреженными матрицами. Единственным ограничением является то, что матрица является квадратной. В этом примере график был создан из модели SimBiology ® осцилляционной сети Repressilator [1]. В этой модели белок A подавляет белок B, белок B подавляет белок C, который в свою очередь подавляет белок A.
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 ® существует много функций для работы с разреженными матрицами. The spy
функция отображается как * везде, где есть ненулевой элемент матрицы.
spy(g)
Это дает некоторое указание на количество ребер графика, а также показывает, что график не симметричен и, следовательно, является ориентированным графом. Однако трудно визуализировать, что происходит. The biograph
объект является другим способом представления графика в Bioinformatics Toolbox.
gObj = biograph(g,names)
Biograph object with 65 nodes and 123 edges.
The 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);
В Bioinformatics Toolbox существует несколько функций для работы с графиками. К ним относятся 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');
Другой распространенной задачей с графиками является нахождение эффективного способа пройти график путем перемещения между соседними узлами. The 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] Elowitz, M.B, and Leibler, S., «A Synthetic Assillator Network of Transcriptional Regulators», Nature, 403 (6767): 335-8, 2000.