Генерация комбинаций ДНК-кодонов в R - PullRequest
1 голос
/ 23 апреля 2020

Я генерирую случайные последовательности ДНК в R, где каждая последовательность имеет заданную длину и содержит заданное пользователем распределение нуклеотидов.

Что я хочу сделать, это убедиться, что определенные серии нуклеотидов НЕ генерируется в заданной последовательности. Запрещены следующие запуски: «ага», «агг», «таа», «тег» и «тга».

Вот мой код, который просто генерирует последовательности, в которых МОЖЕТ произойти вышеприведенный прогон. Я не уверен, как лучше изменить код для учета запусков "tabu", указанных выше.

library(ape)

length.seqs <- 100 # length of DNA sequence
nucl.freqs <- rep(1/4, 4) # nucleotide frequencies

# DNA alphabet
nucl <- as.DNAbin(c('a', 'c', 'g', 't')) # A, C, G, T

# Randomly sample nucleotides
seqs <- sample(nucl, size = length.seqs, replace = TRUE, prob = nucl.freqs) 

Я думаю просто перечислить все разрешенные прогоны, которые будут использоваться вместо 'nucl' и укажите 'size' = length.seqs / 3 в функции sample (), но это кажется громоздким, даже с такими ярлыками, как "expand.grid ()".

1 Ответ

0 голосов
/ 23 апреля 2020

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

length.seqs <- 100 # length of DNA sequence
nucl.freqs <- rep(1/4, 4) # nucleotide frequencies
nucl <- c('a', 'c', 'g', 't') # A, C, G, T

seqs <- sample(nucl, size = length.seqs, replace = TRUE, prob = nucl.freqs)

bad_codons <- c("aga", "agg", "taa", "tag", "tga")

regx <- paste0("(", paste(bad_codons, collapse = ")|("), ")")

s <- paste(seqs, collapse = "")

while( grepl(regx, s) ) {
  s <- gsub(regx,
            paste(sample(nucl, size = 3, replace = TRUE, prob = nucl.freqs), collapse = ""),
            s)
}

s
grepl(regex, s)

Идея состоит в том, чтобы заменить плохие кодоны на симуляции fre sh, пока больше не будет плохих кодонов. Если вам нужна производительность на длинных или большом количестве последовательностей, это может быть не лучшим вариантом.

...