Как найти конкретную частоту кодона? - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь создать функцию в 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 ]

0 голосов
/ 02 июня 2018

Здесь нужно решить две вещи:

  1. преобразовать 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
    
  2. преобразовать строку последовательностик вектору подстрок длины 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
0 голосов
/ 02 июня 2018

Несколько иной путь ведет к этому решению:

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))
0 голосов
/ 02 июня 2018

Сначала я получаю список поиска и последовательность.

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
...