Как выполнить базовое выравнивание нескольких последовательностей в R?

(Я пытался задать этот вопрос на BioStars, но из-за небольшого шанса, что кто-то из текстовых майнинг подумал бы, что есть лучшее решение, я также размещаю это здесь)

Задача, которую я пытаюсь решить, состоит в том, чтобы выровнять несколько последовательностей.

У меня нет основного шаблона, чтобы соответствовать. Все, что я знаю, это то, что шаблон «Истина» должен иметь длину «30» и что последовательности, которые я имел, имели пропущенные значения, введенные в них в случайных точках.

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

Моя цель - восстановить левый столбец, используя только последовательности, которые у меня есть в правом столбце (на основе того факта, что многие буквы в каждой позиции одинаковы)

                     Real_sequence           The_sequence_we_see
1   CGCAATACTAAC-AGCTGACTTACGCACCG CGCAATACTAACAGCTGACTTACGCACCG
2   CGCAATACTAGC-AGGTGACTTCC-CT-CG   CGCAATACTAGCAGGTGACTTCCCTCG
3   CGCAATGATCAC--GGTGGCTCCCGGTGCG  CGCAATGATCACGGTGGCTCCCGGTGCG
4   CGCAATACTAACCA-CTAACT--CGCTGCG   CGCAATACTAACCACTAACTCGCTGCG
5   CGCACGGGTAAGAACGTGA-TTACGCTCAG CGCACGGGTAAGAACGTGATTACGCTCAG
6   CGCTATACTAACAA-GTG-CTTAGGC-CTG   CGCTATACTAACAAGTGCTTAGGCCTG
7   CCCA-C-CTAA-ACGGTGACTTACGCTCCG   CCCACCTAAACGGTGACTTACGCTCCG

Вот пример кода для воспроизведения приведенного выше примера:

ATCG <- c("A","T","C","G")
set.seed(40)
original.seq <- sample(ATCG, 30, T)
seqS <- matrix(original.seq,200,30, T)
change.letters <- function(x, number.of.changes = 15, letters.to.change.with = ATCG) 
{
    number.of.changes <- sample(seq_len(number.of.changes), 1)
    new.letters <- sample(letters.to.change.with , number.of.changes, T)
    where.to.change.the.letters <- sample(seq_along(x) , number.of.changes, F)
    x[where.to.change.the.letters] <- new.letters
    return(x)
}
change.letters(original.seq)
insert.missing.values <- function(x) change.letters(x, 3, "-") 
insert.missing.values(original.seq)

seqS2 <- t(apply(seqS, 1, change.letters))
seqS3 <- t(apply(seqS2, 1, insert.missing.values))

seqS4 <- apply(seqS3,1, function(x) {paste(x, collapse = "")})
require(stringr)
# library(help=stringr)
all.seqS <- str_replace(seqS4,"-" , "")

# how do we allign this?
data.frame(Real_sequence = seqS4, The_sequence_we_see = all.seqS)

Я понимаю, что если бы все, что у меня было, было строкой и шаблоном, я мог бы использовать

library(Biostrings)
pairwiseAlignment(...)

Но в случае, который я представляю, мы имеем дело со многими последовательностями, которые выравниваются друг с другом (вместо того, чтобы выравнивать их по одному шаблону).

Есть ли известный способ сделать это в R?


person Tal Galili    schedule 21.12.2010    source источник


Ответы (4)


Хотя это довольно старая ветка, я не хочу упустить возможность упомянуть, что, начиная с Bioconductor 3.1, существует пакет «msa», реализующий интерфейсы к трем различным алгоритмам множественного выравнивания последовательностей: ClustalW, ClustalOmega и MUSCLE. Пакет работает на всех основных платформах (Linux/Unix, Mac OS и Windows) и является автономным в том смысле, что вам не нужно устанавливать какое-либо внешнее программное обеспечение. Дополнительную информацию можно найти на http://www.bioinf.jku.at/software/msa/ и http://www.bioconductor.org/packages/release/bioc/html/msa.html.

person UBod    schedule 12.06.2017
comment
Спасибо за обновление информации. Я потерял принятый ответ, но я не против. В любом случае, спустя 7 лет этот ответ давно назрел. - person Joris Meys; 13.06.2017

Написание алгоритма выравнивания на R мне кажется плохой идеей, но есть интерфейс R для MUSCLE алгоритм в пакете bio3d (функция seqaln()). Имейте в виду тот факт, что вы должны сначала установить этот алгоритм.

Кроме того, вы можете использовать любой из доступных алгоритмов (например, ClustalW, MAFFT, T-COFFEE) и импортировать множественные выравнивания последовательностей в R, используя биокондуктор. См., например, здесь..

person Joris Meys    schedule 21.12.2010
comment
Привет Йорис. Я рад узнать, что такой интерфейс существует (я не смог найти его из проведенных поисков). Я не уверен, что вы имеете в виду, что вам нужно сначала установить этот алгоритм. (вы имели ввиду пакет?) - но думаю скоро узнаю :) Спасибо за помощь :) Таль - person Tal Galili; 21.12.2010
comment
это не пакет, это отдельный исполняемый файл: drive5.com/muscle/downloads.htm - person Ben Bolker; 21.12.2010
comment
Как сказал Бен. MUSCLE — это хорошо известный и хорошо работающий алгоритм множественного выравнивания. Поэтому вам придется сначала установить исполняемый файл, а затем поиграть с пакетом bio3d. Это немного странное место для поиска, так как bio3d в основном предназначен для моделирования белков. Но MUSCLE также может выравнивать несколько последовательностей ДНК. - person Joris Meys; 21.12.2010
comment
Обратите внимание, что для этого есть новые пакеты, в т.ч. msa, который может обрабатывать алгоритмы MUSCLE, CLUSTALW и CLUSTALOMEGA. С положительной стороны, это не зависит от какого-либо внешнего программного обеспечения. - person Roman Luštrik; 30.12.2016

Вы можете выполнить множественное выравнивание в R с помощью пакета DECIPHER.

Следуя вашему примеру, это будет выглядеть примерно так:

library(DECIPHER)
dna <- DNAStringSet(all.seqS)
aligned_DNA <- AlignSeqs(dna)

Это быстро и, по крайней мере, так же точно, как и другие методы, перечисленные здесь (см. >бумага). Надеюсь, это поможет!

person Erik Wright    schedule 13.12.2016
comment
не предполагает ли DECIPHER, что считываемые данные находятся в формате FASTA? Я не видел примеров, когда строки являются необработанными символами. - person Vass; 24.08.2020

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

Сначала узнайте, что такое глобальное выравнивание, а затем найдите множественное выравнивание последовательностей.

В Википедии не так много подробностей об алгоритмах, но эта статья лучше .

person Jules Olléon    schedule 21.12.2010
comment
@Jules Это не говорит ему, как это сделать в R. Я считаю, что Талу на самом деле не помогло, отправив ему несколько ссылок, которые он мог бы легко найти в Google сам. И, вероятно, сделал задолго до того, как он задал этот вопрос. - person Joris Meys; 21.12.2010
comment
Привет Джулс. Спасибо за добрые намерения и ссылку на презентацию. С уважением, Таль - person Tal Galili; 21.12.2010
comment
@Joris Учитывая то, как он представил свой вопрос, похоже, Тал не знал, что это стандартная проблема биоинформатики, поэтому я подумал, что некоторые базовые знания в этой области могут ему помочь ... но вы правы, Я должен был опубликовать это как комментарий, а не как ответ. - person Jules Olléon; 22.12.2010
comment
@Jules: никакого вреда не имелось в виду. Вы не можете знать, что Тал является биостатистиком и обладает довольно глубокими познаниями в R, поэтому я, возможно, был немного резок в своем комментарии. - person Joris Meys; 22.12.2010
comment
Привет Джулс. Вы правы в том, что я впервые пытаюсь выполнить такую ​​задачу с помощью R, отсюда и мой запрос. И, как было сказано, предложение фонового чтения было любезно с вашей стороны. Джорис, и вы, и я знаем, что очень немногие люди обладают глубоким знанием R, и, поскольку я сегодня, я бы не стал считаться одним из них. Я все еще очень ценю ваше чувство :) С уважением, Таль - person Tal Galili; 22.12.2010
comment
@Jules: В свете добрых комментариев Талса я удалил свой отрицательный голос. Мне пришлось добавить пробел к вашему сообщению, чтобы иметь возможность это сделать. - person Joris Meys; 24.12.2010