Как да извърша основно подравняване на множество последователности в 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
Здравей Йорис. Радвам се да знам, че такъв интерфейс съществува (не успях да го намеря от търсенията, които извърших). Не съм сигурен какво имате предвид с това, че първо трябва да инсталирате този алгоритъм. (имахте предвид пакет?) - но предполагам, че скоро ще разбера :) Благодаря ви за помощта :) Tal - 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

Търсите глобален алгоритъм за подравняване на множество последователности. Погледна ли Уикипедия преди да попиташ?

Първо научете какво е глобално подравняване, а след това потърсете подравняване на множество последователности.

Wikipedia не дава много подробности за алгоритмите, но този документ е по-добър .

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, оттук и моето запитване. И както казахте, предложението за фоново четене беше любезно от ваша страна. Joris - и ти, и аз знаем, че много малко хора притежават задълбочени познания по R и какъвто съм днес, не бих си позволил да бъда един от тях. Все още много ценя вашето мнение :) Ваш, Тал - person Tal Galili; 22.12.2010
comment
@Jules: В светлината на любезните коментари на Талс премахнах гласа си против. Трябваше да добавя интервал към публикацията ви, за да мога да го направя. - person Joris Meys; 24.12.2010