Белок-белковые взаимодействия (PPI) играют центральную роль в управлении клеточными процессами и поддержании хрупкого баланса в биологических системах. Способность предсказывать ИПП имеет далеко идущие последствия для понимания биологических путей, выявления потенциальных мишеней для лекарств и раскрытия молекулярных основ различных заболеваний. Один из ключей к предсказанию PPI заключается в извлечении значимых признаков из белковых последовательностей. В этой статье блога мы познакомим вас с процессом извлечения признаков для прогнозирования PPI, сосредоточив внимание на наиболее информативных признаках и методах, используемых для их получения.
Шаг 1: Получите последовательности белков
Первым шагом в извлечении признаков для предсказания PPI является получение последовательностей белков для пар белков, которые вы хотите проанализировать. Эти последовательности можно найти в общедоступных базах данных, таких как UniProt или база данных белков NCBI. Получив последовательности, сохраните их в подходящем формате, таком как FASTA, для дальнейшей обработки.
Шаг 2: Рассчитайте аминокислотный состав
Аминокислотный состав относится к относительной частоте каждой аминокислоты в последовательности белка. Чтобы вычислить аминокислотный состав, разделите количество вхождений каждой аминокислоты на общее количество аминокислот в последовательности. В результате получается 20-мерный вектор признаков, где каждое измерение соответствует одной из 20 стандартных аминокислот.
Шаг 3: Рассчитайте состав дипептидов
Состав дипептида учитывает частоту последовательных пар аминокислот в последовательности белка. Чтобы рассчитать состав дипептидов, подсчитайте количество вхождений каждого возможного дипептида (всего 400, так как имеется 20 аминокислот) и разделите на общее количество дипептидов в последовательности. Это дает 400-мерный вектор признаков.
Шаг 4: Создание оценочных матриц для конкретной позиции (PSSM)
PSSM предоставляют информацию о сохранении аминокислот в определенных положениях в семействе белков. Чтобы сгенерировать PSSM, выполните следующие шаги:
- Получите множественное выравнивание последовательностей (MSA) гомологичных белковых последовательностей. Для создания MSA можно использовать такие инструменты, как Clustal Omega, MUSCLE или T-Coffee.
- Рассчитайте частоты аминокислот для каждой позиции в MSA.
- Вычислите фоновые частоты аминокислот по всему MSA.
- Рассчитайте баллы PSSM, взяв логарифмическое отношение частот, характерных для местоположения, к фоновым частотам, а также принимая во внимание псевдосчета, чтобы избежать проблем с нулевой частотой.
Шаг 5: вычислить автокорреляционные функции
Автокорреляционные функции фиксируют закономерности и взаимосвязи между конкретными физико-химическими свойствами аминокислот в белковой последовательности. Общие физико-химические свойства включают гидрофобность, полярность и заряд. Чтобы вычислить автокорреляционные функции, выполните следующие шаги:
- Присвойте числовое значение каждой аминокислоте в последовательности на основе выбранного физико-химического свойства.
- Рассчитайте значение автокорреляции для определенного лага (расстояние между сравниваемыми аминокислотами). Это включает в себя вычисление корреляции между значениями свойств аминокислот, разделенных запаздыванием.
- Повторите этот процесс для разных задержек, чтобы сгенерировать вектор признаков значений автокорреляции.
Шаг 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), вы можете выполнить следующие действия:
- Рассчитайте частоты аминокислот, специфичные для позиции:
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