R Script:Normal Text R Script:Symbol R Script:Identifier R Script
Transcription
R Script:Normal Text R Script:Symbol R Script:Identifier R Script
20080618 BioInfo2008.R 1 Typographical Conventions for R Script R R R R R Script:Normal Text Script:Identifier Script:Comment Script:Reserved Words Script:String Char R R R R R Script:Symbol Script:String Script:Assign Script:Error Script:Float R R R R R Script:Keyword Script:Headline Script:Control Structure Script:Operator 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.univEmontp2.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.univEmontp2.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 20080618 BioInfo2008.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 ####################################################################################### 20080618 BioInfo2008.R ############################ 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'equifré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) 3 20080618 BioInfo2008.R ################################################### ## 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 2p (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 loglikelihood 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") 4 20080618 BioInfo2008.R # 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 El", sep = " ") nb_lines = system(commande, intern = TRUE) commande = paste("cat", myfileName ,"| grep '^>' | wc El", 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 E 1, 2] = name data[cur_seq E 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; 5 20080618 BioInfo2008.R } # 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, "E",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(E1, 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 E 1))) i <# i + 1 } 6 20080618 } BioInfo2008.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)