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)

Documents pareils