Анализ профиля экспрессии гена

Этот пример показывает много способов искать шаблоны в профилях экспрессии гена.

Исследование набора данных

Этот пример использует данные из исследования микромассивов экспрессии гена в дрожжах, опубликованных DeRisi, и др. 1997 [1]. Авторы использовали микромассивы DNA, чтобы изучить временную экспрессию гена почти всех генов в Saccharomyces cerevisiae во время метаболического сдвига от ферментации до дыхания. Уровни экспрессии были измерены в семи моментах времени во время сдвига diauxic. Полный набор данных может быть загружен с веб-сайта Автобуса Экспрессии гена, http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE28.

yeastdata.mat MAT-файла содержит значения выражения (log2 отношения CH2DN_MEAN и CH1DN_MEAN) от этих семи временных шагов в эксперименте, именах генов и массиве времен, в которые были измерены уровни экспрессии.

load yeastdata.mat

Чтобы понять размер данных, можно использовать numel(genes), чтобы показать, сколько генов включено в набор данных.

numel(genes)
ans =

        6400

Можно получить доступ к генным именам, сопоставленным с экспериментом путем индексации переменной genes, массив ячеек, представляющий названия генов. Например, 15-й элемент в genes является YAL054C. Это указывает, что 15-я строка переменной yeastvalues содержит уровни экспрессии для YAL054C.

genes{15}
ans =

    'YAL054C'

Простой график может использоваться, чтобы показать профиль выражения для этого ORF.

plot(times, yeastvalues(15,:))
xlabel('Time (Hours)');
ylabel('Log2 Relative Expression Level');

Можно также построить фактические отношения выражения, а не log2-преобразованные значения.

plot(times, 2.^yeastvalues(15,:))
xlabel('Time (Hours)');
ylabel('Relative Expression Level');

Ген, сопоставленный с этим ORF, ACS1, кажется, строго отрегулирован во время сдвига diauxic. Можно сравнить выражение этого гена к выражению других генов путем строения нескольких графиков на той же фигуре.

hold on
plot(times, 2.^yeastvalues(16:26,:)')
xlabel('Time (Hours)');
ylabel('Relative Expression Level');
title('Profile Expression Levels');

Фильтрация генов

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

Если вы просмотрите список генов, вы будете видеть несколько мест, отмеченных как 'EMPTY'. Это пустые пятна на массиве, и в то время как им можно было сопоставить данные с ними, в целях этого примера, можно рассмотреть эти вопросы, чтобы быть шумом. Эти точки могут быть найдены с помощью функции strcmp и удалены из набора данных с индексацией команд.

emptySpots = strcmp('EMPTY',genes);
yeastvalues(emptySpots,:) = [];
genes(emptySpots) = [];
numel(genes)
ans =

        6314

Существуют, также видят несколько мест в наборе данных, где уровень экспрессии отмечен как NaN. Это указывает, что никакие данные не были собраны для этого пятна на шаге определенного времени. Один подход к контакту с этими отсутствующими значениями должен был бы приписать им использующий среднее значение или медиану данных для определенного гена в зависимости от времени. Этот пример использует менее строгий подход простого выбрасывания данных для любых генов, где один или несколько уровень экспрессии не был измерен. Функциональный isnan используется, чтобы идентифицировать гены с недостающими данными, и команды индексации используются, чтобы удалить гены с недостающими данными.

nanIndices = any(isnan(yeastvalues),2);
yeastvalues(nanIndices,:) = [];
genes(nanIndices) = [];
numel(genes)
ans =

        6276

Если бы необходимо было построить профили выражения всех остающихся профилей, вы видели бы, что большинство профилей является плоским и не существенно отличается от других. Эти плоские данные, очевидно, имеют применение, когда это указывает, что гены, сопоставленные с этими профилями, не значительно затронуты сдвигом diauxic; однако, в этом примере, вы интересуетесь генами с большими изменениями в выражении, сопровождающем сдвиг diauxic. Можно использовать функции фильтрации в Bioinformatics Toolbox™, чтобы удалить гены с различными типами профилей, которые не предоставляют полезную информацию о генах, затронутых метаболическим изменением.

Можно использовать функцию genevarfilter, чтобы отфильтровывать гены с небольшим отклонением в зависимости от времени. Функция возвращает логический массив (т.е. маска) одного размера как переменная genes с единицами, соответствующими строкам yeastvalues с отклонением, больше, чем 10-я процентиль и нули, соответствующие тем ниже порога. Можно использовать маску, чтобы индексировать в значения и удалить отфильтрованные гены.

mask = genevarfilter(yeastvalues);

yeastvalues = yeastvalues(mask,:);
genes = genes(mask);
numel(genes)
ans =

        5648

Функциональный genelowvalfilter удаляет гены, которые имеют очень низко абсолютные значения выражения. Обратите внимание на то, что эти функции filter могут также автоматически вычислить отфильтрованные данные и имена, таким образом, не необходимо индексировать исходные данные с помощью маски.

[mask,yeastvalues,genes] = genelowvalfilter(yeastvalues,genes,'absval',log2(3));
numel(genes)
ans =

   822

Наконец, можно использовать функциональный geneentropyfilter, чтобы удалить гены, профили которых имеют низкую энтропию, например, энтропийные уровни в 15-й процентили данных.

[mask,yeastvalues,genes] = geneentropyfilter(yeastvalues,genes,'prctile',15);
numel(genes)
ans =

   614

Кластерный анализ

Теперь, когда у вас есть управляемый список генов, можно искать отношения между профилями с помощью некоторых различных методов кластеризации от Statistics and Machine Learning Toolbox™. Для иерархической кластеризации функциональный pdist вычисляет попарные расстояния между профилями, и linkage создает иерархическое кластерное дерево.

corrDist = pdist(yeastvalues,'corr');
clusterTree = linkage(corrDist,'average');

Функция cluster вычисляет кластеры или на основе расстояния сокращения или на основе максимального количества кластеров. В этом случае опция maxclust используется, чтобы идентифицировать 16 отличных кластеров.

clusters = cluster(clusterTree,'maxclust',16);

Профили генов в этих кластерах могут быть построены вместе с помощью простого цикла и команды subplot.

figure
for c = 1:16
    subplot(4,4,c);
    plot(times,yeastvalues((clusters == c),:)');
    axis tight
end
suptitle('Hierarchical Clustering of Profiles');

Statistics and Machine Learning Toolbox также имеет K-средние-значения, кластеризирующие функцию. Снова, шестнадцать кластеров найдены, но потому что алгоритм отличается, они не обязательно будут теми же кластерами как найденные иерархической кластеризацией.

Инициализируйте состояние генератора случайных чисел, чтобы гарантировать, что фигуры, сгенерированные ими, управляют, совпадают с фигурами в версии HTML этого примера.

rng('default');

[cidx, ctrs] = kmeans(yeastvalues,16,'dist','corr','rep',5,'disp','final');
figure
for c = 1:16
    subplot(4,4,c);
    plot(times,yeastvalues((cidx == c),:)');
    axis tight
end
suptitle('K-Means Clustering of Profiles');
Replicate 1, 21 iterations, total sum of distances = 23.4699.
Replicate 2, 22 iterations, total sum of distances = 23.5615.
Replicate 3, 10 iterations, total sum of distances = 24.823.
Replicate 4, 28 iterations, total sum of distances = 23.4501.
Replicate 5, 19 iterations, total sum of distances = 23.5109.
Best total sum of distances = 23.4501

Вместо того, чтобы строить все профили, можно построить только центроиды.

figure
for c = 1:16
    subplot(4,4,c);
    plot(times,ctrs(c,:)');
    axis tight
    axis off
end
suptitle('K-Means Clustering of Profiles');

Можно использовать функцию clustergram, чтобы создать карту тепла уровней экспрессии и древовидной схемы от вывода иерархической кластеризации.

clustergram(yeastvalues(:,2:end),'RowLabels',genes,'ColumnLabels',times(2:end))
Clustergram object with 614 rows of nodes and 6 columns of nodes.

Анализ главных компонентов

Анализ главных компонентов (PCA) является полезным методом, который может использоваться, чтобы уменьшать размерность больших наборов данных, таких как те от микромассивов. PCA может также использоваться, чтобы найти сигналы в шумных данных. Функциональный mapcaplot вычисляет основные компоненты набора данных, и создайте графики рассеивания результатов. Можно в интерактивном режиме выбрать точки данных из одного из графиков, и эти точки автоматически подсвечены в другом графике. Это позволяет вам визуализировать несколько размерностей одновременно.

mapcaplot(yeastvalues,genes)

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

Если вы хотите посмотреть на значения основных компонентов, функция pca в Statistics and Machine Learning Toolbox используется, чтобы вычислить основные компоненты набора данных.

[pc, zscores, pcvars] = pca(yeastvalues);

Первый вывод, pc, является матрицей основных компонентов данных yeastvalues. Первый столбец матрицы является первым основным компонентом, второй столбец является вторым основным компонентом и так далее. Второй вывод, zscores, состоит из очков основного компонента, т.е. представления yeastvalues на пробеле основного компонента. Третий вывод, pcvars, содержит отклонения основного компонента, которые дают меру того, сколько из отклонения данных составляется каждым из основных компонентов.

Ясно, что первый основной компонент составляет большинство отклонения в модели. Можно вычислить точный процент отклонения, составляемого каждым компонентом как показано ниже.

pcvars./sum(pcvars) * 100
ans =

   79.8316
    9.5858
    4.0781
    2.6486
    2.1723
    0.9747
    0.7089

Это означает, что почти 90% отклонения составляются первыми двумя основными компонентами. Можно использовать команду cumsum, чтобы видеть совокупную сумму отклонений.

cumsum(pcvars./sum(pcvars) * 100)
ans =

   79.8316
   89.4174
   93.4955
   96.1441
   98.3164
   99.2911
  100.0000

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

figure
scatter(zscores(:,1),zscores(:,2));
xlabel('First Principal Component');
ylabel('Second Principal Component');
title('Principal Component Scatter Plot');

Альтернативный способ создать график рассеивания с функциональным gscatter из Statistics and Machine Learning Toolbox. gscatter создает сгруппированный график рассеивания, где точки от каждой группы имеют различный цвет или маркер. Можно использовать clusterdata или любую другую функцию кластеризации, чтобы сгруппировать точки.

figure
pcclusters = clusterdata(zscores(:,1:2),'maxclust',8,'linkage','av');
gscatter(zscores(:,1),zscores(:,2),pcclusters)
xlabel('First Principal Component');
ylabel('Second Principal Component');
title('Principal Component Scatter Plot with Colored Clusters');

Самоорганизующиеся карты

Если у вас есть Deep Learning Toolbox™, можно использовать самоорганизующуюся карту (SOM), чтобы кластеризировать данные.

% Check to see if the Deep Learning Toolbox is installed
if ~exist(which('selforgmap'),'file')
    disp('The Self-Organizing Maps section of this example requires the Deep Learning Toolbox.')
    return
end

Функция selforgmap создает новый сетевой объект SOM. Этот пример сгенерирует SOM с помощью первых двух основных компонентов.

P = zscores(:,1:2)';
net = selforgmap([4 4]);

Обучите сеть с помощью параметров по умолчанию.

net = train(net,P);

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

figure
plot(P(1,:),P(2,:),'.g','markersize',20)
hold on
plotsom(net.iw{1,1},net.layers{1}.distances)
hold off

Можно присвоить кластеры с помощью SOM путем нахождения самого близкого узла к каждой точке в наборе данных.

distances = dist(P',net.IW{1}');
[d,cndx] = min(distances,[],2); % cndx contains the cluster index

figure
gscatter(P(1,:),P(2,:),cndx); legend off;
hold on
plotsom(net.iw{1,1},net.layers{1}.distances);
hold off

Ссылки

[1] DeRisi, J.L., Iyer, В.Р. и Браун, отделение связи, "Исследуя метаболическое и генетическое управление экспрессии гена в геномной шкале", Наука, 278 (5338):680-6, 1997.