Белок-белковые взаимодействия (PPI) играют центральную роль в управлении клеточными процессами и поддержании хрупкого баланса в биологических системах. Способность предсказывать ИПП имеет далеко идущие последствия для понимания биологических путей, выявления потенциальных мишеней для лекарств и раскрытия молекулярных основ различных заболеваний. Один из ключей к предсказанию PPI заключается в извлечении значимых признаков из белковых последовательностей. В этой статье блога мы познакомим вас с процессом извлечения признаков для прогнозирования PPI, сосредоточив внимание на наиболее информативных признаках и методах, используемых для их получения.

Шаг 1: Получите последовательности белков

Первым шагом в извлечении признаков для предсказания PPI является получение последовательностей белков для пар белков, которые вы хотите проанализировать. Эти последовательности можно найти в общедоступных базах данных, таких как UniProt или база данных белков NCBI. Получив последовательности, сохраните их в подходящем формате, таком как FASTA, для дальнейшей обработки.

Шаг 2: Рассчитайте аминокислотный состав

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

Шаг 3: Рассчитайте состав дипептидов

Состав дипептида учитывает частоту последовательных пар аминокислот в последовательности белка. Чтобы рассчитать состав дипептидов, подсчитайте количество вхождений каждого возможного дипептида (всего 400, так как имеется 20 аминокислот) и разделите на общее количество дипептидов в последовательности. Это дает 400-мерный вектор признаков.

Шаг 4: Создание оценочных матриц для конкретной позиции (PSSM)

PSSM предоставляют информацию о сохранении аминокислот в определенных положениях в семействе белков. Чтобы сгенерировать PSSM, выполните следующие шаги:

  1. Получите множественное выравнивание последовательностей (MSA) гомологичных белковых последовательностей. Для создания MSA можно использовать такие инструменты, как Clustal Omega, MUSCLE или T-Coffee.
  2. Рассчитайте частоты аминокислот для каждой позиции в MSA.
  3. Вычислите фоновые частоты аминокислот по всему MSA.
  4. Рассчитайте баллы PSSM, взяв логарифмическое отношение частот, характерных для местоположения, к фоновым частотам, а также принимая во внимание псевдосчета, чтобы избежать проблем с нулевой частотой.

Шаг 5: вычислить автокорреляционные функции

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

  1. Присвойте числовое значение каждой аминокислоте в последовательности на основе выбранного физико-химического свойства.
  2. Рассчитайте значение автокорреляции для определенного лага (расстояние между сравниваемыми аминокислотами). Это включает в себя вычисление корреляции между значениями свойств аминокислот, разделенных запаздыванием.
  3. Повторите этот процесс для разных задержек, чтобы сгенерировать вектор признаков значений автокорреляции.

Шаг 6: Извлечение функций профиля последовательности

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

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

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

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

Загрузите белковые последовательности:

function sequences = load_protein_sequences(file_path)
    sequences = {};
    seq_data = fastaread(file_path);
    for i = 1:length(seq_data)
        sequences{end+1} = seq_data(i).Sequence;
    end
end

Рассчитайте аминокислотный состав:

function aac = amino_acid_composition(seq)
    amino_acids = 'ACDEFGHIKLMNPQRSTVWY';
    seq_length = length(seq);
    aac = containers.Map;
    for i = 1:length(amino_acids)
        aa = amino_acids(i);
        aac(aa) = sum(seq == aa) / seq_length;
    end
end

Рассчитайте дипептидный состав:

function dipeptide_freq = dipeptide_composition(seq)
    amino_acids = 'ACDEFGHIKLMNPQRSTVWY';
    dipeptides = {};
    for i = 1:length(amino_acids)
        for j = 1:length(amino_acids)
            dipeptides{end+1} = [amino_acids(i) amino_acids(j)];
        end
    end
    dipeptide_counts = containers.Map;
    for i = 1:length(dipeptides)
        dipeptide = dipeptides{i};
        dipeptide_counts(dipeptide) = sum(strfind(seq, dipeptide));
    end
    seq_length = length(seq);
    dipeptide_freq = containers.Map;
    for i = 1:length(dipeptides)
        dipeptide = dipeptides{i};
        dipeptide_freq(dipeptide) = dipeptide_counts(dipeptide) / (seq_length - 1);
    end
end

Вычислить автокорреляционные функции:

function autocorr_value = autocorrelation(seq, property_dict, lag)
    weights = arrayfun(@(x) property_dict(x), seq);
    mean_val = mean(weights);
    N = length(weights);
    numerator = sum((weights(1:N-lag) - mean_val) .* (weights(1+lag:N) - mean_val));
    denominator = sum((weights(1:N-lag) - mean_val).^2);
    autocorr_value = numerator / denominator;
end

Рассчитать характеристики профиля последовательности:

function profile = sequence_profile(msa_file)
    msa_data = fastaread(msa_file);
    num_sequences = length(msa_data);
    profile = zeros(num_sequences, 20);
    amino_acid_map = 'ACDEFGHIKLMNPQRSTVWY';
    
    for i = 1:num_sequences
        seq = msa_data(i).Sequence;
        for j = 1:length(amino_acid_map)
            aa = amino_acid_map(j);
            profile(i, j) = sum(seq == aa) / length(seq);
        end
    end
end

Рассчитайте баллы PSSM:

Чтобы рассчитать оценочные матрицы для конкретной позиции (PSSM), вы можете выполнить следующие действия:

  1. Рассчитайте частоты аминокислот, специфичные для позиции:
function frequencies = position_specific_frequencies(aligned_sequences)
    num_positions = length(aligned_sequences{1});
    num_sequences = length(aligned_sequences);
    amino_acids = 'ACDEFGHIKLMNPQRSTVWY';
    
    frequencies = zeros(num_positions, length(amino_acids));
    
    for i = 1:num_positions
        for j = 1:length(amino_acids)
            aa = amino_acids(j);
            count = sum(cellfun(@(x) x(i) == aa, aligned_sequences));
            frequencies(i, j) = count / num_sequences;
        end
    end
end

2. Вычислите фоновые частоты:

function background_frequencies = compute_background_frequencies(aligned_sequences)
    amino_acids = 'ACDEFGHIKLMNPQRSTVWY';
    background_frequencies = zeros(1, length(amino_acids));
    
    for i = 1:length(amino_acids)
        aa = amino_acids(i);
        count = sum(cellfun(@(x) sum(x == aa), aligned_sequences));
        background_frequencies(i) = count / (length(aligned_sequences) * length(aligned_sequences{1}));
    end
end

3. Подсчитайте баллы PSSM:

function pssm_scores = compute_pssm(frequencies, background_frequencies, pseudocounts)
    num_positions = size(frequencies, 1);
    num_amino_acids = size(frequencies, 2);
    pssm_scores = zeros(num_positions, num_amino_acids);
    
    for i = 1:num_positions
        for j = 1:num_amino_acids
            pssm_scores(i, j) = log2((frequencies(i, j) + pseudocounts) / background_frequencies(j));
        end
    end
end

Теперь у вас есть оценки PSSM, рассчитанные в MATLAB. Обратите внимание, что вам необходимо предоставить файл множественного выравнивания последовательностей (MSA), который можно создать с помощью таких инструментов, как Clustal Omega, MUSCLE или T-Coffee. MSA требуется для расчета частот аминокислот в зависимости от положения, которые затем используются для расчета показателей PSSM.

Полные коды Matlab:

Вот полный код MATLAB для генерации случайных белковых последовательностей с использованием функции randseq, выполнения множественного выравнивания последовательностей с использованием функции multialign из набора инструментов Bioinformatics Toolbox и вычисления состава аминокислот, состава дипептидов и функций PSSM.

myseq = [];
for i=1:10
    myseq(i).Sequence = randseq(50,'ALPHABET','AA');
end

aligned_seq = multialign(myseq);

MS = [];
for i=1:10
    MS{i,1} = aligned_seq(i).Sequence;
end

seq2 = [];
for i=1:10
    seq2{i,1} = myseq(i).Sequence;
end

aac_features = cellfun(@(x) amino_acid_composition(x), seq2, 'UniformOutput', false)
dipeptide_features = cellfun(@(x) dipeptide_composition(x), seq2, 'UniformOutput', false)

% Example property dictionary for hydrophobicity
hydrophobicity_map = containers.Map({'A','R','N','D','C','Q','E','G','H','I','L','K','M','F','P','S','T','W','Y','V'}, ...
                   {1.8, -4.5, -3.5, -3.5, 2.5, -3.5, -3.5, -0.4, -3.2, 4.5, 3.8, -3.9, 1.9, 2.8, -1.6, -0.8, -0.7, -0.9, -1.3, 4.2});

% Calculate autocorrelation for a specific lag (e.g., lag = 1)
lag = 1;
autocorr_features = cellfun(@(x) autocorrelation(x, hydrophobicity_map, lag), seq2)
sequence_profiles = sequence_profile(aligned_seq)

frequencies      = position_specific_frequencies(MS)
background_freqs = compute_background_frequencies(MS)
pseudocounts     = 0.01; % Adjust the pseudocounts value based on your needs
pssm_scores      = compute_pssm(frequencies, background_freqs, pseudocounts)

function frequencies = position_specific_frequencies(aligned_sequences)
    num_positions = length(aligned_sequences{1});
    num_sequences = length(aligned_sequences);
    amino_acids = 'ACDEFGHIKLMNPQRSTVWY';
    
    frequencies = zeros(num_positions, length(amino_acids));
    
    for i = 1:num_positions
        for j = 1:length(amino_acids)
            aa = amino_acids(j);
            count = sum(cellfun(@(x) x(i) == aa, aligned_sequences));
            frequencies(i, j) = count / num_sequences;
        end
    end
end

function background_frequencies = compute_background_frequencies(aligned_sequences)
    amino_acids = 'ACDEFGHIKLMNPQRSTVWY';
    background_frequencies = zeros(1, length(amino_acids));
    
    for i = 1:length(amino_acids)
        aa = amino_acids(i);
        count = sum(cellfun(@(x) sum(x == aa), aligned_sequences));
        background_frequencies(i) = count / (length(aligned_sequences) * length(aligned_sequences{1}));
    end
end

function pssm_scores = compute_pssm(frequencies, background_frequencies, pseudocounts)
    num_positions = size(frequencies, 1);
    num_amino_acids = size(frequencies, 2);
    pssm_scores = zeros(num_positions, num_amino_acids);
    
    for i = 1:num_positions
        for j = 1:num_amino_acids
            pssm_scores(i, j) = log2((frequencies(i, j) + pseudocounts) / background_frequencies(j));
        end
    end
end

function aac = amino_acid_composition(seq)
    amino_acids = 'ACDEFGHIKLMNPQRSTVWY';
    seq_length = length(seq);
    aac = containers.Map;
    for i = 1:length(amino_acids)
        aa = amino_acids(i);
        aac(aa) = sum(seq == aa) / seq_length;
    end
end

function dipeptide_freq = dipeptide_composition(seq)
    amino_acids = 'ACDEFGHIKLMNPQRSTVWY';
    dipeptides = {};
    for i = 1:length(amino_acids)
        for j = 1:length(amino_acids)
            dipeptides{end+1} = [amino_acids(i) amino_acids(j)];
        end
    end
    dipeptide_counts = containers.Map;
    for i = 1:length(dipeptides)
        dipeptide = dipeptides{i};
        dipeptide_counts(dipeptide) = sum(strfind(seq, dipeptide));
    end
    seq_length = length(seq);
    dipeptide_freq = containers.Map;
    for i = 1:length(dipeptides)
        dipeptide = dipeptides{i};
        dipeptide_freq(dipeptide) = dipeptide_counts(dipeptide) / (seq_length - 1);
    end
end

function autocorr_value = autocorrelation(seq, property_dict, lag)
    weights = arrayfun(@(x) property_dict(x), seq);
    mean_val = mean(weights);
    N = length(weights);
    numerator = sum((weights(1:N-lag) - mean_val) .* (weights(1+lag:N) - mean_val));
    denominator = sum((weights(1:N-lag) - mean_val).^2);
    autocorr_value = numerator / denominator;
end

function profile = sequence_profile(msa_data)
    num_sequences = length(msa_data);
    profile = zeros(num_sequences, 20);
    amino_acid_map = 'ACDEFGHIKLMNPQRSTVWY';
    
    for i = 1:num_sequences
        seq = msa_data(i).Sequence;
        for j = 1:length(amino_acid_map)
            aa = amino_acid_map(j);
            profile(i, j) = sum(seq == aa) / length(seq);
        end
    end
end