Этот пример показывает, как 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 8340 cell
Если у вас есть SimBiology, можно создать график с помощью следующих команд:
% sbioloadproject oscillator % class(m1) % Now get the adjacency matrix % [g,names] = getadjacencymatrix(m1);
Существует много функций в MATLAB® для работы с разреженными матрицами. Функция spy
отображает как * везде, где существует ненулевой элемент матрицы.
spy(g)
Это дает некоторую индикацию относительно количества ребер графика и также показывает, что график не симметричен и, следовательно, является ориентированным графом. Однако трудно визуализировать то, что продолжается. Объект biograph
является другим способом представлять график в Bioinformatics Toolbox.
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);
Существует несколько функций в Bioinformatics Toolbox для работы с графиками. Они включают graphshortestpath
, который находит кратчайший путь между двумя узлами, graphisspantree
, который проверяет, является ли график деревом охвата и graphisdag
, который проверяет, является ли график направленным графом без петель.
graphisdag(g)
ans = logical 0
Существуют также соответствующие методы биообъекта диаграмм. Они имеют имена, подобные функциям для работы с разреженными матрицами, но без префиксного 'графика'.
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, свинцом и 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 и Leibler, S., "Синтетическая колебательная сеть транскрипционных регуляторов", природа, 403 (6767):335-8, 2000.