Исследование различий в профилях метилирования ДНК во всем геноме

Этот пример показывает, как выполнить общий для генома анализ метилирования ДНК у человека с помощью секвенирования генома.

Примечание.Для повышения эффективности MathWorks рекомендует запускать этот пример на 64-разрядной платформе, поскольку объем памяти близок к 2 ГБ. На 32-разрядной платформе, если вы получаете "Out of memory" ошибки при запуске этого примера, попробуйте увеличить виртуальную память (или поменять пространство) вашей операционной системы или попробуйте задать 3GB switch (только 32-разрядная версия Windows ® XP). Эти методы описаны в этом документе.

Введение

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

В этом примере вы исследуете профили метилирования ДНК двух раковых камер человека: родительских клеток HCT116 камер рака толстой кишки и DICERex5 камер. DICERex5 камер получают из HCT116 камер после усечения DICER1 аллелей. Serre et al. в [1] предложен для изучения профилей метилирования ДНК с использованием MBD2 белка в качестве метил CpG-связывающего области и затем использовано высокопроизводительное секвенирование (HTseq). Этот метод обычно известен как MBD-Seq. Краткие чтения для двух повторений двух выборок были отправлены в архив SRA NCBI авторами [1]. Существуют и другие технологии для изучения статуса метилирования ДНК сайтов CpG в сочетании с HTseq, например MeDIP-seq или использования рестрикционных ферментов. Можно также анализировать наборы данных этого типа, следуя подходу, представленному в этом примере.

Наборы данных

Можно получить несопоставленные одноконцевые чтения для четырех экспериментов по секвенированию из NCBI. Короткие показания были получены с использованием анализатора II генома Illumina ®. Средний размер вставки составляет 120 п.о., а длина коротких показаний составляет 36 п.о.

Этот пример принимает, что вы:

(1) загрузил файлы SRR030222.sra, SRR030223.sra, SRR030224.sra и SRR030225.sra содержащий несопоставленные короткие чтения для двух повторений из DICERex5 выборки и двух повторений из HCT116 выборки соответственно, из NCBI SRA Run Selector и преобразовал их в FASTQ-форматированные файлы с помощью NCBI SRA Toolkit.

(2) произвели файлы с форматированием SAM путем сопоставления коротких показаний с эталонным геномом человека (NCBI Build 37.5) с помощью алгоритма Bowtie [2]. Сообщаются только уникально сопоставленные чтения.

(3) сжал форматированные файлы SAM в BAM и упорядочил их сначала по ссылочному наименованию, затем по геномному положению с помощью SAMtools [3].

Этот пример также предполагает, что вы загрузили эталонный геном человека (GRCh37.p5). Можно использовать bowtie-inspect команда, чтобы восстановить человеческую ссылку непосредственно из индексов боути. Или вы можете загрузить ссылку из репозитория NCBI, исключив следующую линию:

% getgenbank('NC_000009','FileFormat','fasta','tofile','hsch9.fasta');

Создание интерфейса MATLAB ® к файлам с форматированием BAM

Чтобы исследовать охват сигнала HCT116 выборок необходимо создать BioMap. BioMap имеет интерфейс, который обеспечивает прямой доступ к отображенным коротким чтениям, хранящимся в файле в формате BAM, таким образом минимизируя объем данных, который фактически загружается в память. Используйте функцию baminfo для получения списка существующих ссылок и фактического количества коротких чтений, сопоставленных с каждым.

info = baminfo('SRR030224.bam','ScanDictionary',true);
fprintf('%-35s%s\n','Reference','Number of Reads');
for i = 1:numel(info.ScannedDictionary)
    fprintf('%-35s%d\n',info.ScannedDictionary{i},...
        info.ScannedDictionaryCount(i));
end
Reference                          Number of Reads
gi|224589800|ref|NC_000001.10|     205065
gi|224589811|ref|NC_000002.11|     187019
gi|224589815|ref|NC_000003.11|     73986
gi|224589816|ref|NC_000004.11|     84033
gi|224589817|ref|NC_000005.9|      96898
gi|224589818|ref|NC_000006.11|     87990
gi|224589819|ref|NC_000007.13|     120816
gi|224589820|ref|NC_000008.10|     111229
gi|224589821|ref|NC_000009.11|     106189
gi|224589801|ref|NC_000010.10|     112279
gi|224589802|ref|NC_000011.9|      104466
gi|224589803|ref|NC_000012.11|     87091
gi|224589804|ref|NC_000013.10|     53638
gi|224589805|ref|NC_000014.8|      64049
gi|224589806|ref|NC_000015.9|      60183
gi|224589807|ref|NC_000016.9|      146868
gi|224589808|ref|NC_000017.10|     195893
gi|224589809|ref|NC_000018.9|      60344
gi|224589810|ref|NC_000019.9|      166420
gi|224589812|ref|NC_000020.10|     148950
gi|224589813|ref|NC_000021.8|      310048
gi|224589814|ref|NC_000022.10|     76037
gi|224589822|ref|NC_000023.10|     32421
gi|224589823|ref|NC_000024.9|      18870
gi|17981852|ref|NC_001807.4|       1015
Unmapped                           6805842

В этом примере вы сосредоточитесь на анализе хромосомы 9. Создайте BioMap для этих двух HCT116 выборка повторяется.

bm_hct116_1 = BioMap('SRR030224.bam','SelectRef','gi|224589821|ref|NC_000009.11|')
bm_hct116_2 = BioMap('SRR030225.bam','SelectRef','gi|224589821|ref|NC_000009.11|')
bm_hct116_1 = 

  BioMap with properties:

    SequenceDictionary: 'gi|224589821|ref|NC_000009.11|'
             Reference: [106189x1 File indexed property]
             Signature: [106189x1 File indexed property]
                 Start: [106189x1 File indexed property]
        MappingQuality: [106189x1 File indexed property]
                  Flag: [106189x1 File indexed property]
          MatePosition: [106189x1 File indexed property]
               Quality: [106189x1 File indexed property]
              Sequence: [106189x1 File indexed property]
                Header: [106189x1 File indexed property]
                 NSeqs: 106189
                  Name: ''



bm_hct116_2 = 

  BioMap with properties:

    SequenceDictionary: 'gi|224589821|ref|NC_000009.11|'
             Reference: [107586x1 File indexed property]
             Signature: [107586x1 File indexed property]
                 Start: [107586x1 File indexed property]
        MappingQuality: [107586x1 File indexed property]
                  Flag: [107586x1 File indexed property]
          MatePosition: [107586x1 File indexed property]
               Quality: [107586x1 File indexed property]
              Sequence: [107586x1 File indexed property]
                Header: [107586x1 File indexed property]
                 NSeqs: 107586
                  Name: ''


Использование алгоритма раскладывания, предоставленного getBaseCoverage метод, можно построить график покрытия обоих повторений для начальной проверки. Для ссылки можно также добавить идеограмму для хромосомы 9 человека к графику с помощью chromosomeplot функция.

figure
ha = gca;
hold on
n = 141213431;               % length of chromosome 9
[cov,bin] = getBaseCoverage(bm_hct116_1,1,n,'binWidth',100);
h1 = plot(bin,cov,'b');      % plots the binned coverage of bm_hct116_1
[cov,bin] = getBaseCoverage(bm_hct116_2,1,n,'binWidth',100);
h2 = plot(bin,cov,'g');      % plots the binned coverage of bm_hct116_2
chromosomeplot('hs_cytoBand.txt', 9, 'AddToPlot', ha) % plots an ideogram along the x-axis
axis(ha,[1 n 0 100])         % zooms-in the y-axis
fixGenomicPositionLabels(ha) % formats tick labels and adds datacursors
legend([h1 h2],'HCT116-1','HCT116-2','Location','NorthEast')
ylabel('Coverage')
title('Coverage for two replicates of the HCT116 sample')
fig = gcf;
fig.Position = max(fig.Position,[0 0 900 0]); % resize window

Поскольку короткие чтения представляют метилированные области ДНК, существует корреляция между выровненным покрытием и метилированием ДНК. Наблюдают повышенное метилирование ДНК, близкое к хромосомным теломерам; известно, что существует связь между метилированием ДНК и ролью теломер для поддержания целостности хромосом. На графике покрытия вы также можете увидеть длинную щель над центромером хромосомы. Это связано с повторяющимися последовательностями, присутствующими в центромере, которые мешают нам выравнивать короткие чтения в уникальное положение в этой области. В наборах данных, используемых в этом примере, только около 30% коротких показаний были однозначно сопоставлены с геномом ссылки.

Корреляция островов CpG и метилирования ДНК

Метилирование ДНК обычно происходит в динуклеотидах CpG. Изменение шаблонов метилирования ДНК может привести к транскрипционному молчанию, особенно на островах промотора генов CpG. Но также известно, что метилирование ДНК может блокировать связывание CTCF и может замолчать транскрипцию miRNA среди других соответствующих функций. В целом ожидается, что отображенные показания должны предпочтительно совпадать с богатыми CpG областями.

Загрузите хромосому 9 человека из файла ссылки hs37.fasta. В данном примере принято, что вы восстановили ссылку из индексов Боути, используя bowtie-inspect команда; поэтому hs37.fasta содержит все хромосомы человека. Чтобы загрузить только хромосому 9, можно использовать пару опция nave-value BLOCKREAD с fastaread функция.

chr9 = fastaread('hs37.fasta','blockread',9);
chr9.Header
ans =

    'gi|224589821|ref|NC_000009.11| Homo sapiens chromosome 9, GRCh37 primary reference assembly'

Используйте cpgisland функция для поиска кластеров CpG. Используя стандартное определение для островов CpG [4], 200 или более островов bp с 60% или более соотношением CpGobserved/CpGexpected, приводит к 1682 островам GpG, обнаруженным в хромосоме 9.

cpgi = cpgisland(chr9.Sequence)
cpgi = 

  struct with fields:

    Starts: [1x1682 double]
     Stops: [1x1682 double]

Используйте getCounts метод для вычисления отношения выровненных основ, находящихся внутри островов CpG. Для первого повторения HCT116 выборки отношение близко к 45%.

aligned_bases_in_CpG_islands = getCounts(bm_hct116_1,cpgi.Starts,cpgi.Stops,'method','sum')
aligned_bases_total = getCounts(bm_hct116_1,1,n,'method','sum')
ratio = aligned_bases_in_CpG_islands ./ aligned_bases_total
aligned_bases_in_CpG_islands =

     1724363


aligned_bases_total =

     3822804


ratio =

    0.4511

Можно исследовать графики покрытия высокого разрешения двух выборок, и наблюдать, как сигнал коррелирует с островами CpG. Для примера исследуйте область между 23 820 000 и 23 830 000 bp. Это область 5 'генов человека, ELAVL2.

r1 = 23820001; % set the region limits
r2 = 23830000;
fhELAVL2 = figure; % keep the figure handle to use it later
hold on
% plot high-resolution coverage of bm_hct116_1
h1 = plot(r1:r2,getBaseCoverage(bm_hct116_1,r1,r2,'binWidth',1),'b');
% plot high-resolution coverage of bm_hct116_2
h2 = plot(r1:r2,getBaseCoverage(bm_hct116_2,r1,r2,'binWidth',1),'g');

% mark the CpG islands within the [r1 r2] region
for i = 1:numel(cpgi.Starts)
    if cpgi.Starts(i)>r1 && cpgi.Stops(i)<r2 % is CpG island inside [r1 r2]?
        px = [cpgi.Starts([i i]) cpgi.Stops([i i])]; % x-coordinates for patch
        py = [0 max(ylim) max(ylim) 0];              % y-coordinates for patch
        hp = patch(px,py,'r','FaceAlpha',.1,'EdgeColor','r','Tag','cpgi');
    end
end

axis([r1 r2 0 20])            % zooms-in the y-axis
fixGenomicPositionLabels(gca) % formats tick labels and adds datacursors
legend([h1 h2 hp],'HCT116-1','HCT116-2','CpG Islands')
ylabel('Coverage')
xlabel('Chromosome 9 position')
title('Coverage for two replicates of the HCT116 sample')

Статистическое моделирование счетчиков Данных

Чтобы найти области, которые содержат больше отображенных показаний, чем ожидалось бы случайно, можно следовать аналогичному подходу, описанному Serre et al. [1]. Количество отсчётов для неперекрывающихся смежных окон 100 bp статистически смоделировано.

Во-первых, используйте getCounts метод для подсчета количества сопоставленных чтений, которые начинаются в каждом окне. В этом примере вы используете подход раскладывания, который рассматривает только начальное положение каждого отображенного чтения, следуя подходу Serre et al. Однако вы также можете использовать OVERLAP и METHOD Пары "имя-значение" в getCounts для вычисления более точной статистики. Например, чтобы получить максимальное покрытие для каждого окна с учетом разрешения базовой пары, установите OVERLAP по 1 и METHOD на MAX.

n = numel(chr9.Sequence); % length of chromosome
w = 1:100:n; % windows of 100 bp

counts_1 = getCounts(bm_hct116_1,w,w+99,'independent',true,'overlap','start');
counts_2 = getCounts(bm_hct116_2,w,w+99,'independent',true,'overlap','start');

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

nbp = nbinfit(counts_1);

Постройте график подобранной модели по гистограмме эмпирических данных.

figure
hold on
emphist = histc(counts_1,0:100); % calculate the empirical distribution
bar(0:100,emphist./sum(emphist),'c','grouped') % plot histogram
plot(0:100,nbinpdf(0:100,nbp(1),nbp(2)),'b','linewidth',2); % plot fitted model
axis([0 50 0 .001])
legend('Empirical Distribution','Negative Binomial Fit')
ylabel('Frequency')
xlabel('Counts')
title('Frequency of counts, 100bp windows (HCT116-1)')

Плохой подбор кривой указывает, что наблюдаемое распределение может быть связано со смесью двух моделей, одной, которая представляет фон, и одной, которая представляет данные подсчета в метилированных окнах ДНК.

Более реалистичным сценарием было бы предположение, что окна с небольшим количеством сопоставленных чтений являются главным образом фоном (или нулевой моделью). Serre et al. предположил, что 100-bp окна, содержащие четыре или более чтений, вряд ли будут сгенерированы случайно. Чтобы оценить хорошее приближение к нулевой модели, можно подогнать левое тело эмпирического распределения к усеченному отрицательному биномиальному распределению. Для соответствия усеченному распределению используйте mle функция. Сначала вам нужно задать анонимную функцию, которая задает правую усеченную версию nbinpdf.

rtnbinpdf = @(x,p1,p2,t) nbinpdf(x,p1,p2) ./ nbincdf(t-1,p1,p2);

Определите функцию аппроксимации с помощью другой анонимной функции.

rtnbinfit = @(x2,t) mle(x2,'pdf',@(x3,p1,p2) rtnbinpdf(x3,p1,p2,t),'start',nbinfit(x2),'lower',[0 0]);

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

nbp = [0.5 0.2];              % Known coefficients
x = nbinrnd(nbp(1),nbp(2),10000,1); % Random sample
trun = 6;                     % Set a truncation threshold

nbphat1 = nbinfit(x);         % Fit non-truncated model to all data
nbphat2 = nbinfit(x(x<trun)); % Fit non-truncated model to truncated data (wrong)
nbphat3 = rtnbinfit(x(x<trun),trun); % Fit truncated model to truncated data

figure
hold on
emphist = histc(x,0:100);     % Calculate the empirical distribution
bar(0:100,emphist./sum(emphist),'c','grouped') % plot histogram
h1 = plot(0:100,nbinpdf(0:100,nbphat1(1),nbphat1(2)),'b-o','linewidth',2);
h2 = plot(0:100,nbinpdf(0:100,nbphat2(1),nbphat2(2)),'r','linewidth',2);
h3 = plot(0:100,nbinpdf(0:100,nbphat3(1),nbphat3(2)),'g','linewidth',2);
axis([0 25 0 .2])
legend([h1 h2 h3],'Neg-binomial fitted to all data',...
    'Neg-binomial fitted to truncated data',...
    'Truncated neg-binomial fitted to truncated data')
ylabel('Frequency')
xlabel('Counts')

Идентификация значительных метилированных областей

Для двух повторений выборки HCT116 подбирайте правое усеченное отрицательное биномиальное распределение к наблюдаемой нулевой модели с помощью rtnbinfit анонимная функция, ранее заданная.

trun = 4;  % Set a truncation threshold (as in [1])
pn1 = rtnbinfit(counts_1(counts_1<trun),trun); % Fit to HCT116-1 counts
pn2 = rtnbinfit(counts_2(counts_2<trun),trun); % Fit to HCT116-2 counts

Вычислите значение p для каждого окна в нулевом распределении.

pval1 = 1 - nbincdf(counts_1,pn1(1),pn1(2));
pval2 = 1 - nbincdf(counts_2,pn2(1),pn2(2));

Вычислите скорость ложного обнаружения с помощью mafdr функция. Используйте пару "имя-значение" BHFDR использование процедуры линейного шага вверх (LSU) ([6]) для вычисления скорректированных p-значений FDR. Установка FDR < 0,01 позволяет вам идентифицировать окна с 100 б.п., которые значительно метилированы.

fdr1 = mafdr(pval1,'bhfdr',true);
fdr2 = mafdr(pval2,'bhfdr',true);

w1 = fdr1<.01; % logical vector indicating significant windows in HCT116-1
w2 = fdr2<.01; % logical vector indicating significant windows in HCT116-2
w12 = w1 & w2; % logical vector indicating significant windows in both replicates

Number_of_sig_windows_HCT116_1 = sum(w1)
Number_of_sig_windows_HCT116_2 = sum(w2)
Number_of_sig_windows_HCT116 = sum(w12)
Number_of_sig_windows_HCT116_1 =

        1662


Number_of_sig_windows_HCT116_2 =

        1674


Number_of_sig_windows_HCT116 =

        1346

В целом, вы идентифицировали 1662 и 1674 неперекрывающихся 100-bp окон в двух репликатах выборок HCT116, что указывает на наличие значительных доказательств метилирования ДНК. Существует 1346 окон, которые значительны в обоих репликатах.

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

figure(fhELAVL2) % bring back to focus the previously plotted figure
plot(w(w1)+50,counts_1(w1),'bs', 'HandleVisibility','off') % plot significant windows in HCT116-1
plot(w(w2)+50,counts_2(w2),'gs', 'HandleVisibility','off') % plot significant windows in HCT116-2
axis([r1 r2 0 100])
title('Significant 100-bp windows in both replicates of the HCT116 sample')

Нахождение генов со значительными метилированными областями

Метилирование ДНК участвует в модуляции экспрессии генов. Например, хорошо известно, что гиперметилирование связано с инактивацией нескольких генов-супрессоров опухолей. Вы можете изучить в этом наборе данных метилирование областей промотора генов.

Во-первых, загрузите из Ensembl вкладки таблицу с разделенными значениями (TSV) со всеми генами, кодирующими белок, в текстовый файл, ensemblmart_genes_hum37.txt. В данном примере мы используем Ensembl release 64. Используя сервис Ensembl BioMart, можно выбрать таблицу со следующими атрибутами: имя хромосомы, биотип гена, имя гена, начало/конец гена и направление цепи.

Используйте предоставленную функцию helper ensemblmart2gff для преобразования загруженного TSV-файла в GFF-форматированный файл. Затем используйте GFFAnnotation загрузить файл в MATLAB и создать подмножество с генами, присутствующими только в хромосоме 9. Это приводит к 800 аннотированным генам, кодирующим белок, в базе данных Ensembl.

GFFfilename = ensemblmart2gff('ensemblmart_genes_hum37.txt');
a = GFFAnnotation(GFFfilename)
a9 = getSubset(a,'reference','9')
numGenes = a9.NumEntries
a = 

  GFFAnnotation with properties:

    FieldNames: {1x9 cell}
    NumEntries: 21184


a9 = 

  GFFAnnotation with properties:

    FieldNames: {1x9 cell}
    NumEntries: 800


numGenes =

   800

Найдите области промотора для каждого гена. В этом примере мы рассматриваем проксимальный промотор как область -500/100 в восходящем направлении.

downstream = 500;
upstream   = 100;

geneDir = strcmp(a9.Strand,'+');  % logical vector indicating strands in the forward direction

% calculate promoter's start position for genes in the forward direction
promoterStart(geneDir) = a9.Start(geneDir) - downstream;
% calculate promoter's end position for genes in the forward direction
promoterStop(geneDir) = a9.Start(geneDir) + upstream;
% calculate promoter's start position for genes in the reverse direction
promoterStart(~geneDir) = a9.Stop(~geneDir) - upstream;
% calculate promoter's end position for genes in the reverse direction
promoterStop(~geneDir) = a9.Stop(~geneDir) + downstream;

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

promoters = dataset({a9.Feature,'Gene'});
promoters.Strand = char(a9.Strand);
promoters.Start = promoterStart';
promoters.Stop = promoterStop';

Найдите гены со значительным метилированием ДНК в промоторной области, посмотрев на количество отображенных коротких показаний, которые перекрывают, по крайней мере, одну пару оснований в определенной промоторной области.

promoters.Counts_1 = getCounts(bm_hct116_1,promoters.Start,promoters.Stop,...
    'overlap',1,'independent',true);
promoters.Counts_2 = getCounts(bm_hct116_2,promoters.Start,promoters.Stop,...
    'overlap',1,'independent',true);

Подгонка нулевого распределения для каждой выборки репликации и вычисление p-значений:

trun = 5;  % Set a truncation threshold
pn1 = rtnbinfit(promoters.Counts_1(promoters.Counts_1<trun),trun); % Fit to HCT116-1 promoter counts
pn2 = rtnbinfit(promoters.Counts_2(promoters.Counts_2<trun),trun); % Fit to HCT116-2 promoter counts
promoters.pval_1 = 1 - nbincdf(promoters.Counts_1,pn1(1),pn1(2)); % p-value for every promoter in HCT116-1
promoters.pval_2 = 1 - nbincdf(promoters.Counts_2,pn2(1),pn2(2)); % p-value for every promoter in HCT116-2

Number_of_sig_promoters =  sum(promoters.pval_1<.01 & promoters.pval_2<.01)

Ratio_of_sig_methylated_promoters = Number_of_sig_promoters./numGenes
Number_of_sig_promoters =

    74


Ratio_of_sig_methylated_promoters =

    0.0925

Заметим, что только 74 (из 800) гена в хромосоме 9 имеют значительно метилированные области ДНК (pval < 0,01 в обоих репликатах). Отобразите отчет о 30 генах с наиболее значимыми метилированными промоторными областями.

[~,order] = sort(promoters.pval_1.*promoters.pval_2);
promoters(order(1:30),[1 2 3 4 5 7 6 8])
ans = 

    Gene                   Strand    Start        Stop         Counts_1
    {'DMRT3'      }        +            976464       977064    223     
    {'CNTFR'      }        -          34590021     34590621    219     
    {'GABBR2'     }        -         101471379    101471979    404     
    {'CACNA1B'    }        +         140771741    140772341    454     
    {'BARX1'      }        -          96717554     96718154    264     
    {'FAM78A'     }        -         134151834    134152434    497     
    {'FOXB2'      }        +          79634071     79634671    163     
    {'TLE4'       }        +          82186188     82186788    157     
    {'ASTN2'      }        -         120177248    120177848    141     
    {'FOXE1'      }        +         100615036    100615636    149     
    {'MPDZ'       }        -          13279489     13280089    129     
    {'PTPRD'      }        -          10612623     10613223    145     
    {'PALM2-AKAP2'}        +         112542089    112542689    134     
    {'FAM69B'     }        +         139606522    139607122    112     
    {'WNK2'       }        +          95946698     95947298    108     
    {'IGFBPL1'    }        -          38424344     38424944    110     
    {'AKAP2'      }        +         112542269    112542869    107     
    {'C9orf4'     }        -         111929471    111930071    102     
    {'COL5A1'     }        +         137533120    137533720     84     
    {'LHX3'       }        -         139096855    139097455     74     
    {'OLFM1'      }        +         137966768    137967368     75     
    {'NPR2'       }        +          35791651     35792251     68     
    {'DBC1'       }        -         122131645    122132245     61     
    {'SOHLH1'     }        -         138591274    138591874     56     
    {'PIP5K1B'    }        +          71320075     71320675     59     
    {'PRDM12'     }        +         133539481    133540081     53     
    {'ELAVL2'     }        -          23826235     23826835     50     
    {'ZFP37'      }        -         115818939    115819539     59     
    {'RP11-35N6.1'}        +         103790491    103791091     60     
    {'DMRT2'      }        +           1049854      1050454     54     


    pval_1        Counts_2    pval_2    
    6.6613e-16    253         5.5511e-16
    6.6613e-16    226         5.5511e-16
    6.6613e-16    400         5.5511e-16
    6.6613e-16    408         5.5511e-16
    6.6613e-16    286         5.5511e-16
    6.6613e-16    499         5.5511e-16
       1.4e-13    165         6.0352e-13
    3.5649e-13    151         4.7347e-12
    4.3566e-12    163         8.0969e-13
    1.2447e-12    133         6.7598e-11
    2.8679e-11    148         7.3682e-12
    2.3279e-12    127         1.6448e-10
    1.3068e-11    135         5.0276e-11
    4.1911e-10    144         1.3295e-11
     7.897e-10    125         2.2131e-10
    5.7523e-10    114         1.1364e-09
    9.2538e-10    106         3.7513e-09
    2.0467e-09     96         1.6795e-08
    3.6266e-08     97         1.4452e-08
    1.8171e-07     91         3.5644e-08
    1.5457e-07     69         1.0074e-06
    4.8093e-07     73         5.4629e-07
    1.5082e-06     62         2.9575e-06
    3.4322e-06     67         1.3692e-06
    2.0943e-06     63         2.5345e-06
    5.6364e-06     61         3.4518e-06
    9.2778e-06     62         2.9575e-06
    2.0943e-06     47         3.0746e-05
    1.7771e-06     42         6.8037e-05
    4.7762e-06     46         3.6016e-05

Нахождение межгенных областей, которые значительно метилированы

Serre et al. [1] сообщили, что в этих наборах данных приблизительно 90% уникально отображенных показаний выпадают за пределы 5 'областей промотора генов. Используя подобный подход, как и прежде, можно найти гены, которые имеют межгенные метилированные области. Чтобы компенсировать различные длины генов, можно использовать максимальное покрытие, вычисленное по основаниям, вместо необработанного количества отображенных коротких показаний. Другой альтернативный подход к нормализации счетчиков по длине генов - установить METHOD Пара "имя-значение" с rpkm в getCounts функция.

intergenic = dataset({a9.Feature,'Gene'});
intergenic.Strand = char(a9.Strand);
intergenic.Start = a9.Start;
intergenic.Stop = a9.Stop;

intergenic.Counts_1 = getCounts(bm_hct116_1,intergenic.Start,intergenic.Stop,...
    'overlap','full','method','max','independent',true);
intergenic.Counts_2 = getCounts(bm_hct116_2,intergenic.Start,intergenic.Stop,...
    'overlap','full','method','max','independent',true);
trun = 10; % Set a truncation threshold
pn1 = rtnbinfit(intergenic.Counts_1(intergenic.Counts_1<trun),trun); % Fit to HCT116-1 intergenic counts
pn2 = rtnbinfit(intergenic.Counts_2(intergenic.Counts_2<trun),trun); % Fit to HCT116-2 intergenic counts
intergenic.pval_1 = 1 - nbincdf(intergenic.Counts_1,pn1(1),pn1(2)); % p-value for every intergenic region in HCT116-1
intergenic.pval_2 = 1 - nbincdf(intergenic.Counts_2,pn2(1),pn2(2)); % p-value for every intergenic region in HCT116-2

Number_of_sig_genes =  sum(intergenic.pval_1<.01 & intergenic.pval_2<.01)

Ratio_of_sig_methylated_genes = Number_of_sig_genes./numGenes

[~,order] = sort(intergenic.pval_1.*intergenic.pval_2);

intergenic(order(1:30),[1 2 3 4 5 7 6 8])
Number_of_sig_genes =

    62


Ratio_of_sig_methylated_genes =

    0.0775


ans = 

    Gene                  Strand    Start        Stop         Counts_1
    {'AL772363.1'}        -         140762377    140787022    106     
    {'CACNA1B'   }        +         140772241    141019076    106     
    {'SUSD1'     }        -         114803065    114937688     88     
    {'C9orf172'  }        +         139738867    139741797     99     
    {'NR5A1'     }        -         127243516    127269709     86     
    {'BARX1'     }        -          96713628     96717654     77     
    {'KCNT1'     }        +         138594031    138684992     58     
    {'GABBR2'    }        -         101050391    101471479     65     
    {'FOXB2'     }        +          79634571     79635869     51     
    {'NDOR1'     }        +         140100119    140113813     54     
    {'KIAA1045'  }        +          34957484     34984679     50     
    {'ADAMTSL2'  }        +         136397286    136440641     55     
    {'PAX5'      }        -          36833272     37034476     48     
    {'OLFM1'     }        +         137967268    138013025     55     
    {'PBX3'      }        +         128508551    128729656     45     
    {'FOXE1'     }        +         100615536    100618986     49     
    {'MPDZ'      }        -          13105703     13279589     51     
    {'ASTN2'     }        -         119187504    120177348     43     
    {'ARRDC1'    }        +         140500106    140509812     49     
    {'IGFBPL1'   }        -          38408991     38424444     45     
    {'LHX3'      }        -         139088096    139096955     44     
    {'PAPPA'     }        +         118916083    119164601     44     
    {'CNTFR'     }        -          34551430     34590121     41     
    {'DMRT3'     }        +            976964       991731     40     
    {'TUSC1'     }        -          25676396     25678856     46     
    {'ELAVL2'    }        -          23690102     23826335     35     
    {'SMARCA2'   }        +           2015342      2193624     36     
    {'GAS1'      }        -          89559279     89562104     34     
    {'GRIN1'     }        +         140032842    140063207     36     
    {'TLE4'      }        +          82186688     82341658     36     


    pval_1        Counts_2    pval_2    
    8.6597e-15     98         1.8763e-14
    8.6597e-15     98         1.8763e-14
    2.2904e-12    112         7.7716e-16
    7.4718e-14     96         3.5749e-14
     4.268e-12     90         2.5457e-13
    7.0112e-11     62          2.569e-09
    2.5424e-08     73         6.9019e-11
    2.9078e-09     58         9.5469e-09
    2.2131e-07     58         9.5469e-09
    8.7601e-08     55         2.5525e-08
    3.0134e-07     55         2.5525e-08
    6.4307e-08     45         6.7163e-07
     5.585e-07     49         1.8188e-07
    6.4307e-08     42         1.7861e-06
    1.4079e-06     51         9.4566e-08
    4.1027e-07     46         4.8461e-07
    2.2131e-07     42         1.7861e-06
    2.6058e-06     43         1.2894e-06
    4.1027e-07     36         1.2564e-05
    1.4079e-06     39         4.7417e-06
    1.9155e-06     36         1.2564e-05
    1.9155e-06     35         1.7377e-05
    4.8199e-06     37         9.0815e-06
    6.5537e-06     37         9.0815e-06
    1.0346e-06     31         6.3417e-05
    3.0371e-05     41         2.4736e-06
    2.2358e-05     40         3.4251e-06
    4.1245e-05     41         2.4736e-06
    2.2358e-05     38         6.5629e-06
    2.2358e-05     37         9.0815e-06

Например, исследуйте профиль метилирования гена BARX1, шестого значимого гена с межгенным метилированием в предыдущем списке. Форматированный файл GTF ensemblmart_barx1.gtf содержит структурную информацию для этого гена, полученную от Ensembl с помощью сервиса BioMart.

Использование GTFAnnotation для загрузки структурной информации в MATLAB. Существует два аннотированных транскрипта для этого гена.

barx1 = GTFAnnotation('ensemblmart_barx1.gtf')
transcripts = getTranscriptNames(barx1)
barx1 = 

  GTFAnnotation with properties:

    FieldNames: {1x11 cell}
    NumEntries: 18


transcripts =

  2x1 cell array

    {'ENST00000253968'}
    {'ENST00000401724'}

Постройте график метилирования ДНК для обеих выборок HCT116 с разрешением пары оснований. Наложите острова CpG и постройте графики экзонов для каждого из двух транскриптов вдоль дна графика.

range = barx1.getRange;
r1 = range(1)-1000; % set the region limits
r2 = range(2)+1000;
figure
hold on
% plot high-resolution coverage of bm_hct116_1
h1 = plot(r1:r2,getBaseCoverage(bm_hct116_1,r1,r2,'binWidth',1),'b');
% plot high-resolution coverage of bm_hct116_2
h2 = plot(r1:r2,getBaseCoverage(bm_hct116_2,r1,r2,'binWidth',1),'g');

% mark the CpG islands within the [r1 r2] region
for i = 1:numel(cpgi.Starts)
    if cpgi.Starts(i)>r1 && cpgi.Stops(i)<r2 % is CpG island inside [r1 r2]?
        px = [cpgi.Starts([i i]) cpgi.Stops([i i])];  % x-coordinates for patch
        py = [0 max(ylim) max(ylim) 0];               % y-coordinates for patch
        hp = patch(px,py,'r','FaceAlpha',.1,'EdgeColor','r','Tag','cpgi');
    end
end

% mark the exons at the bottom of the axes
for i = 1:numel(transcripts)
    exons = getSubset(barx1,'Transcript',transcripts{i},'Feature','exon');
    for j = 1:exons.NumEntries
        px = [exons.Start([j j]);exons.Stop([j j])]'; % x-coordinates for patch
        py = [0 1 1 0]-i*2-1;                         % y-coordinates for patch
        hq = patch(px,py,'b','FaceAlpha',.1,'EdgeColor','b','Tag','exon');
    end
end

axis([r1 r2 -numel(transcripts)*2-2 80])  % zooms-in the y-axis
fixGenomicPositionLabels(gca) % formats tick labels and adds datacursors
ylabel('Coverage')
xlabel('Chromosome 9 position')
title('High resolution coverage in the BARX1 gene')
legend([h1 h2 hp hq],'HCT116-1','HCT116-2','CpG Islands','Exons','Location','NorthWest')

Наблюдайте высоко метилированную область в области промотора 5 '(самый правый остров CpG). Напомним, что для этого гена транскрипция происходит в обратной цепи. Более интересно наблюдать высоко метилированные области, которые перекрывают инициацию каждого из двух аннотированных транскриптов (два средних острова CpG).

Дифференциальный анализ шаблонов метилирования

В исследовании Serre et al. анализируют также другую клеточную линию. Новые камеры (DICERex5) получают из тех же HCT116 камер рака толстой кишки после усечения DICER1 аллелей. В литературе [5] сообщалось, что происходит локализованное изменение метилирования ДНК у небольшого числа генных промоторов. В этом примере вы найдете значительные 100-bp окна в двух выборочных репликатах DICERex5 клеток, следуя тому же подходу, что и родительские HCT116 клетки, и затем вы будете искать статистически значимые различия между двумя клеточными линиями.

Функция помощника getWindowCounts захватывает аналогичные шаги для поиска окон со значительным покрытием, как и прежде. getWindowCounts возвращает векторы с счетчиками, p-значениями и частотой ложных открытий для каждой новой репликации.

bm_dicer_1 = BioMap('SRR030222.bam','SelectRef','gi|224589821|ref|NC_000009.11|');
bm_dicer_2 = BioMap('SRR030223.bam','SelectRef','gi|224589821|ref|NC_000009.11|');
[counts_3,pval3,fdr3] = getWindowCounts(bm_dicer_1,4,w,100);
[counts_4,pval4,fdr4] = getWindowCounts(bm_dicer_2,4,w,100);
w3 = fdr3<.01; % logical vector indicating significant windows in DICERex5_1
w4 = fdr4<.01; % logical vector indicating significant windows in DICERex5-2
w34 = w3 & w4; % logical vector indicating significant windows in both replicates
Number_of_sig_windows_DICERex5_1 = sum(w3)
Number_of_sig_windows_DICERex5_2 = sum(w4)
Number_of_sig_windows_DICERex5 = sum(w34)
Number_of_sig_windows_DICERex5_1 =

   908


Number_of_sig_windows_DICERex5_2 =

        1041


Number_of_sig_windows_DICERex5 =

   759

Для выполнения дифференциального анализа используются окна 100-bp, которые значительны по крайней мере в одной из выборок (HCT116 или DICERex5).

wd = w34 | w12; % logical vector indicating windows included in the diff. analysis

counts = [counts_1(wd) counts_2(wd) counts_3(wd) counts_4(wd)];
ws = w(wd); % window start for each row in counts

Используйте функцию manorm для нормализации данных. The PERCENTILE Пара "имя-значение" позволяет вам отфильтровать окна с очень большим количеством отсчётов при нормализации, поскольку эти окна в основном вызваны программными продуктами, такими как повторяющиеся области в ссылку хромосоме.

counts_norm = round(manorm(counts,'percentile',90).*100);

Используйте функцию mattest для выполнения t-теста с двумя образцами для идентификации дифференциально покрытых окон из двух различных клеточных линий.

pval = mattest(counts_norm(:,[1 2]),counts_norm(:,[3 4]),'bootstrap',true,...
    'showhist',true,'showplot',true);

Составьте отчет с 25 наиболее значимыми дифференциально покрытыми окнами. При создании отчета используйте функцию helper findClosestGene определить, является ли окно межгенным, внутригенным или находится ли оно в проксимальной промоторной области.

[~,ord] = sort(pval);
fprintf('Window Pos       Type                  p-value   HCT116     DICERex5\n\n');
for i = 1:25
    j = ord(i);
    [~,msg] = findClosestGene(a9,[ws(j) ws(j)+99]);
    fprintf('%10d  %-25s %7.6f%5d%5d %5d%5d\n',  ...
        ws(j),msg,pval(j),counts_norm(j,:));
end
Window Pos       Type                  p-value   HCT116     DICERex5

 140311701  Intergenic (EXD3)         0.000026   13   13   104  105
 139546501  Intragenic                0.001827   21   21    91   93
     10901  Intragenic                0.002671  258  257   434  428
 120176801  Intergenic (ASTN2)        0.002733  266  270   155  155
 139914801  Intergenic (ABCA2)        0.002980   64   63    26   25
 126128501  Intergenic (CRB2)         0.003193   94   93   129  130
  71939501  Prox. Promoter (FAM189A2) 0.005549  107  101     0    0
 124461001  Intergenic (DAB2IP)       0.005618   77   76    39   37
 140086501  Intergenic (TPRN)         0.006520   47   42   123  124
  79637201  Intragenic                0.007512   52   51    32   31
 136470801  Intragenic                0.007512   52   51    32   31
 140918001  Intergenic (CACNA1B)      0.008115  176  169    71   68
 100615901  Intergenic (FOXE1)        0.008346  262  253   123  118
  98221901  Intergenic (PTCH1)        0.009934   26   30   104   99
 138730601  Intergenic (CAMSAP1)      0.010273   26   21    97   93
  89561701  Intergenic (GAS1)         0.010336   77   76     6   12
    977401  Intergenic (DMRT3)        0.010369  236  245   129  124
  37002601  Intergenic (PAX5)         0.010559  133  127   207  211
 139744401  Intergenic (PHPT1)        0.010869   47   46    32   31
 126771301  Intragenic                0.011458   43   46    97   93
  93922501  Intragenic                0.011486   34   34   149  161
  94187101  Intragenic                0.011507   73   80     6    6
 136044401  Intragenic                0.011567   39   34   110  105
 139611201  Intergenic (FAM69B)       0.011567   39   34   110  105
 139716201  Intergenic (C9orf86)      0.011832   73   72   136  130

Постройте график профиля метилирования ДНК для промоторной области генной FAM189A2, наиболее значительной дифференциально покрытой области промотора по сравнению с предыдущим списком. Наложите острова CpG и ген FAM189A2.

range = getRange(getSubset(a9,'Feature','FAM189A2'));
r1 = range(1)-1000;
r2 = range(2)+1000;
figure
hold on

% plot high-resolution coverage of all replicates
h1 = plot(r1:r2,getBaseCoverage(bm_hct116_1,r1,r2,'binWidth',1),'b');
h2 = plot(r1:r2,getBaseCoverage(bm_hct116_2,r1,r2,'binWidth',1),'g');
h3 = plot(r1:r2,getBaseCoverage(bm_dicer_1,r1,r2,'binWidth',1),'r');
h4 = plot(r1:r2,getBaseCoverage(bm_dicer_2,r1,r2,'binWidth',1),'m');

% mark the CpG islands within the [r1 r2] region
for i = 1:numel(cpgi.Starts)
    if cpgi.Starts(i)>r1 && cpgi.Stops(i)<r2 % is CpG island inside [r1 r2]?
        px = [cpgi.Starts([i i]) cpgi.Stops([i i])]; % x-coordinates for patch
        py = [0 max(ylim) max(ylim) 0];              % y-coordinates for patch
        hp = patch(px,py,'r','FaceAlpha',.1,'EdgeColor','r','Tag','cpgi');
    end
end

% mark the gene at the bottom of the axes
px = range([1 1 2 2]);
py = [0 1 1 0]-2;
hq = patch(px,py,'b','FaceAlpha',.1,'EdgeColor','b','Tag','gene');

axis([r1 r1+4000 -4 30]) % zooms-in
fixGenomicPositionLabels(gca) % formats tick labels and adds datacursors
ylabel('Coverage')
xlabel('Chromosome 9 position')
title('DNA Methylation profiles along the promoter region of the FAM189A2 gene')
legend([h1 h2 h3 h4 hp hq],...
    'HCT116-1','HCT116-2','DICERex5-1','DICERex5-2','CpG Islands','FAM189A2 Gene',...
    'Location','NorthEast')

Заметьте, что острова CpG явно неметилированы для обоих DICERex5 повторяются.

Ссылки

[1] Serre, D., Lee, B.H., and Ting A.H. «, MBD-выделенное секвенирование генома обеспечивает высокопроизводительное и комплексное исследование метилирования ДНК в геноме человека» Nucleic Acids Research 38 (2): 391-9, 2010.

[2] Langmead, B., Trapnell, C., Pop, M. and Salzberg, S.L., «Ultrafast and Memory-effective Выравнивания of Short ДНК Sequences to the Human Genome», Genome Biology, 10 (3): R25, 2009.

[3] Li, H., et al., «The Sequence Alignment/map (SAM) Формата и SAMtools», Bioinformatics, 25 (16): 2078-9, 2009.

[4] Gardiner-Garden, M. and Frommer, M «., острова CpG в геномах позвоночных», Journal of Molecular Biology, 196 (2): 261-82, 1987.

[5] Ting, A.H., et al., «A Requirement for DICER to Maintain Full Promoter CpG Island Hypermethilation in Human Cancer Камер», Cancer Research, 68 (8): 2570-5, 2008.

[6] Benjamini, Y. and Hochberg, Y., «Controlling the false discovery rate: a practical and english approach to multiple проверки», Journal of the Royal Statistical Society, 57 (1): 289-300, 1995.