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

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

Введение

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

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

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

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

В данном примере данные линии камер Кориелла предоставляются в файле MAT. Файл данных coriell_baccgh.mat содержит coriell_data, структуру, содержащую нормированное среднее значение основанного на логарифмике теста для ссылки на коэффициенты интенсивности 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 массива

Можно построить график коэффициентов интенсивности теста/эталона ДНК клонов на основе genome wide 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}

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

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

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

Производные сглаженного отношения на определенном пороге обычно указывают на существенные изменения с большим peaks и обеспечивают оценку индексов точек изменения. В данном примере будет выбран порог 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]. Сходимость к статистически оптимальным индексам точек изменения может быть облегчена путем окружения каждого индекса набором соседних индексов с равной длиной. Таким образом, каждое ребро связано с распределениями влево и вправо. Кластеризация GM учит параметры максимальной вероятности двух распределений. Затем он оптимально корректирует индексы, учитывая выученные параметры.

Можно задать длину для набора смежных позиций, распределенных вокруг индексов точек изменения. В данном примере будет выбрана длина 5. Можно также просмотреть каждую точку изменения путем построения графика ее кластеров GM. В этом примере вы постройте график кластеров GM для данных Хромосомы 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.

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

Если вы определяете оптимальные индексы точек изменения, вам также нужно определить, представляет ли каждый сегмент статистически значимые изменения в количестве копий ДНК. Вы выполните сочетания, чтобы оценить значимость идентифицированных сегментов. Сегмент включает все точки данных от одной точки изменения до следующей точки изменения или конца хромосомы. В этом примере вы выполните 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 функция. Обратите внимание, что геномные положения в наборе данных линии камеры Coriell указаны в килограммах основы парах. Поэтому при добавлении идеограмм к графику вам нужно будет преобразовать данные цитобэнда из 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 на основе массивов.

Ссылки

[1] Redon, R. et al., «Global изменения in copy number in the human genome», Nature, 444 (7118): 444-54, 2006.

[2] Pinkel, D., et al., «High разрешения analysis of ДНК copy number изменений with comparative genomic hybridization to микромассивов», Nature Genetics, 20 (2): 207-11, 1998.

[3] Snijders, A.M., et al., «Assembly of микромассивов for genome-wide измерения of ДНК copy number», Nature Genetics, 29 (3): 263-4, 2001.

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

[5] Myers, C.L., et al., «Accurate detection of aneuploidies in массива CGH and gene expression микромассива данных», Bioinformatics, 20 (18): 3533-43, 2004.