Как найти конкретную частоту кодона?
Я пытаюсь сделать функцию в R, которая могла бы рассчитать частоту каждого кодона. Мы знаем, что метионин является аминокислотой, которая может быть образована только одним набором кодонов ATG, поэтому его процент в каждом наборе последовательностей равен 1. Где, поскольку глицин может образовываться с помощью GGT, GGC, GGA, GGG, следовательно, процент возникновения каждый кодон будет 0,25. Входные данные будут находиться в последовательности ДНК, подобной ATGGGTGGCGGAGGG, и с помощью таблицы кодонов она может рассчитать процент каждого вхождения на входе.
Пожалуйста, помогите мне, предложив способы сделать эту функцию.
например, если мой аргумент ATGTGTTGCTGG, то мой результат будет
ATG=1
TGT=0.5
TGC=0.5
TGG=1
Данные для R:
codon <- list(ATA = "I", ATC = "I", ATT = "I", ATG = "M", ACA = "T",
ACC = "T", ACG = "T", ACT = "T", AAC = "N", AAT = "N", AAA = "K",
AAG = "K", AGC = "S", AGT = "S", AGA = "R", AGG = "R", CTA = "L",
CTC = "L", CTG = "L", CTT = "L", CCA = "P", CCC = "P", CCG = "P",
CCT = "P", CAC = "H", CAT = "H", CAA = "Q", CAG = "Q", CGA = "R",
CGC = "R", CGG = "R", CGT = "R", GTA = "V", GTC = "V", GTG = "V",
GTT = "V", GCA = "A", GCC = "A", GCG = "A", GCT = "A", GAC = "D",
GAT = "D", GAA = "E", GAG = "E", GGA = "G", GGC = "G", GGG = "G",
GGT = "G", TCA = "S", TCC = "S", TCG = "S", TCT = "S", TTC = "F",
TTT = "F", TTA = "L", TTG = "L", TAC = "Y", TAT = "Y", TAA = "stop",
TAG = "stop", TGC = "C", TGT = "C", TGA = "stop", TGG = "W")
3 ответа
Сначала я получаю свой список поиска и последовательность.
codon <- list(ATA = "I", ATC = "I", ATT = "I", ATG = "M", ACA = "T",
ACC = "T", ACG = "T", ACT = "T", AAC = "N", AAT = "N", AAA = "K",
AAG = "K", AGC = "S", AGT = "S", AGA = "R", AGG = "R", CTA = "L",
CTC = "L", CTG = "L", CTT = "L", CCA = "P", CCC = "P", CCG = "P",
CCT = "P", CAC = "H", CAT = "H", CAA = "Q", CAG = "Q", CGA = "R",
CGC = "R", CGG = "R", CGT = "R", GTA = "V", GTC = "V", GTG = "V",
GTT = "V", GCA = "A", GCC = "A", GCG = "A", GCT = "A", GAC = "D",
GAT = "D", GAA = "E", GAG = "E", GGA = "G", GGC = "G", GGG = "G",
GGT = "G", TCA = "S", TCC = "S", TCG = "S", TCT = "S", TTC = "F",
TTT = "F", TTA = "L", TTG = "L", TAC = "Y", TAT = "Y", TAA = "stop",
TAG = "stop", TGC = "C", TGT = "C", TGA = "stop", TGG = "W")
MySeq <- "ATGTGTTGCTGG"
Далее я загружаю stringi
библиотека и разбить последовательность на куски из трех символов.
# Load library
library(stringi)
# Break into 3 bases
seq_split <- stri_sub(MySeq, seq(1, stri_length(MySeq), by=3), length=3)
Затем я считаю буквы, которым соответствуют эти три базовых блока. table
,
# Get associated letters
letter_count <- table(unlist(codon[seq_split]))
Наконец, я связываю последовательности вместе с обратным числом и переименовываю столбцы моего фрейма данных.
# Bind into a data frame
res <- data.frame(seq_split,
1/letter_count[match(unlist(codon[seq_split]), names(letter_count))])
# Rename columns
colnames(res) <- c("Sequence", "Letter", "Percentage")
# Sequence Letter Percentage
#1 ATG M 1.0
#2 TGT C 0.5
#3 TGC C 0.5
#4 TGG W 1.0
Несколько иной путь ведет к этому решению:
f0 <- function(dna, weight) {
codons <- regmatches(dna, gregexpr("[ATGC]{3}", dna))
tibble(id = seq_along(codons), codons = codons) %>%
unnest() %>%
mutate(weight = as.vector(wt[codons]))
}
Первый, codon
просто именованный вектор, а не список; вот вес
codon <- unlist(codon)
weight <- setNames(1 / table(codon)[codon], names(codon))
Во-вторых, вероятно, существует вектор последовательностей ДНК, а не один.
dna <- c("ATGTGTTGCTGG", "GGTCGTTGTGTA")
Чтобы разработать решение, можно найти кодоны путем поиска любого нуклеотида. [ACGT]
повторный {3}
раз
codons <- regmatches(dna, gregexpr("[ATGC]{3}", dna))
Кажется, что тогда удобно выполнять операции в тививерсе, создавая тиббл (data.frame), где id
указывает, из какой последовательности кодон
library(tidyverse)
tbl <- tibble(id = seq_along(codons), codon = codons) %>% unnest()
а затем добавить вес
tbl <- mutate(tbl, weight = as.vector(weight[codon]))
так что у нас есть
> tbl
# A tibble: 8 x 3
id codon weight
<int> <chr> <dbl>
1 1 ATG 1
2 1 TGT 0.5
3 1 TGC 0.5
4 1 TGG 1
5 2 GGT 0.25
6 2 CGT 0.167
7 2 TGT 0.5
8 2 GTA 0.25
Стандартные операции обратного хода могут использоваться для дальнейшего суммирования, в частности, когда один и тот же кодон появляется несколько раз
tbl %>% group_by(id, codon) %>%
summarize(wt = sum(weight))
Здесь нужно решить две вещи:
перерабатывать
codon
к фракциям для каждого письма( fracs <- 1/table(unlist(codon)) ) # A C D E F G H I # 0.2500000 0.5000000 0.5000000 0.5000000 0.5000000 0.2500000 0.5000000 0.3333333 # K L M N P Q R S # 0.5000000 0.1666667 1.0000000 0.5000000 0.2500000 0.5000000 0.1666667 0.1666667 # stop T V W Y # 0.3333333 0.2500000 0.2500000 1.0000000 0.5000000 codonfracs <- setNames(lapply(codon, function(x) unname(fracs[x])), names(codon)) str(head(codonfracs)) # List of 6 # $ ATA: num 0.333 # $ ATC: num 0.333 # $ ATT: num 0.333 # $ ATG: num 1 # $ ACA: num 0.25 # $ ACC: num 0.25
преобразовать строку последовательности в вектор подстрок длины 3
s <- 'ATGTGTTGCTGG' strsplit3 <- function(s, k=3) { starts <- seq.int(1, nchar(s), by=k) stops <- c(starts[-1] - 1, nchar(s)) mapply(substr, s, starts, stops, USE.NAMES=FALSE) } strsplit3(s) # [1] "ATG" "TGT" "TGC" "TGG"
Отсюда это просто поиск:
codonfracs[ strsplit3(s) ]
# $ATG
# [1] 1
# $TGT
# [1] 0.5
# $TGC
# [1] 0.5
# $TGG
# [1] 1
РЕДАКТИРОВАТЬ
Поскольку вы хотите получить статус других кодонов, попробуйте это:
x <- codonfracs
x[ ! names(x) %in% strsplit3(s) ] <- 0
str(x)
# List of 64
# $ ATA: num 0
# $ ATC: num 0
# $ ATT: num 0
# $ ATG: num 1
# $ ACA: num 0
# $ ACC: num 0
# $ ACG: num 0
# ...snip...
# $ TAT: num 0
# $ TAA: num 0
# $ TAG: num 0
# $ TGC: num 0.5
# $ TGT: num 0.5
# $ TGA: num 0
# $ TGG: num 1