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

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

Введение

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

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

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

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

В данном примере данные о клеточной линии Coriell обеспечиваются в файле MAT. Файл данных coriell_baccgh.mat содержит coriell_data, структура, содержащая нормированного среднего значения находящегося в log2 теста к ссылочным отношениям интенсивности 15 клеточных линий фибробласта и их геномных положений. Цели BAC упорядочены положением генома, начинающимся в 1 пункте и заканчивающимся в 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

Можно построить геном широкие находящиеся в 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 является trisomic для хромосом 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

Чтобы лучше визуализировать и позже подтвердить местоположения изменений номера копии, нам нужна cytoband информация. Считайте человеческие cytoband информации из hs_cytoBand.txt файл данных с помощью cytobandread функция. Это возвращает структуру человеческой cytoband информации [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

Обнаружение точек перехода

Производные сглаживавшего отношения по определенному порогу обычно указывают на существенные изменения с большим 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.

Тестирование значения точки перехода

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

Можно также отобразиться, CNAs клеточной линии GM05296 выравниваются к представлению сводных данных идеограммы хромосомы с помощью chromosomeplot функция. Определите геномные положения для CNAs на хромосомах 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] Редон, R., и др., "Глобальное изменение номера копии в геноме человека", Природа, 444 (7118):444-54, 2006.

[2] Pinkel, D., и др., "Анализ высокого разрешения ДНК копирует изменения номера с помощью сравнительной геномной гибридизации для микромассивов", Генетика Природы, 20 (2):207-11, 1998.

[3] Snijders, Утра, и др., "Блок микромассивов для измерения всего генома ДНК копирует номер", Генетика Природы, 29 (3):263-4, 2001.

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

[5] Майерс, C.L., и др., "Точное обнаружение анеуплоидий в массиве CGH и микроданные массива экспрессии гена", Биоинформатика, 20 (18):3533-43, 2004.