Этот пример показывает, как выполнить общий для генома анализ метилирования ДНК у человека с помощью секвенирования генома.
Примечание.Для повышения эффективности 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');
Чтобы исследовать охват сигнала 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. Но также известно, что метилирование ДНК может блокировать связывание 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.