Генное онтологическое обогащение в данных микромассивов

Этот пример показывает, как обогатить данные экспрессии генов микромассивов, используя отношения Gene Ontology.

Введение

Генная онтология является контролируемым методом для описания терминов, связанных с генами в любом организме. Поскольку больше данных генов получают от организмов, это аннотируется с помощью Gene Ontology. Генная онтология состоит из трех небольших онтологий или аспектов: молекулярной функции, биологического процесса и клеточного компонента. Каждая из этих онтологий содержит термины, которые организованы в ориентированном ациклическом графике с этими тремя терминами в качестве корней. Корни являются самыми широкими терминами, относящимися к генам. Термины дальше от корней становятся более конкретными. В этом примере вы будете использовать данные микромассивов из примера Gene Expression Profile Analysis, чтобы посмотреть на значимость интересных генов и терминов Gene Ontology, которые связаны с зондами микромассивов. Более конкретно, вы дополнительно исследуете, чтобы определить, участвует ли набор генов, которые объединяются вместе, в общей молекулярной функции.

Примеры, использующие функции генной онтологии

База данных Gene Ontology загружается в объект MATLAB ® с помощью Bioinformatics Toolbox geneont функция.

GO = geneont('live',true); % this step takes a while
get(GO)
                 default_namespace: 'gene_ontology'
                    format_version: '1.2'
                      data_version: 'releases/2020-07-16'
                           version: ''
                              date: ''
                          saved_by: ''
                 auto_generated_by: ''
                         subsetdef: {17×1 cell}
                            import: ''
                    synonymtypedef: 'systematic_synonym "Systematic synonym" EXACT'
                           idspace: ''
    default_relationship_id_prefix: ''
                        id_mapping: ''
                            remark: 'Includes Ontology(OntologyID(OntologyIRI(<http://purl.obolibrary.org/obo/go/never_in_taxon.owl>))) [Axioms: 18 Logical Axioms: 0]'
                           typeref: ''
                  unrecognized_tag: {'ontology'  'go'}
                             Terms: [47203×1 geneont.term]

Каждый термин Gene Ontology имеет номер присоединения, который является семизначным числом, предшествующим префиксу 'GO:'. Чтобы взглянуть на определенный термин, сначала создайте субонтологию путем индексирования объекта, а затем проверьте свойство 'terms'. Хеш-таблица реализована в объекте GO для эффективного поиска идентификаторов терминов.

GO(5840).terms % the ribosome Gene Ontology term
            id: 5840
          name: 'ribosome'
      ontology: 'cellular component'
    definition: '"An intracellular organelle, about 200 A in diameter, consisting of RNA and protein. It is the site of protein biosynthesis resulting from translation of messenger RNA (mRNA). It consists of two subunits, one large and one small, each containing only protein and RNA. Both the ribosome and its subunits are characterized by their sedimentation coefficients, expressed in Svedberg units (symbol: S). Hence, the prokaryotic ribosome (70S) comprises a large (50S) subunit and a small (30S) subunit, while the eukaryotic ribosome (80S) comprises a large (60S) subunit and a small (40S) subunit. Two sites on the ribosomal large subunit are involved in translation, namely the aminoacyl site (A site) and peptidyl site (P site). Ribosomes from prokaryotes, eukaryotes, mitochondria, and chloroplasts have characteristically distinct ribosomal proteins." [ISBN:0198506732]'
       comment: ''
       synonym: {4×2 cell}
          is_a: 43232
       part_of: [0×1 double]
      obsolete: 0

Этот термин представляет 'рибосому', и у него есть поля для is_a и part_of. Эти поля представляют отношения между терминами Gene Ontology. Термины Gene Ontology можно рассматривать как узлы в ациклическом графике. Можно обойти такие отношения с помощью методов getancestors, getdescendants, getrelatives, и getmatrix. Для примера, getancestors метод возвращает любой менее специфический термин, чем 'ribosome' (т.е. его родительские элементы в графике).

ancestors = getancestors(GO,5840)
riboanc = GO(ancestors)
ancestors =

        5575
        5622
        5840
       43226
       43228
       43229
       43232
      110165

Gene Ontology object with 8 Terms.

Чтобы визуализировать эти отношения, используйте biograph функции и getmatrix метод из набора Bioinformatics Toolbox. The getmatrix метод возвращает квадратную матрицу отношений данного объекта Gene Ontology. Этот график иногда называют 'индуцированным' графиком.

cm = getmatrix(riboanc);
BG = biograph(cm,get(riboanc.Terms,'name'))
view(BG)
Biograph object with 8 nodes and 9 edges.

Использование кластеризации для выбора интересного подмножества генов

Чтобы показать, как информация о генной онтологии полезна, вы посмотрите на данные микромассивов из примера анализа профиля экспрессии генов. Эти данные содержат 6400 генов на микромассивы, которые участвуют во многих различных аспектах экспрессии генов дрожжей. Небольшой фрагмент из них может показать интересное поведение для этого микромассива эксперимента. Вы будете использовать Gene Ontology, чтобы лучше понять, связаны ли эти гены в камере и как они связаны. Полные данные о дрожжах можно найти на веб-сайте NCBI.

load yeastdata
whos yeastvalues genes
  Name                Size             Bytes  Class     Attributes

  genes            6400x1             755322  cell                
  yeastvalues      6400x7             358400  double              

Пример «Анализ профиля экспрессии генов» показывает несколько способов кластеризации данных эксперимента. В этом примере K-средних значений кластеризацию используют для выбора группы из примерно 240 генов для исследования.

Во-первых, данные нуждаются в очистке. Есть несколько пустых пятен на чипе, и некоторые гены имеют отсутствующие значения. В этом примере пустые пятна удаляются из набора данных и knnimpute функция вводит отсутствующие значения (отмеченные NaNs).

% Remove data for empty spots
emptySpots = strcmp('EMPTY',genes);
yeastvalues = yeastvalues(~emptySpots,:);
genes = genes(~emptySpots);
fprintf('Number of genes after removing empty spots is %d.\n',numel(genes))

% Impute missing values
yeastvalues = knnimpute(yeastvalues);
Number of genes after removing empty spots is 6314.

Далее - функция genelowvalfilter удаляет гены с низкой общей экспрессией. В этом примере для фильтрации генов используется довольно большое значение. Пример анализа профиля экспрессии генов показывает альтернативные методы фильтрации.

mask = genelowvalfilter(yeastvalues,genes,'absval',log2(3.5));
highexpIdx = find(mask);
yeastvalueshighexp = yeastvalues(highexpIdx,:);
fprintf('Number of genes with high expression is %d.\n',numel(highexpIdx))
Number of genes with high expression is 613.

The kmeans функция из Statistics and Machine Learning Toolbox™ группирует данные в четыре кластера, используя корреляцию в качестве метрики расстояния.

rng default

[cidx, ctrs] = kmeans(yeastvalueshighexp, 4, 'dist','corr', 'rep',20);
for c = 1:4
    subplot(2,2,c);
    plot(times,yeastvalueshighexp((cidx == c),:)');
    axis tight
end
sgtitle('K-Means Clustering of Profiles');

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

figure
for c = 1:4
    subplot(2,2,c);
    plot(times,ctrs(c,:)','linewidth',4,'color','k');
    axis tight
    axis off    % turn off the axis
end
sgtitle('Centroids of K-Means Clustering of Profiles');

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

clusterIdx = highexpIdx(cidx==1);
fprintf('Number of genes in the first cluster is %d.\n',numel(clusterIdx))
Number of genes in the first cluster is 140.

Получение аннотированных генов из базы данных генома Saccharomyces

Многие проекты генома взаимодействуют с консорциумом Gene Ontology при аннотировании генов. Аннотации генов для нескольких организмов можно найти на сайте Gene Ontology. В сложении аннотации для отдельных организмов можно найти на их соответствующих веб-сайтах (таких как база данных генома дрожжей). Эти аннотации часто обновляются и обычно кураторятся представителями группы генома для каждого организма. NCBI также имеет сводный список аннотаций генов, которые относятся к их базе данных Entrez Gene. Эти файлы аннотаций состоят из больших списков генов и связанных с ними терминов Gene Ontology. Эти файлы соответствуют структуре, заданной консорциумом Gene Ontology. Функция goannotread проанализирует эти несжатые файлы и поместит информацию в структуру MATLAB. Файл yeastgenes.sgd был получен из сайта аннотации генной онтологии.

Для этого анализа вы рассмотрим гены, которые аннотируются как молекулярная функция (то есть, поле 'Aspect' установлено на 'F'). Однако можно расширить этот анализ, чтобы увидеть, участвуют ли кластеризованные гены в общих процессах ('P') или находятся вместе в том же клеточном отсеке ('C'). Поля, которые представляют интерес, являются символом гена и связанным с ним ID. В файлах аннотации GO они имеют имена полей DB_Object_Symbol и GOid, соответственно. Создайте карту для эффективного поиска Gene Symbol. Заметьте, что не каждый ген из генов 6314 в микромассиве аннотирован. Обратите внимание, что данные в общедоступных хранилищах часто кураторятся и обновляются; поэтому результаты этого примера могут несколько отличаться при использовании современных наборов данных. Также возможно, что вы получаете предупреждения о недопустимых или устаревших идентификаторах из-за устаревшего yeastgenes.sgd файл аннотации генов.

SGDann = goannotread('yeastgenes.sgd','Aspect','F',...
                     'Fields',{'DB_Object_Symbol','GOid'});

SGDmap = containers.Map();
for i = 1:numel(SGDann)
    key = SGDann(i).DB_Object_Symbol;
    if isKey(SGDmap,key)
        SGDmap(key) = [SGDmap(key) SGDann(i).GOid];
    else
        SGDmap(key) = SGDann(i).GOid;
    end
end

fprintf('Number of annotated genes related to molecular function is %d.\n',SGDmap.Count)
fprintf('Number of unique GO terms associated to annotated genes is %d.\n',numel(unique([SGDann.GOid])))
fprintf('Number of gene-GO term associations is %d.\n',numel(SGDann))
Number of annotated genes related to molecular function is 6428.
Number of unique GO terms associated to annotated genes is 2017.
Number of gene-GO term associations is 31352.

Подсчет аннотированных генов из микромассива

Для каждого термина в генной онтологии вы подсчитываете следующие два элементов:

  1. Количество генов, которые аннотированы к термину.

  2. Количество недостаточно или сверхэкспрессированных генов, которые аннотируются к термину.

Основываясь на этой информации, вы можете статистически определить, как часто условия Gene Ontology чрезмерно или недостаточно представлены в эксперименте с микромассивами.

Существуют некоторые случаи, когда наборы генов не точно аннотируются. Поэтому вы создаете эти талисманы путем распространения на соседние условия. По определению, более специфические термины Gene Ontology включены в предковые термины. Таким образом, если ген аннотирован к конкретному термину, вы также можете захотеть увеличить количество для некоторых или всех его предковых терминов. Использование getrelatives, getdescendants, или getancestors для тестирования различных схем распространения. В этом примере вы используете getrelatives получить предков и потомков каждого термина до 1 уровня, который является по умолчанию, в основном, чтобы преодолеть неточно аннотированный набор генов.

m = GO.Terms(end).id;           % gets the last term id
geneschipcount = zeros(m,1);    % a vector of GO term counts for the entire chip.
genesclustercount = zeros(m,1); % a vector of GO term counts for interesting genes.
for i = 1:numel(genes)
    if isKey(SGDmap,genes{i})
        goid = getrelatives(GO,SGDmap(genes{i}));
        % update vector counts
        geneschipcount(goid) = geneschipcount(goid) + 1;
        if (any(i == clusterIdx))
           genesclustercount(goid) = genesclustercount(goid) + 1;
        end
    end
end
Warning: Invalid or obsolete IDs: 15238  15238  15238
Check that the annotation file is up to date. 
Warning: Invalid or obsolete IDs: 36459
Check that the annotation file is up to date. 
Warning: Invalid or obsolete IDs: 44212
Check that the annotation file is up to date. 
Warning: Invalid or obsolete IDs: 1077
Check that the annotation file is up to date. 
Warning: Invalid or obsolete IDs: 1077
Check that the annotation file is up to date. 
Warning: Invalid or obsolete IDs: 982
Check that the annotation file is up to date. 
Warning: Invalid or obsolete IDs: 4004
Check that the annotation file is up to date. 
Warning: Invalid or obsolete IDs: 982
Check that the annotation file is up to date. 

Глядя на вероятность аннотации генной онтологии

Наиболее значимые аннотированные условия можно найти, посмотрев на вероятности того, что условия подсчитаны случайно. Используйте гипергеометрическую функцию распределения вероятностей (hygepdf), который вычисляет статистическую значимость извлечения определенного количества успехов из общего числа получений из населения. Вычисленное p-значение является вероятностью получения такой тестовой статистики, которая является подсчетом tally интересных генов в этом примере. Эта функция возвращает p-значение, сопоставленное с каждым членом, и можно создать список наиболее значимых членов GO, упорядочив p-значения.

pvalues = hygepdf(genesclustercount,max(geneschipcount),...
                  max(genesclustercount),geneschipcount);
[dummy,idx] = sort(pvalues);

% create a report
report = sprintf('GO Term      p-val  counts  definition\n');
for i = 1:10
    term = idx(i);
    report = sprintf('%s%s\t%-1.4f\t%-d / %-d\t%s...\n', report, ...
                    char(num2goid(term)), pvalues(term),...
                    genesclustercount(term),geneschipcount(term),...
                    GO(term).Term.definition(2:min(end,60)));
end
disp(report);
GO Term      p-val  counts  definition
GO:0000104	0.0141	1 / 1	Catalysis of the reaction: succinate + acceptor = fumarate ...
GO:0003995	0.0141	1 / 1	Catalysis of the reaction: acyl-CoA + acceptor = 2,3-dehydr...
GO:0008177	0.0141	1 / 1	Catalysis of the reaction: succinate + ubiquinone = fumarat...
GO:0009046	0.0141	1 / 1	Catalysis of the cleavage of the D-alanyl-D-alanine bond in...
GO:0009917	0.0141	1 / 1	Catalysis of the removal of a C-5 double bond in the B ring...
GO:0009918	0.0141	1 / 1	Catalysis of the reaction: 5-dehydroepisterol = 24-methylen...
GO:0016166	0.0141	1 / 1	Catalysis of the dehydrogenation of phytoene to produce a c...
GO:0016628	0.0141	1 / 1	Catalysis of an oxidation-reduction (redox) reaction in whi...
GO:0016632	0.0141	1 / 1	Catalysis of an oxidation-reduction (redox) reaction in whi...
GO:0016634	0.0141	1 / 1	Catalysis of an oxidation-reduction (redox) reaction in whi...

Последующий анализ наиболее значимых терминов

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

Сначала посмотрите на предков верхнего элемента в списке.

topItem = idx(1);
GO(topItem).terms % the most significant gene
topItemAncestors = getancestors(GO,topItem)
            id: 104
          name: 'succinate dehydrogenase activity'
      ontology: 'molecular function'
    definition: '"Catalysis of the reaction: succinate + acceptor = fumarate + reduced acceptor." [GOC:kd]'
       comment: ''
       synonym: {11×2 cell}
          is_a: 16627
       part_of: [0×1 double]
      obsolete: 0


topItemAncestors =

         104
        3674
        3824
       16491
       16627

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

secondItem = idx(2);
GO(secondItem).terms % the second most significant gene
secondItemAncestors = getancestors(GO,secondItem)
            id: 3995
          name: 'acyl-CoA dehydrogenase activity'
      ontology: 'molecular function'
    definition: '"Catalysis of the reaction: acyl-CoA + acceptor = 2,3-dehydroacyl-CoA + reduced acceptor." [EC:1.3.99.3]'
       comment: ''
       synonym: {14×2 cell}
          is_a: 16627
       part_of: [0×1 double]
      obsolete: 0


secondItemAncestors =

        3674
        3824
        3995
       16491
       16627

Теперь можно создать подонтологию, которая включает предков десяти (для примера) наиболее значимых терминов и визуализировать это с помощью biograph функция.

subGO = GO(getancestors(GO,idx(1:10)))
[cm,acc,rels] = getmatrix(subGO);
BG = biograph(cm,get(subGO.Terms,'name'))
Gene Ontology object with 23 Terms.
Biograph object with 23 nodes and 26 edges.

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

for i = 1:numel(acc)
    pval = pvalues(acc(i));
    color = [(1-pval).^(10),pval.^(1/10),0.3];
    BG.Nodes(i).Color = color;
    BG.Nodes(i).Label = num2str(acc(i)); % add info to datatips
end

view(BG);

Ссылки

[1] http://www.geneontology.org/

[2] http://www.yeastgenome.org/

[3] Джентльмен, Р. 'Basic GO Usage'. Биокондукторная виньетка 16 мая 2005 http://bioconductor.org/docs/vignettes.html

[4] Джентльмен, Р. 'Использование GO для статистического анализа'. Биокондукторная виньетка 16 мая 2005 http://bioconductor.org/docs/vignettes.html