{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# DU Bii - module 3: R and stats\n", "---\n", "## **Session 2: tutorial on packages**\n", "*Thursday 4th of March, 2021*\n", "\n", "teachers: Claire Vandiedonck & Magali Berland; helpers: Antoine Bridier-Nahmias, Yves Clément, Bruno Toupance, Jacques van Helden\n", "\n", "*Content of this tutorial:*\n", "\n", "- lister des paquets installés\n", "- utiliser un paquet installé utile en génomique\n", "- installer un paquet utile en génomique et l'utiliser\n", "\n", "L'exemple d'utilisation portera sur des variants génétiques et des sites de chromatine ouverte.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## **Before going further**\n", "\n", "
Caution:
\n", " 1. Create a new directory \"Rsession2\" in your home with a right click in the left-hand panel of the lab.
\n", " 2. Save a backup copy of this notebook in this folder : in the left-hand panel, right-click on this file and select \"Duplicate\" and add your name, e.g: \"tutorial_functions_vandiedonck.ipynb\" and move it to the proper folder
\n", "You can also make backups during the analysis. Don't forget to save your notebook regularly.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set your working directory and check it:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "setwd('/shared/home/cvandiedonck/RSession2') #change with your login!!!\n", "getwd() #change is visible" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Warning: you are strongly advised to run the cells in the indicated order. If you want to rerun cells above, you can just restart the kernel to start at 1 again.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " \n", " About jupyter notebooks:
\n", "\n", "- To add a new cell, click on the \"+\" icon in the toolbar above your notebook
\n", "- You can \"click and drag\" to move a cell up or down
\n", "- You choose the type of cell in the toolbar above your notebook:
\n", " - 'Code' to enter command lines to be executed
\n", " - 'Markdown' cells to add text, that can be formatted with some characters
\n", "- To execute a 'Code' cell, press SHIFT+ENTER or click on the \"play\" icon
\n", "- To display a 'Markdown' cell, press SHIFT+ENTER or click on the \"play\" icon
\n", "- To modify a 'Markdown'cell, double-click on it
\n", "
\n", "\n", " \n", "To make nice html reports with markdown: html visualization tool 1 or html visualization tool 2, to draw nice tables, and the Ultimate guide.
\n", "Further reading on JupyterLab notebooks: Jupyter Lab documentation.
\n", "
\n", " \n", " \n", "
\n", "\n", "__*=> About this jupyter notebook*__\n", "\n", "This a jupyter notebook in **R**, meaning that the commands you will enter or run in `Code` cells are directly understood by the server in the R language.\n", "
You could run the same commands in a Terminal or in RStudio. \n", "\n", "\n", "> In this tutorial, you will run one cell at a time.\n", "\n", " Do not hesitate to try other commands by adding other cells.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Lister les paquets installés\n", "---\n", "\n", "- identifier les répertoires, c'est à dire les `librairies` dans lesquels les paquets sont installés avec la function `.libPaths()`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ ".libPaths()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " \n", " Info:
\n", "A ce stade, un seul repertoire doit apparaitre: /shared/ifbstor1/software/miniconda/envs/r-4.0.2/lib/R/library.
Plus tard dans le tutorial, nous chargerons un nouveau paquet dans un repertoire personnel dans votre home /shared/ifbstor1/home/mylogin/R/x86_64-conda_cos6-linux-gnu-library/4.0\n", "
\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Combien de paquets sont installées dans ce(s) repertoire(s)?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "length(list.files(.libPaths()[1]))# modifier l'indice selon le repertoire souhaité" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- identifier la liste des paquets installés dans ce(s) répertoire(s).\n", "\n", "On pourrait utiliser la commande suivante:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "head(list.files(.libPaths()[2]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mais on peut récupérer plus d'information sur les versions et les repertoires avec la function `installed.packages()`. La fonction retournant un grand nombre d'informations, listons les avant d'en sélectionner les plus utiles." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(colnames(installed.packages()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Affichons les 1ère, 2ème et 3ème colonnes:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "head(installed.packages()[,c(1,2,3)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Identifions à présent quels paquets sont déjà chargés dans notre session" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sessionInfo()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Utilisons un paquet installé\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L’objectif de cette partie est d’utiliser le paquet `GenomicRanges` de ___Bioconductor___ afin de détecter des chevauchements entre une liste de SNPs et des sites d’H3K27ac (enhancers actifs).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1. Chargeons le paquet\n", "\n", "- Installer Bioconductor si ce n’est déjà fait\n", "\n", "L'execution conditionnelle ci-dessous premet de n'installer le paquet que s'il ne l'est pas encore. C'est ainsi que nous vous conseillons d'invoquer toutes les installations de paquets dans vos scripts afin de permettre une portabilité entre utilisateurs, en leur épargant la réinstallation de paquets qu'ils ont déjà." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if (!requireNamespace(\"BiocManager\"))\n", " install.packages(\"BiocManager\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vous pouvez à présent insatller GenomicRanges de la même façon!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if (!requireNamespace(\"GenomicRanges\"))\n", " BiocManager::install(\"GenomicRanges\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A présent chargez le paquet GenomicRanges dans votre session de R:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "library(GenomicRanges)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vérifiez quelle version est chargée:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sessionInfo()# vous noterez que l'installation de GenomicRanges a nécessite celle de IRanges" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2. Cherchez de la documentation sur ce paquet:\n", "\n", "- soit à https://www.bioconductor.org/packages/release/bioc/html/GenomicRanges.html\n", "- ou en consultant la vignette:\n", "`browseVignettes(\"GenomicRanges\")`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Warning. Le chargement de vignettes ne fonctionne pas dans les notebooks jupyter.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3. Importez les data:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Importez les données de SNPs et de sites d’acétylation (fichiers sur la page web ou dans `/shared/projects/dubii2021/trainers/module3/data/`)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "snps <- read.table(\"/shared/projects/dubii2021/trainers/module3/data/hgTables_SNPs.txt\", header = T, stringsAsFactors = F, fill = T)\n", "str(snps)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "h3k27ac <- read.table(\"/shared/projects/dubii2021/trainers/module3/data/hgTables_H3K27Ac.txt\", stringsAsFactors = F, skip = 1)\n", "str(h3k27ac)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Donnez un nom de colonnes au dataframe des cites d’acétylation (« chrom », « start », « end », « id »)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "names(h3k27ac) <- c(\"chrom\", \"start\", \"end\", \"id\")\n", "str(h3k27ac)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4. Utilisation de la fonction `makeGRangesFromDataFrame` du paquet **GenomicRanges**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Cette fonction va générer un objet de type GRanges. Regardez la documentation correspondante." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "?GRanges" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Générez des objets de type `GRanges` avec la function `makeGRangesFromDataFrame` du paquet **GenomicRanges** pour chacun des deux dataframes en ne gardant que les colonnes 2 à 7 pour les SNPs" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "snps_GR <- makeGRangesFromDataFrame(snps[,c(2:5,7)], keep.extra.columns = TRUE)\n", "snps_GR\n", "str(snps_GR)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "h3k27ac_GR <- makeGRangesFromDataFrame(h3k27ac, keep.extra.columns = TRUE)\n", "h3k27ac_GR\n", "str(h3k27ac_GR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si vous inspectez les deux objets, ils ont tous les deux 7 slots comme tout objet de type GenomicRanges" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Identifiez abvec la fonction `findOverlaps()` les chevauchements entre les deux datasets, c'es à dire entre les SNPs et les sites d'acétylation." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Find overlaps between SNPs and acetylation sites\n", "overlaps <- findOverlaps(h3k27ac_GR, snps_GR)\n", "overlaps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La commande suivante vous donne le nombre d'overlaps par élément, ici combien de SNPs sont trouvés pour chaque site d'acetylation (de 0 à 6 selon le site)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(countOverlaps(h3k27ac_GR, snps_GR))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vous pouvez générer et sauvergarder un sous-jeu des 18 sites d'actylation contenant au moins un SNP avec la commande suivante:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "h3k27ac_SNPs_GR <- subsetByOverlaps(h3k27ac_GR, snps_GR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Installons un paquet non installé et utilisons-le\n", "---\n", "\n", "Nous continuons l'exemple ci-dessus avec l'utilisation du package `biomaRt` de ***Bioconductor** pour connaître les gènes les plus proches de ces sites partagés." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- installation et chargement du paquet\n", "\n", "Il s'agit d'un paquet de Bioconductor, donc utilisez la fonction `BiocManager()` pour l'installer si vous avez une version de R >=3.5." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Warning. Dans beaucoup de tutoriels, vous trouvez encore l'installation de paquets de Bioconductor avec la fonction biocLite(). Cette méthode est obsolète pour les versions de R>=3.5=
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# installation et chargement de biomaRt:\n", "if (!requireNamespace(\"biomaRt\"))\n", " BiocManager::install(\"biomaRt\")\n", "library(biomaRt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Consultez la documentation de BioMart: https://bioconductor.org/packages/release/bioc/vignettes/biomaRt/inst/doc/biomaRt.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Quelles sont les bases de données interrogeables dans la base de donnees ensembl avec biomaRt ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "listMarts(host = \"www.ensembl.org\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Sélectionner à présent le dataset Homo Sapiens de la base de donnees Ensembl avec la fonction `useDataset()` ou directement `useMart()` :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ensembl <- useMart(\"ENSEMBL_MART_ENSEMBL\", host = \"www.ensembl.org\", dataset = \"hsapiens_gene_ensembl\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Combien y a-t- il de bases de datasets interrogeables dans cette base de donnees ?\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dim(listDatasets(ensembl))[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Combien y a-t- il de champs interrogeables dans la base de donnees ensembl Homo Sapiens ?\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "nrow(listAttributes(ensembl))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Identifier les genes à +/- 20 kb des sites d'actelylation contenant au moins un SNP:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "info <- data.frame(h3k27ac_SNPs_GR@seqnames@values, h3k27ac_SNPs_GR@ranges@start,\n", " h3k27ac_SNPs_GR@ranges@start + h3k27ac_SNPs_GR@ranges@width)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "str(info)\n", "names(info) <- c(\"chr\", \"start\", \"end\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mapgenes <- NULL\n", "for (i in 1:nrow(info)) {\n", " genes <-getBM(attributes = c(\"hgnc_symbol\", \"description\", \"ensembl_gene_id\",\"chromosome_name\",\n", " \"start_position\", \"end_position\", \"strand\"),\n", " filters = c(\"chromosome_name\", \"start\", \"end\"),\n", " values = list(gsub(\"chr\", \"\", info$chr[i]),info$start[i] - 10000, info$end[i] + 10000), mart = ensembl)\n", " genes$site <- paste0(info$chr[i], \":\", info$start[i], \"-\", info$end[i])\n", " mapgenes <- rbind(mapgenes, genes)\n", "}\n", "mapgenes[,c(8, 1:7)] # pour redoronner les colonnes et voir les resultats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Success: Well done! Vous savez maintenant installer des paquets, indetifier les librairies où ils sont installés et utilisez deux paquets emblématiques en génomique. \n", "
\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of course, you can improve your functions by adding warnings if the input files are not as expected, or by adding some documentation (start with annotations!)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Caution:
\n", " Don't forget to save you notebook and export a copy as an html file as well
\n", "- Open \"File\" in the Menu
\n", "- Select \"Export Notebook As\"
\n", "- Export notebook as HTML
\n", "- You can then open it in your browser even without being connected to the IFB Jupyter hub! \n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sessionInfo()" ] } ], "metadata": { "kernelspec": { "display_name": "R 4.0.2", "language": "R", "name": "r-4.0.2" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "4.0.2" }, "toc-showtags": true }, "nbformat": 4, "nbformat_minor": 4 }