6
votes

Cordes de correspondance et de comptage (K-Mer de l'ADN) dans R

J'ai une liste de chaînes (séquence d'ADN), y compris a, t, c, g. Je souhaite trouver toutes les correspondances et insérer dans la table dont les colonnes sont toutes une combinaison possible de ces alphabet d'ADN (4 ^ k; "k" est la longueur de chaque match - k-mer - et doit être spécifié par l'utilisateur) et les lignes représentent le nombre de correspond à une séquence dans une liste.

permet de dire que ma liste comprend 5 membres: xxx

je veux définir k = 2 (2-mer) donc 4 ^ 2 = 16 Combinaison sont disponibles, y compris AA, AT, AC, AG, TA, TT, ...

Donc, ma table aura 5 rangées et 16 colonnes . Je veux compter le nombre de correspondances entre mes k-Mers et mes membres de la liste.

mon résultat souhaité: df: xxx

Pourriez-vous m'aider à mettre en œuvre cela dans R?


1 commentaires

Ma base de données est énorme, alors l'efficacité est également importante ici. Merci.


5 Réponses :


6
votes

peut-être que cela aide xxx

ou comme suggéré par @arun, convertir la liste sur vecteur < Pré> xxx


2 commentaires

Vous devriez faire: oligonucléotidefrequency (dnastringset (x), 2l) , où x est ecriste (dnaliste) !!


@Arun merci, c'est mieux.




4
votes

Ma réponse n'était pas aussi rapide que @bartektartanus. Cependant, il est également assez rapide et j'ai écrit le code ...: D

Le côté plus de mon code par rapport aux autres est: H2>
  1. n'a pas besoin d'installer la version non différée de stri_count_fixed code> li>
  2. probablement Stringi code> sera vraiment lent pour les gros k-mers car il doit générer toutes les combinaisons possibles pour le modèle et ensuite, Vérifiez leur existence dans les données et comptez combien de fois il apparaît. Li>
  3. Cela fonctionne également pour une longue simple forte> et et plusieurs séquences fortes> avec la même sortie vraiment rapide. li>
  4. Vous pouvez mettre une valeur pour k code> au lieu de créer une chaîne de motif. li>
  5. Si vous exécutez oligonucléotidefrequency code> avec un k code> plus grand que 12 Dans une grande séquence, la fonction gèle l'excès d'utilisation de la mémoire et R est redémarré, tandis que ma fonction est assez rapide. Li> ol>

    mon code h2> xxx pré>

    i Utilisez le package code> uniquement pour compter les bases ... Vous pouvez utiliser d'autres options comme Stringi Code> Pour compter ... Si vous supprimez tout le code ci-dessous k_mers lapply code> et retour (k_mers) code> Il renvoie juste la liste ... de tous les k-mers avec les vecteurs répétés respectifs p> séquence code> Voici une séquence de 1000bp h3> xxx pré>

    tests effectués avec ma fonction: strong> p>

    #Slow 1 sequence 12-mers
    > system.time({oligonucleotideFrequency(DNAString(sequence),12)})
         user    system   elapsed 
       150.11      1.14    151.37 
    
    #Biostrings package freezes for a single sequence of 13-mers
    > system.time({oligonucleotideFrequency(sequence,13)})  
    freezes, used all my 8gb RAM
    


0 commentaires

4
votes

Nous avons récemment publié notre forfait 'Kebabs' dans le cadre du bioconducteur 3.0 Libération. Bien que ce paquet vise à fournir des noyaux de séquence pour la classification, la régression et d'autres tâches telles que la similitude Clustering, le colis inclut une fonctionnalité pour calculer les fréquences K-MER efficacement, aussi:

#for the kebabs documentation please see:
browseVignettes("kebabs")


2 commentaires

Merci de réponse explicite. une question sur la normalisation dans Spectrumkernel (K = 13, normalisée = true) ; Est-ce que cela normalise l'obœurs ou les colonnes?


La normalisation du noyau est définie comme k '(x, y) = k (x, y) / sqrt (k (x, x) * k (y, y)). Dans le cas de la représentation explicite, cela correspond à la normalisation d'aspects en divisant chaque rangée par sa norme euclidienne. Si vous avez besoin de normalisation des colonnes, calculez la représentation explicite sans normalisation (comme dans ma réponse ci-dessus) et appliquez une échelle () à la matrice.



2
votes

Une autre façon de faire ceci:

DNAlst<-list("CAAACTGATTTT","GATGAAAGTAAAATACCG","ATTATGC","TGGA","CGCGCATCAA","ACACACACACCA")
len <- 4
stri_sub_fun <- function(x) table(stri_sub(x,1:(stri_length(x)-len+1),length = len))
sapply(DNAlst, stri_sub_fun)
[[1]]

AAAC AACT ACTG ATTT CAAA CTGA GATT TGAT TTTT 
   1    1    1    1    1    1    1    1    1 

[[2]]

AAAA AAAG AAAT AAGT AATA ACCG AGTA ATAC ATGA GAAA GATG GTAA TAAA TACC TGAA 
   1    1    1    1    1    1    1    1    1    1    1    1    1    1    1 

[[3]]

ATGC ATTA TATG TTAT 
   1    1    1    1 

[[4]]

TGGA 
   1 

[[5]]

ATCA CATC CGCA CGCG GCAT GCGC TCAA 
   1    1    1    1    1    1    1 

[[6]]

ACAC ACCA CACA CACC 
   4    1    3    1 


0 commentaires