exponenta event banner

Обнаружение изменения номера копии ДНК в данных CGH на основе массива

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

Введение

Изменения или изменения числа копий - это форма генетической вариации в геноме человека [1]. Изменения числа копий ДНК (CNA) были связаны с развитием и прогрессированием рака и многих заболеваний.

Метод сравнительной геномной гибридизации (CGH) на основе микрочипов ДНК позволяет осуществлять одновременный мониторинг количества копий тысяч генов по всему геному [2,3]. В этом методе фрагменты ДНК или «клоны» из тестируемого образца и эталонного образца, дифференциально меченные красителями (обычно Cy3 и Cy5), гибридизуются с картированными микрочипами ДНК и изображаются. Изменения числа копий связаны с отношением интенсивности флуоресценции Cy3 и Cy5 мишеней, гибридизированных с каждым зондом на микрочипе. Клоны с нормализованной интенсивностью тестирования, значительно превышающей эталонную интенсивность, указывают увеличение числа копий в тестируемом образце в этих положениях. Аналогично, значительно меньшие интенсивности в тестируемом образце являются признаками потери числа копий. Матрицы CGH на основе клонов BAC (бактериальной искусственной хромосомы) имеют разрешение порядка одного миллиона пар оснований (1Mb) [3]. Олигонуклеотидные и кДНК массивы обеспечивают более высокое разрешение 50-100 кб [2].

Соотношения интенсивности на основе массива CGH log2 предоставляют полезную информацию об общегеномных CNA. У людей нормальное число копий ДНК составляет два для всех аутосом. В идеальной ситуации нормальные клоны соответствуют нулевому отношению log2. Отношения интенсивности log2 потери единичной копии будут равны -1, а коэффициент усиления единичной копии будет равен 0,58. Цель состоит в том, чтобы эффективно идентифицировать места получения или потери количества копий ДНК.

Данные в этом примере представляют собой данные CGH матрицы BAC клеточной линии Coriell, проанализированные Snijders et al. (2001). Данные клеточной линии Кориелла широко рассматриваются как набор данных «золотого стандарта». Вы можете загрузить эти данные нормализованных отношений интенсивности на основе log2 и дополнительную таблицу известных кариотипов из https://www.nature.com/articles/ng754#supplementary-information. Вы сравните эти цитогенно отображенные изменения с местоположениями прибылей или убытков, идентифицированными с различными функциями MATLAB и его панелей инструментов.

Для этого примера данные линии клеток Coriell представлены в файле MAT. Файл данных coriell_baccgh.mat содержит coriell_dataструктура, содержащая нормализованное среднее отношение теста на основе log2 к эталонным соотношениям интенсивности 15 клеточных линий фибробластов и их геномных положений. Мишени BAC упорядочены по положению генома, начиная с 1p и заканчивая Xq.

load coriell_baccgh
coriell_data
coriell_data = 

  struct with fields:

             Sample: {1x15 cell}
         Chromosome: [2285x1 int8]
    GenomicPosition: [2285x1 int32]
          Log2Ratio: [2285x15 double]
            FISHMap: {2285x1 cell}

Визуализация профиля генома массива CGH Data Set

Вы можете построить график отношений тест/эталонная интенсивность ДНК-клонов на основе генома в широком диапазоне log2. В этом примере отображаются отношения интенсивности log2 для клеточной линии GM03576 для хромосом, 1 через 23.

Найдите индекс образца для CM03576 клеточной линии.

sample = find(strcmpi(coriell_data.Sample, 'GM03576'))
sample =

     8

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

chr_nums = zeros(1, 23);
chr_data_len = zeros(1,23);
for c = 1:23
    tmp = coriell_data.Chromosome == c;
    chr_nums(c) = find(tmp, 1, 'last');
    chr_data_len(c) = length(find(tmp));
end

% Draw a vertical bar at the end of a chromosome to indicate the border
x_vbar = repmat(chr_nums, 3, 1);
y_vbar = repmat([2;-2;NaN], 1, 23);

% Label the autosomes with their chromosome numbers, and the sex chromosome
% with X.
x_label = chr_nums - ceil(chr_data_len/2);
y_label = zeros(1, length(x_label)) - 1.6;
chr_labels = num2str((1:1:23)');
chr_labels = cellstr(chr_labels);
chr_labels{end} = 'X';

figure
hold on
h_ratio = plot(coriell_data.Log2Ratio(:,sample), '.');
h_vbar = line(x_vbar, y_vbar, 'color', [0.8 0.8 0.8]);
h_text = text(x_label, y_label, chr_labels,...
             'fontsize', 8, 'HorizontalAlignment', 'center');

h_axis = h_ratio.Parent;
h_axis.XTick = [];
h_axis.YGrid = 'on';
h_axis.Box = 'on';
xlim([0 chr_nums(23)])
ylim([-1.5 1.5])

title(coriell_data.Sample{sample})
xlabel({'', 'Chromosome'})
ylabel('Log2(T/R)')
hold off

На графике границы между хромосомами обозначаются серыми вертикальными брусками. График показывает, что GM03576 клеточная линия является трисомной для хромосом 2 и 21 [3].

Также можно построить профиль каждой хромосомы в геноме. В этом примере показаны соотношения интенсивности log2 для каждой хромосомы в клеточной линии GM05296 по отдельности.

sample = find(strcmpi(coriell_data.Sample, 'GM05296'));
figure;
for c = 1:23
    idx = coriell_data.Chromosome == c;
    chr_y = coriell_data.Log2Ratio(idx, sample);
    subplot(5,5,c);

    hp = plot(chr_y, '.');
    line([0, chr_data_len(c)], [0,0], 'color', 'r');

    h_axis = hp.Parent;
    h_axis.XTick = [];
    h_axis.Box = 'on';
    xlim([0 chr_data_len(c)])
    ylim([-1.5 1.5])
    xlabel(['chr ' chr_labels{c}], 'FontSize', 8)
end
sgtitle('GM05296');

График показывает, что GM05296 клеточная линия имеет частичную трисомию в хромосоме 10 и частичную моносомию в хромосоме 11.

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

Данные CGH на основе массива могут быть довольно шумными. Следовательно, точная идентификация хромосомных областей с равным числом копий, которая учитывает шум в данных, требует надежных вычислительных методов. В остальном примере вы будете работать с данными хромосом 9, 10 и 11 линии GM05296 клеток.

Инициализируйте структурный массив для данных этих трех хромосом.

GM05296_Data = struct('Chromosome', {9 10 11},...
                      'GenomicPosition', {[], [], []},...
                      'Log2Ratio', {[], [], []},...
                      'SmoothedRatio', {[], [], []},...
                      'DiffRatio', {[], [], []},...
                      'SegIndex', {[], [], []});

Фильтрация и сглаживание данных

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

for iloop = 1:length(GM05296_Data)
    idx = coriell_data.Chromosome == GM05296_Data(iloop).Chromosome;
    chr_x = coriell_data.GenomicPosition(idx);
    chr_y = coriell_data.Log2Ratio(idx, sample);

    % Remove NaN data points
    idx = ~isnan(chr_y);
    GM05296_Data(iloop).GenomicPosition = double(chr_x(idx));
    GM05296_Data(iloop).Log2Ratio = chr_y(idx);

    % Smoother
    GM05296_Data(iloop).SmoothedRatio = ...
        mslowess(GM05296_Data(iloop).GenomicPosition,...
                 GM05296_Data(iloop).Log2Ratio,...
                 'SPAN',15);

    % Find the derivative of the smoothed ratio
    GM05296_Data(iloop).DiffRatio = ...
        diff([0; GM05296_Data(iloop).SmoothedRatio]);
end

Чтобы лучше визуализировать и позже проверять местоположения изменений числа копий, нам нужна информация о цитобанде. Прочитайте информацию о цитобанде человека из hs_cytoBand.txt файл данных с использованием cytobandread функция. Он возвращает структуру информации о цитобанде человека [4].

hs_cytobands = cytobandread('hs_cytoBand.txt')

% Find the centromere positions for the chromosomes.
acen_idx = strcmpi(hs_cytobands.GieStains, 'acen');
acen_ends = hs_cytobands.BandEndBPs(acen_idx);

% Convert the cytoband data from bp to kilo bp because the genomic
% positions in Coriell Cell Line data set are in kilo base pairs.
acen_pos = acen_ends(1:2:end)/1000;
hs_cytobands = 

  struct with fields:

     ChromLabels: {862x1 cell}
    BandStartBPs: [862x1 int32]
      BandEndBPs: [862x1 int32]
      BandLabels: {862x1 cell}
       GieStains: {862x1 cell}

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

for iloop = 1:length(GM05296_Data)
    chr = GM05296_Data(iloop).Chromosome;
    chr_x = GM05296_Data(iloop).GenomicPosition;
    figure
    hold on
    plot(chr_x, GM05296_Data(iloop).Log2Ratio, '.');
    line(chr_x, GM05296_Data(iloop).SmoothedRatio,...
                'Color', 'r', 'LineWidth', 2);
    line(chr_x, GM05296_Data(iloop).DiffRatio,...
                'Color', 'k', 'LineWidth', 2);
    line([acen_pos(chr), acen_pos(chr)], [-1, 1],...
                'Color', 'm', 'LineWidth', 2, 'LineStyle', '-.');
    if iloop == 1
        legend('Raw','Smoothed','Diff', 'Centromere');
    end
    ylim([-1, 1])
    xlabel('Genomic Position')
    ylabel('Log2(T/R)')
    title(sprintf('GM05296: Chromosome %d ', chr))
    hold off
end

Обнаружение точек изменения

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

thrd = 0.1;

for iloop = 1:length(GM05296_Data)
    idx = find(abs(GM05296_Data(iloop).DiffRatio) > thrd );
    N = numel(GM05296_Data(iloop).SmoothedRatio);
    GM05296_Data(iloop).SegIndex = [1;idx;N];

    % Number of possible segments found
    fprintf('%d segments initially found on Chromosome %d.\n',...
                 numel(GM05296_Data(iloop).SegIndex) - 1,...
                 GM05296_Data(iloop).Chromosome)
end
1 segments initially found on Chromosome 9.
4 segments initially found on Chromosome 10.
5 segments initially found on Chromosome 11.

Оптимизация точек изменения с помощью кластеризации GM

Кластеризация гауссовой смеси (GM) или ожидания-максимизации (EM) может обеспечить точную корректировку индексов точки изменения [5]. Сходимость к статистически оптимальным индексам точки изменения может быть облегчена окружением каждого индекса набором смежных индексов равной длины. Таким образом, каждое ребро связано с левым и правым распределением. Кластеризация ГМ изучает параметры максимального правдоподобия двух распределений. Затем он оптимально корректирует индексы с учетом полученных параметров.

Можно задать длину для набора смежных позиций, распределенных вокруг индексов точек изменения. В этом примере выбирается длина 5. Можно также проверить каждую точку изменения путем печати ее кластеров GM. В этом примере мы построим графики GM-кластеров для данных Chromosome 10.

len = 5;
for iloop = 1:length(GM05296_Data)
    seg_num = numel(GM05296_Data(iloop).SegIndex) - 1;
    if seg_num > 1
        % Plot the data points in chromosome 10 data
        if GM05296_Data(iloop).Chromosome == 10
            figure
            hold on;
            plot(GM05296_Data(iloop).GenomicPosition,...
                 GM05296_Data(iloop).Log2Ratio, '.')
            ylim([-0.5, 1])
            xlabel('Genomic Position')
            ylabel('Log2(T/R)')
            title(sprintf('Chromosome %d - GM05296', ...
                GM05296_Data(iloop).Chromosome))
        end

        segidx = GM05296_Data(iloop).SegIndex;
        segidx_emadj = GM05296_Data(iloop).SegIndex;

        for jloop = 2:seg_num
            ileft = min(segidx(jloop) - len, segidx(jloop));
            iright = max(segidx(jloop) + len, segidx(jloop));
            gmx = GM05296_Data(iloop).GenomicPosition(ileft:iright);
            gmy = GM05296_Data(iloop).SmoothedRatio(ileft:iright);

            % Select initial guess for the cluster index for each point.
            gmpart = (gmy > (min(gmy) + range(gmy)/2)) + 1;

            % Create a Gaussian mixture model object
            gm = gmdistribution.fit(gmy, 2, 'start', gmpart);
            gmid = cluster(gm,gmy);

            segidx_emadj(jloop) = find(abs(diff(gmid))==1) + ileft;

          % Plot GM clusters for the change-points in chromosome 10 data
            if GM05296_Data(iloop).Chromosome == 10
                plot(gmx(gmid==1),gmy(gmid==1), 'g.',...
                     gmx(gmid==2), gmy(gmid==2), 'r.')
            end
        end

        % Remove repeat indices
        zeroidx = [diff(segidx_emadj) == 0; 0];
        GM05296_Data(iloop).SegIndex = segidx_emadj(~zeroidx);
    end

    % Number of possible segments found
    fprintf('%d segments found on Chromosome %d after GM clustering adjustment.\n',...
                 numel(GM05296_Data(iloop).SegIndex) - 1,...
                 GM05296_Data(iloop).Chromosome)
end
hold off;
1 segments found on Chromosome 9 after GM clustering adjustment.
3 segments found on Chromosome 10 after GM clustering adjustment.
5 segments found on Chromosome 11 after GM clustering adjustment.

Проверка значимости точки изменения

После определения оптимальных индексов точки изменения необходимо также определить, представляет ли каждый сегмент статистически значимые изменения в количестве копий ДНК. Для оценки значимости определенных сегментов необходимо выполнить t-тесты перестановок. Сегмент включает все точки данных от одной точки изменения до следующей точки изменения или конца хромосомы. В этом примере выполняется 10000 перестановок точек данных на двух последовательных сегментах вдоль хромосомы на уровне значимости 0,01.

alpha = 0.01;
for iloop = 1:length(GM05296_Data)
    seg_num = numel(GM05296_Data(iloop).SegIndex) - 1;
    seg_index = GM05296_Data(iloop).SegIndex;
    if seg_num > 1
        ppvals = zeros(seg_num+1, 1);

        for sloop =  1:seg_num-1
            seg1idx = seg_index(sloop):seg_index(sloop+1)-1;

            if sloop== seg_num-1
                seg2idx = seg_index(sloop+1):(seg_index(sloop+2));
            else
                seg2idx = seg_index(sloop+1):(seg_index(sloop+2)-1);
            end

            seg1 = GM05296_Data(iloop).SmoothedRatio(seg1idx);
            seg2 = GM05296_Data(iloop).SmoothedRatio(seg2idx);

            n1 = numel(seg1);
            n2 = numel(seg2);
            N = n1+n2;
            segs = [seg1;seg2];

            % Compute observed t statistics
            t_obs = mean(seg1) - mean(seg2);

            % Permutation test
            iter = 10000;
            t_perm = zeros(iter,1);
            for i = 1:iter
                randseg = segs(randperm(N));
                t_perm(i) = abs(mean(randseg(1:n1))-mean(randseg(n1+1:N)));
            end
            ppvals(sloop+1) = sum(t_perm >= abs(t_obs))/iter;
        end

        sigidx = ppvals < alpha;
        GM05296_Data(iloop).SegIndex = seg_index(sigidx);
    end

    % Number segments after significance tests
    fprintf('%d segments found on Chromosome %d after significance tests.\n',...
       numel(GM05296_Data(iloop).SegIndex) - 1, GM05296_Data(iloop).Chromosome)
end
1 segments found on Chromosome 9 after significance tests.
3 segments found on Chromosome 10 after significance tests.
4 segments found on Chromosome 11 after significance tests.

Оценка изменений номера копии

Цитогенетическое исследование показывает, GM05296 клеточная линия имеет трисомию при 10q21-10q24 и моносомию при 11p12-11p13 [3]. Постройте график сегментных средств трех хромосом над исходными данными жирными красными линиями и добавьте идеограммы хромосом к графикам, используя chromosomeplot функция. Отметим, что геномные положения в наборе данных клеточной линии Кориелла находятся в парах килобазов. Поэтому при добавлении идеограмм к сюжету нужно будет конвертировать данные цитобанда из bp в kilo bp.

for iloop = 1:length(GM05296_Data)
    figure;
    seg_num = numel(GM05296_Data(iloop).SegIndex) - 1;
    seg_mean = ones(seg_num,1);
    chr_num = GM05296_Data(iloop).Chromosome;
    for jloop = 2:seg_num+1
        idx = GM05296_Data(iloop).SegIndex(jloop-1):GM05296_Data(iloop).SegIndex(jloop);
        seg_mean(idx) = mean(GM05296_Data(iloop).Log2Ratio(idx));
        line(GM05296_Data(iloop).GenomicPosition(idx), seg_mean(idx),...
            'color', 'r', 'linewidth', 3);
    end
    line(GM05296_Data(iloop).GenomicPosition, GM05296_Data(iloop).Log2Ratio,...
        'linestyle', 'none', 'Marker', '.');
    line([acen_pos(chr_num), acen_pos(chr_num)], [-1, 1],...
        'linewidth', 2,...
        'color', 'm',...
        'linestyle', '-.');

    ylabel('Log2(T/R)')
    ax = gca;
    ax.Box = 'on';
    ylim([-1, 1])
    title(sprintf('Chromosome %d - GM05296', chr_num));
    chromosomeplot(hs_cytobands, chr_num, 'addtoplot', gca,  'unit', 2)

end

Как показано на графиках, на хромосоме 9 не обнаружено изменений числа копий, имеется интервал усиления числа копий от 10q21 до 10q24 и область потери числа копий от 11p12 до 11p13. Обнаруженные CNA соответствуют известным результатам в GM05296 клеточной линии, определенных цитогенетическим анализом.

Вы также можете отобразить CNA линии GM05296 клеток, выровненных по сводному представлению идеограммы хромосом, с помощью chromosomeplot функция. Определить геномные положения CNA в хромосомах 10 и 11.

chr10_idx = GM05296_Data(2).SegIndex(2):GM05296_Data(2).SegIndex(3)-1;
chr10_cna_start = GM05296_Data(2).GenomicPosition(chr10_idx(1))*1000;
chr10_cna_end   = GM05296_Data(2).GenomicPosition(chr10_idx(end))*1000;

chr11_idx = GM05296_Data(3).SegIndex(2):GM05296_Data(3).SegIndex(3)-1;
chr11_cna_start = GM05296_Data(3).GenomicPosition(chr11_idx(1))*1000;
chr11_cna_end = GM05296_Data(3).GenomicPosition(chr11_idx(end))*1000;

Создайте структуру, содержащую данные изменения номера копии из данных линии ячейки GM05296 в соответствии с требованиями ввода chromosomeplot функция.

cna_struct = struct('Chromosome', [10 11],...
                     'CNVType', [2 1],...
                     'Start', [chr10_cna_start, chr11_cna_start],...
                     'End',   [chr10_cna_end, chr11_cna_end])
cna_struct = 

  struct with fields:

    Chromosome: [10 11]
       CNVType: [2 1]
         Start: [69209000 34420000]
           End: [105905000 35914000]

chromosomeplot(hs_cytobands, 'cnv', cna_struct, 'unit', 2)
title('Human Karyogram with Copy Number Alterations of GM05296')

В этом примере показано, как MATLAB и его панели инструментов предоставляют инструменты для анализа и визуализации изменений числа копий в данных CGH на основе массива.

Ссылки

Redon, R., et al., «Глобальная вариация числа копий в геноме человека», Nature, 444 (7118): 444-54, 2006.

Pinkel, D., et al., «Анализ вариаций числа копий ДНК с высоким разрешением с использованием сравнительной геномной гибридизации с микрочипами», Nature Genetics, 20 (2): 207-11, 1998.

Snijders, A.M., et al., «Сборка микрочипов для измерения числа копий ДНК по всему геному», Nature Genetics, 29 (3): 263-4, 2001.

[4] Геном человека NCBI Build 36.

[5] Myers, C.L., et al., «Точное обнаружение анеуплоидий в массиве CGH и данных микрочипов экспрессии генов», Bioinformatics, 20 (18): 3533-43, 2004.