2008/06/18 Bio/Info2008.R 1 Typographical Conventions for R Script R Script:Normal Text R Script:Symbol R Script:Keyword R Script:Identifier R Script:String R Script:Headline R Script:Comment R Script:Assign R Script:Control Structure R Script:Reserved Words R Script:Error R Script:Operator R Script:String Char R Script:Float R Script:Int Formation ISEM "Initiation à R" ############ ########################### Récupération de séquences ############################# ############ # 1/ Méthodes Manuelles sur des données dans un fichier ########### ################ On n'a pas le fichier en local #ex1 : depuis le site ftp de ncbi pour quelques genomes #////////////////////////////////////////////////////// myfileloc </ "ftp://ftp.ncbi.nih.gov/genbank/genomes/bacteria/halobacterium_sp/ae004437.faa" download.file(myfileloc, "AE004437.faa"); #ex2 : on a une liste de regions de chromosomes d'un genome sur le site d'ensembl #////////////////////////////////////////////////////// #l'url est du type http://www.ensembl.org/mus_musculus/exportview?seq_region_name=1&type1=bp&anchor1=9955874... #lecture du fichier contenant une liste de slices du genome de la souris à récuperer sur le site d'ensembl slices = read.table("liste.txt", header=t, sep="\t") #fichier avec entête "chr deb fin" séparés par des tabulations # construction de l'url pour la 1 région req = paste("http://www.ensembl.org/mus_musculus/exportview?seq_region_name=",slices$chr[1], "&type1=bp&anchor1=", slices$deb[1],"&type2=bp&anchor2=",slices$fin[1],"&downstream=&upstream=&format=fasta&action=export&_format=text&output=txt&submit=continue+%3e%3e", sep = "") download.file(req, "seq1.txt"); #sauvegarde dans le ficher seq1.txt #généraliser à toutes les regions contenues dans le fichier. Ajouter toutes les seq dans le même fichier #construire la liste des url avec les differentes coordonnées urls = sapply(1:nrow(slices), function(x) paste("http://www.ensembl.org/mus_musculus/exportview?seq_region_name=",slices$chr[x], "&type1=bp&anchor1=", slices$deb[x],"&type2=bp&anchor2=",slices$fin[x],"&downstream=&upstream=&format=fasta&action=export&_format=text&output=txt&submit=continue+%3e%3e", sep = "") ) sapply(urls, function(x) download.file(x, "big_seq.fa", mode = "a") ); #ex3 : #////////////////////////////////////////////////////// utiliser la même technique pour récuperer des alignements depuis la base de données OrthoMaM (alignement d'exons de 25 mammifères) ex. http://www.orthomam.univ/montp2.fr/orthomam/data/aligndna/ensg00000005812_fbxl3_003_sh.fasta (identifiant d'ensembl + HGNC symbol (Hugo gene nomencl. comitee) +??? + sh.fasta download.file("http://www.orthomam.univ/montp2.fr/orthomam/data/aligndna/ensg00000005812_fbxl3_003_sh.fasta ", "exon_orthomam.fa") Trouver un moyen de récuperer des alignements connaissant uniquement l'id ensembl et le HGNC symbol?! ################ On a le fichier en local on veut le lire #à l'aide du package ape library(ape) read.dna("seq1.txt") #seqinr library(seqinr) read.fasta("seq1.txt") # également write.fasta() read.alignment
2008/06/18 Bio/Info2008.R 2 #quand les fichiers sont trop gros (genomes entiers), il faut écrire sa propre fonction de lecture #en utilisant les routines de base de R (readlines) voir fonction lect_fasta plus bas # 2/ Méthodes faisant appel à des accessions numbers, des filtres des bases de données Mysql... ####### #Depuis GeneBank avec des accessions numbers #/////////////////////////////////////////// ref</c("nm_005368") #réference du gene de la myoglobine myoglobin</read.genbank(ref) #Depuis une des bases de données du système ACNUC à l'aide du package seqinr #/////////////////////////////////////////////////////////////////////////// choosebank("genbank") query("mitcatscds", "sp=felis catus AND t=cds AND o=mitochondrion") #tous les cds de la mitochondrie du chat MitCatsCDS # Info sur l'objet de la requette MitCatsCDS$req # liste avec détails sur les résultats de la requette MitCatsCDS$req[[1]] # la première séquence de la liste getsequence(mitcatscds$req[[1]]) # en extraire la séquence #voir plus bas pour un exemple de calcul de GC sur un chromosome de la souris #Depuis une des bases de données structurée selon le système BioMart (biomart.org) et le package biomart #/////////////////////////////////////////////////////////////////////////////////////////////////////// library(biomart) listmarts() # lister toutes les bases de données disponibes ens_mart = usemart("ensembl") # choisir les données d'ensembl listdatasets(ens_mart) # lister tous les jeux de données d'ensembl mus_ens_mart = usedataset("mmusculus_gene_ensembl", ens_mart) # choisir le jeux de données des genes de la souris # Définir les nom des filtres, les valeurs prises par ces filtres et les attributs à récuperer # Filtres = les genes du chromosome 10 qui codent pour des proteines monfiltre = c("chromosome_name", "biotype"); # nom des filtres filtreval = list(chromosome_name ="10", biotype="protein_coding"); #valeurs des filtres # Attributs = récuperer les identifiants Ensembl (gene et transcrits) et MGI, la description ainsi que la position debut et position de fin sur le chr mesattrib = c("description", "ensembl_gene_id", "ensembl_transcript_id", "mgi_symbol", "start_position","end_position"); mus_chr10_genes = getbm(attributes = mesattrib, filters = monfiltre, values = filtreval, mart = mus_ens_mart) #voir plus bas pour un exemple avec des snips #Requette sur les bases de données de genomes du site d'ensembl à l'aide du package RMySQL (et DBI) #/////////////////////////////////////////////////////////////////////////////////////////////////// library('rmysql') m </ dbdriver("mysql") #specifier le type de base de données relationnelle # Connexion en anonyme au site d'ensembl et à la base Mus musculus core con </ dbconnect(m, host="ensembldb.ensembl.org", user="anonymous",password="", dbname="mus_musculus_core_45_36f") dblisttables(con) #lister les tables dblistfields(con, "repeat_feature") # lister les champs de la table des élements repétés dblistfields(con, "gene") # idem pour la table des genes #Quelques requettes sql qui retournent des data.frame dbgetquery(con, "select count(*) from gene") #compter tous les genes dbgetquery(con, "select * from gene LIMIT 5") #recup. des infos sur les 5 premiers genes dbgetquery(con, "select * from gene where description LIKE '%meiosis%'") #tous les genes avec le mot clef "meiosis" dbgetquery(con, "select * from seq_region LIMIT 10") #recup des infos sur les dix premières regions de sequences ###########################################
2008/06/18 Bio/Info2008.R 3 ############################ manipulation des séquences ############### ########################################### ## Reverse et/ou Complement Function ## rev_comp </ function(seq=mystr, rev=t, comp=t) if(rev==t) seq </ as.vector(unlist(strsplit(seq, split=""))) seq </ rev(seq) seq </ paste(seq, collapse="") if(comp==t) seq </ gsub("a", "1", seq, ignore.case = T) seq </ gsub("t", "2", seq, ignore.case = T) seq </ gsub("c", "3", seq, ignore.case = T) seq </ gsub("g", "4", seq, ignore.case = T) seq </ gsub("1", "T", seq, ignore.case = T) seq </ gsub("2", "A", seq, ignore.case = T) seq </ gsub("3", "G", seq, ignore.case = T) seq </ gsub("4", "C", seq, ignore.case = T) seq #ex. seq="tcgatcgtacgttcagcttactacgttcgttc" rev_comp(seq, rev=t, comp=t) #ex avec seqinr v_seq = s2c(seq) # pour transformer en vecteur de caractères comp(v_seq ) # complémenter comp( rev( v_seq ) ) #reverser et complémenter ## Taux de GC ## #ape GC.content(as.DNAbin(v_seq) ) #seqinr GC( v_seq) ## frequences en base ## #ape base.freq(as.dnabin(v_seq)) # multiplier par length(v_seq) pour obtenir les comptes #seqinr obs = count(v_seq, 1) # 2, 3 pour les dimères trimères... #test d'equi/fréquence de la composition en bases chisq.test(obs,p=c(0.25,0.25,0.25, 0.25)) ####### ## Recherche de motifs ####### find_pattern </ function(seq, motif, rev=f, comp=f) seq = rev_comp(seq, rev, comp); pos </ gregexpr(motif, as.character(seq));#liste des positions où le motif est trouvé unlist(pos) #exemple find_pattern(seq="tcgatcgtacgttcagct", motif="cgt", rev=f, comp=f)
2008/06/18 Bio/Info2008.R 4 ####### ## Aligner des seq. à l'aide d'un programme externe ####### library(ape) #quelques accession numbers de Ramphocelus (Passereaux) as used in Paradis (1997) ref </ c("u15717", "U15718", "U15719", "U15720","U15721", "U15722", "U15723", "U15724") meseq </ read.genbank(ref) # Ecriture dans un fichier au format = "interleaved", "sequential", or "fasta" write.dna(meseq, format = "fasta", "Ramphocelus.fas") system("clustalw Ramphocelus.fas") # lancer clustal en local t = read.tree("ramphocelus.dnd") #lire l'arbre produit par clustalw plot(t) #le dessiner # au fait les seq sont déjà alignées ####### ## calcul des distances génétiques par paires et phylogenie ####### # ape # différents modèles de substitution "JC69", "K80" (the default), "F81", "K81", "F84", "BH87", "T92", "TN93", "GG95", "logdet", "paralin". d_kim = dist.dna(meseq) #model Kimura 2/p (defaut) print(d_kim) njtree_kim = nj(d_kim) # Un arbre nj à partir de ces distances write.tree(njtree_kim) #Affichage au format Newick plot( njtree_kim, "u" ) #On le dessine avec l'option unrooted #Changer la couleur du nom d'un taxon couleurs = rep("black",8) couleurs[1] = "red" plot( njtree_kim, "u", tip.color = couleurs ) #Ajout d'un histogramme de données sur les 8 taxons mesure = rnorm(8, 0.25, sd=0.1)/10 max = max(mesure) names(mesure) = njtree_kim$tip.label plot(njtree_kim, x.lim=0.14, font=1, cex = 0.8) axisphylo() deb= 0.08 segments(rep(deb,8),1:8,rep(deb,8) + mesure, 1:8, lwd=3, col="red") axis(1,at=c(deb, deb+(max/2), deb+max), labels= format(c(0, (max/2),max ),digits=3) ) mtext("mesure / espèces", at=deb+(max/2), side=1, line=2) #illustrer l'incertitude sur un neoud nodelabels(node=14,"?",adj=1, bg="red") #Arbre de maximum de vraisemblence mod = DNAmodel("F84") #modèle d'evolution des sequences selon Felsenstein 1984 (tr tv et freq variables) tree_f84 = mlphylo(model = mod, meseq, phy = njtree_kim) #pas sûr que cela marche! # from ape "This function calls the software PHYML and fits successively 28 models of DNA evolution. The results are saved on disk, as PHYML # usually does, and returned in R as a vector with the log/likelihood value of each model." #sous windows pour éviter les problèmes de chemin de recherche d'exécutables #setwd("c://program file//phyml_v2.4//exe")
2008/06/18 Bio/Info2008.R 5 # Ecriture dans un fichier au format = "interleaved" write.dna(meseq, format = "interleaved", "Ramphocelus.fas") # X </ phymltest("ramphocelus.fas", execname="phyml_linux") X summary(x) plot(x) ########### Quelques fonctions ############### lect_seq_fasta </ function(myfilename) filecon</file(myfilename, "r") #Pour compter les lignes du fichier : # cat myfilename wc /l # pour compter le nombre de seq. # cat myfilename grep ">" wc /l commande = paste("cat", myfilename," wc /l", sep = " ") nb_lines = system(commande, intern = TRUE) commande = paste("cat", myfilename," grep '^>' wc /l", sep = " ") nb_seqs = system(commande, intern = TRUE) #construire un dataframe pour les seq data = data.frame(numseq=1:nb_seqs, nomseq=i("x"), seq = I("x")) #I pour éviter le codage en Factor cur_seq = 0; seq = ""; tt = ""; name = ""; for(i in 1: as.integer(nb_lines) ) tt</readlines(filecon, n=1) #grep retourne un vecteur dont la longueur est nulle quand pas de présence if (length(grep("^>", tt) ) ) # nom d'une seq cur_seq = cur_seq + 1; if (cur_seq > 1) #cat( cur_seq / 1,name, seq,"\n", sep ="\t" ); data[cur_seq / 1, 2] = name data[cur_seq / 1, 3] = seq seq = ""; name = tt; else # un morceau de seq seq = paste(seq, tt, sep = ""); #pos</seek(filecon, rw="r") # pour la dernière seq #cat( cur_seq,name, seq,"\n", sep ="\t" ); data[cur_seq, 2] = name data[cur_seq, 3] = seq close.connection(filecon); data;
2008/06/18 Bio/Info2008.R 6 # Download sample proteome from NCBI in fasta format. The chosen example is from Halobacterium sp. which contains 2058 proteins: myfileloc </ "ftp://ftp.ncbi.nih.gov/genbank/genomes/bacteria/halobacterium_sp/ae004437.faa" download.file(myfileloc, "AE004437.faa"); Halobact </ lect_seq_fasta(myfilename="ae004437.faa") ########## # Analyse de données SNP depuis BioMart ########## snpmart = usemart("snp", "mmusculus_snp") attribs = c("refsnp_id", "allele", "chrom_start", "chrom_strand") filtres = c("chr_name", "chrom_start", "chrom_end") deb = 41282706 fin = 41382706 filtreval = list(8, deb, fin) snips = getbm(attributes = attribs, filters = filtres, values = filtreval, mart = snpmart) nbsnips = nrow(snips) plot(x </ snips[,3], y </ rep(1,times=nbsnips), type="h", col="blue", xaxt="n", yaxt="n", bty="n", main = "SNIPs du chromosome 8", xlab=paste("positions ",deb, "/",fin,sep=""), ylab=""); abline(h=0.78, col="green", lwd=12); #distinguer les changements de type C/T lines(a </ snips[snips[,2]=="c/t",3], b </ rep(1,times=length(snips[snips[,2]=="c/t",3]) ), type="h", col="red", lwd=2) ########## # Analyse de la composition en GC du chr 19 adaptée de seqinr ########## library(seqinr) choosebank() # pour lister toutes les bd choosebank("ensembl") #données de seq. des genomes d'ensembl banknamesocket #afficher les infos sur la bd Esembl query("mm", "sp=mus musculus")# selection du genome de la souris mm # Info sur l'objet de la requette mm$req # Infos sur les résultats de la requette frags_names= getname(mm$req) #Nom de tous les fragments résultats de la requette frags_lengths = getlength(mm$req) # Longueur de tous les fragments chr19 = frags_names[grep("mouse19", frags_names)] #tous les fragments du chromosme 19 chr19_lengths = frags_lengths[grep("mouse19", frags_names)] gfrag(chr19[2], 1, 1000) #pour récuperer les 1000 premières bases du 2 fragment du chromosome 19 n </ length(chr19) res </ rep(/1, 10 * n) i </ 1 f </ 1 for (frag in chr19) myseq </ gfrag(frag, 1, chr19_lengths[f]) for (w in seq(1, nchar(myseq), by = 10^5)) #fenetres disjointes de 10^5 bases res[i] </ GC(s2c(substr(myseq, start = w, stop = w + 10^5 / 1))) i </ i + 1
2008/06/18 Bio/Info2008.R 7 f </ f + 1 res </ res[res >= 0] res[res == 0] </ NA #Les fenêtres où il n'y a que des N renvoient 0 res </ 100 * res closebank() #save(res, file = "chr19.rdata") n </ length(res) xx </ seq_len(n)/10 # en Mb plot(xx, res, type = "l", las = 1, ylab = "Contenu en G+C [%]", main = "Isochores du chromosome 19 de la souris", xlab = "Position sur le chromosome [Mb]") breaks </ c(0, 37.5, 42.5, 47.5, 52.5, 100) #quelques niveaux de GC pour le découpage des données abline(h = breaks, lty = 3) lev </ cut(res, breaks = breaks, labels = c("darkblue", "blue", "yellow", "orange", "red"), ordered = T) segments(x0 = xx, y0 = min(res, na.rm = TRUE), x1 = xx, y1 = res,col = as.character(lev)) #Pour les segments contenant des NA (GC = 0) segments(x0 = xx[is.na(res)], y0 = min(res, na.rm = T), x1 = xx[is.na(res)], y1 = max(res, na.rm = T), col = "gray", lty=3) lines(xx, res)