From b83e0006eda1bfe197c4ba689861d9fed80db9dc Mon Sep 17 00:00:00 2001 From: Abby Vander Linden <11965371+avanlinden@users.noreply.github.com> Date: Fri, 14 Jul 2023 11:30:11 +0200 Subject: [PATCH 1/9] Update README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 41dbcac..1af46da 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,13 @@ - [Working with AD portal Data in R](https://sage-bionetworks.github.io/ADPortalWorkshops/5XFAD_data_R_tutorial.html) - [Working with AD portal Data in python](https://sage-bionetworks.github.io/ADPortalWorkshops/5XFADdata_python_tutorial.html) -- [Differential expression with DESeq2 in R](https://github.com/Sage-Bionetworks/ADPortalWorkshops/blob/main/Workshop2_DESeq.nb.html) +- [Differential expression with DESeq2 in R](https://github.com/Sage-Bionetworks/ADPortalWorkshops/blob/main/Workshop2_DESeq.html) ### Versions of the tutorials you can download and run interactively from RStudio or VSCode - -- [Differential expression with DESeq2 in R](https://github.com/Sage-Bionetworks/ADPortalWorkshops/blob/main/Workshop2_DESeq.nb.html) - +- [Quarto notebook - Working with AD portal Data in R](https://github.com/Sage-Bionetworks/ADPortalWorkshops/blob/main/5XFAD_data_R_tutorial.qmd) +- [Quarto notebook - Working with AD portal Data in python](https://github.com/Sage-Bionetworks/ADPortalWorkshops/blob/main/5XFADdata_python_tutorial.qmd) +- [R notebook - Differential expression with DESeq2 in R](https://github.com/Sage-Bionetworks/ADPortalWorkshops/blob/main/Workshop2_DESeq.nb.html) + ### Next upcoming workshop: July 14, 2023 at AAIC! [Synapse workshop project](https://www.synapse.org/#!Synapse:syn26165425/wiki/612752) From 3f4ae086881106eeadbe6d085757a05aed77dd31 Mon Sep 17 00:00:00 2001 From: Abby Vander Linden <11965371+avanlinden@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:19:19 -0700 Subject: [PATCH 2/9] rearrange libraries (see issue #4) --- 5XFAD_data_R_tutorial.qmd | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/5XFAD_data_R_tutorial.qmd b/5XFAD_data_R_tutorial.qmd index 340b2e1..f649c62 100644 --- a/5XFAD_data_R_tutorial.qmd +++ b/5XFAD_data_R_tutorial.qmd @@ -1,6 +1,6 @@ --- title: 'AD Knowledge Portal Workshop: Download and explore 5XFAD mouse data in RStudio' -author: "Laura Heath & Abby Vander Linden, Sage Bionetworks" +author: "Abby Vander Linden & Laura Heath, Sage Bionetworks" date: "`r Sys.Date()`" format: html: @@ -34,25 +34,19 @@ If you haven't already, install `synapser` (the [Synapse R client](https://r-doc install.packages("synapser", repos = c("http://ran.synapse.org", "http://cran.fhcrc.org")) # install tidyverse if you don't already have it -install.packages("tidyverse") -``` - -We will also use the BioconductoR package manager to install `biomaRt`, which will help us with gene count data later. - -```{r install-biomaRt, eval = FALSE} - -if (!requireNamespace("BiocManager", quietly = TRUE)) - install.packages("BiocManager") - -BiocManager::install("biomaRt") +install.packages("dplyr", "purrr", "readr", "lubridate", "stringr", "tibble") ``` Load libraries ```{r load-libraries, message=FALSE, warning=FALSE} library(synapser) -library(tidyverse) -library(biomaRt) +library(dplyr) +library(purrr) +library(readr) +library(lubridate) +library(stringr) +library(tibble) ``` ### Login to Synapse @@ -458,6 +452,18 @@ counts %>% OPTIONAL: Transform the ensemblIDs in the matrix to common gene names, using the R package `biomaRt` (note: must specify to use the mouse database, although the two genes in the 5XFAD model we identified above are humanized and won't be translated by the program). +For this option, use the BioconductoR package manager to install `biomaRt`. + +```{r install-biomaRt, eval = FALSE} + +if (!requireNamespace("BiocManager", quietly = TRUE)) + install.packages("BiocManager") + +BiocManager::install("biomaRt") + +library(biomaRt) +``` + **The next two code chunks will not automatically execute in this notebook because they can take a long time -- the code is included if you'd like to try this on your own.** We will use the two custom functions below to convert ensemblIDs to gene names: From e6331c93eb3a09fa199c5780118a75cccf1f9c92 Mon Sep 17 00:00:00 2001 From: Abby Vander Linden <11965371+avanlinden@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:49:58 -0700 Subject: [PATCH 3/9] ignore files and outputs --- .gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 4744ff4..96e07b0 100644 --- a/.gitignore +++ b/.gitignore @@ -29,9 +29,9 @@ vignettes/*.pdf # R project *.Rproj # downloaded files -code-tutorials/files/* -files/* -DESeq2_tutorial_R/outputs/* +code-tutorials/files/ +files/ +DESeq2_tutorial_R/outputs/ .DS_Store /.quarto/ From 284b1ab695d380cfb354eb31039aa191b5c4246a Mon Sep 17 00:00:00 2001 From: Abby Vander Linden <11965371+avanlinden@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:50:13 -0700 Subject: [PATCH 4/9] update download instructions --- 5XFAD_data_R_tutorial.qmd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/5XFAD_data_R_tutorial.qmd b/5XFAD_data_R_tutorial.qmd index f649c62..5713535 100644 --- a/5XFAD_data_R_tutorial.qmd +++ b/5XFAD_data_R_tutorial.qmd @@ -31,7 +31,7 @@ If you haven't already, install `synapser` (the [Synapse R client](https://r-doc ```{r install-synapser, eval = FALSE} # install synapser -install.packages("synapser", repos = c("http://ran.synapse.org", "http://cran.fhcrc.org")) +install.packages("synapser", repos = c("http://ran.synapse.org")) # install tidyverse if you don't already have it install.packages("dplyr", "purrr", "readr", "lubridate", "stringr", "tibble") @@ -39,7 +39,7 @@ install.packages("dplyr", "purrr", "readr", "lubridate", "stringr", "tibble") Load libraries -```{r load-libraries, message=FALSE, warning=FALSE} +```{r load-libraries, message=FALSE, warning=TRUE} library(synapser) library(dplyr) library(purrr) @@ -57,7 +57,7 @@ Next, you will need to log in to your Synapse account. If you are logged into the [Synapse](https://www.synapse.org/) web browser, `synapser` will automatically use your login credentials to log you in during your R session! All you have to do is: -```{r synlogin, results = "hide"} +```{r synlogin, include = FALSE} synLogin() ``` @@ -89,7 +89,7 @@ This filters the table to a single file. In the "Id" column for this `htseqcount ![](images/Screenshot%202023-05-07%20at%2011.10.31%20AM.png){width="448"} -We can then use that synID to download the file. +We can then use that synID to download the file. Some system about the file and its storage location within Synapse is printed to the R console when we call `synGet`. ```{r single-synGet, results = "hide"} From b42bb04310e54c9fd1cfd2f4ccd61ce4b6cbb5ed Mon Sep 17 00:00:00 2001 From: Abby Vander Linden <11965371+avanlinden@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:48:51 -0700 Subject: [PATCH 5/9] replace magrittr pipes with native pipe --- 5XFAD_data_R_tutorial.qmd | 75 +++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/5XFAD_data_R_tutorial.qmd b/5XFAD_data_R_tutorial.qmd index 5713535..2e2c28e 100644 --- a/5XFAD_data_R_tutorial.qmd +++ b/5XFAD_data_R_tutorial.qmd @@ -152,18 +152,12 @@ We can see from the `download_table` we got during the bulk download step that w ```{r explore-download-table} # -download_table %>% +download_table |> dplyr::select(name, metadataType, assay) ``` We are only interested in RNAseq data, so we will only read in the individual, biospecimen, and RNAseq assay metadata files. -```{r read-data-files, message=FALSE, warning=FALSE} -# counts matrix -counts <- read_tsv("files/htseqcounts_5XFAD.txt", show_col_types = FALSE) - -``` - ##### A note on file versions! All files in the AD Portal are versioned, meaning that if the file represented by a particular synID changes, a new version will be created. You can access a specific versions by using the `version` argument in `synGet()`. This will come in handy here, because the Jax.IU.Pitt_5XFAD study recently made some changes to their individual metadata file that included an inadvertent error. While our curators sort out that error, we will use a a previous version of this file (version 3) to ensure that our metadata joins properly. More info on versions in the AD Portal and the Synapse platform can be found [here](https://help.synapse.org/docs/Versioning-Files.2667708547.html). @@ -184,7 +178,7 @@ ind_meta_object$properties$isLatestVersion Now we can read all the metadata files in to R as data frames. -```{r} +```{r read-metadata-files} #individual metadata ind_meta <- read_csv("files/Jax.IU.Pitt_5XFAD_individual_metadata.csv", show_col_types = FALSE) @@ -200,12 +194,17 @@ Let's examine the data and metadata files a bit before we begin our analyses. #### Counts data +```{r read-data-files, message=FALSE, warning=FALSE} +# counts matrix +counts <- read_tsv("files/htseqcounts_5XFAD.txt", show_col_types = FALSE) +``` + ```{r view-counts} # Calling a tibble object will print the first ten rows in a nice tidy output; doing the same for a base R dataframe will print the whole thing until it runs out of memory. If you want to inspect a large dataframe, use `head(df)` head(counts) ``` -The data file has a column of ENSEMBL gene ids and then a bunch of columns with count data, where the column headers correspond to the specimenIDs. These specimenIDs should all be in the RNAseq assay metadata file, so let's check. +The counts data file has a column of ENSEMBL gene ids and then a bunch of columns with count data, where the column headers correspond to the specimenIDs. These specimenIDs should all be in the RNAseq assay metadata file, so let's check. ```{r view-assay} # what does the RNAseq assay metadata look like? @@ -267,12 +266,12 @@ distinct(ind_meta, genotype) #### Joining metadata -We use the three-file structure for our metadata because it allows us to store metadata for each study in a tidy format. Every line in the assay and biospecimen files represents a unique specimen, and every line in the individual file represents a unique individual. This means the files can be easily joined by specimenID and individualID to get all levels of metadata that apply to a particular data file. We will use the `left_join()` function from the `dplyr` package, and the `%>%` operator from the `magrittr` package. *If you are unfamiliar with the pipe, think of it as a shorthand for "take this (the preceding object) and do that (the subsequent command)". See [here](https://magrittr.tidyverse.org/) for more info on piping in R.* +We use the three-file structure for our metadata because it allows us to store metadata for each study in a tidy format. Every line in the assay and biospecimen files represents a unique specimen, and every line in the individual file represents a unique individual. This means the files can be easily joined by specimenID and individualID to get all levels of metadata that apply to a particular data file. We will use the `left_join()` function from the `dplyr` package, and the base R pipe operator `|>`. *If you are unfamiliar with the pipe, think of it as a shorthand for "take this (the preceding object) and do that (the subsequent command)". See [here](https://r4ds.hadley.nz/data-transform.html#sec-the-pipe) for more info on piping in R.* ```{r join-metadata} # join all the rows in the assay metadata that have a match in the biospecimen metadata -joined_meta <- rna_meta %>% #start with the rnaseq assay metadata - left_join(bio_meta, by = "specimenID") %>% #join rows from biospecimen that match specimenID +joined_meta <- rna_meta |> #start with the rnaseq assay metadata + left_join(bio_meta, by = "specimenID") |> #join rows from biospecimen that match specimenID left_join(ind_meta, by = "individualID") # join rows from individual that match individualID joined_meta @@ -307,7 +306,7 @@ The file annotations let us see which study the file is associated with (Jax.IU. ```{r join-annotations-to-metadata} # find records belonging to the individual this file maps to in our joined metadata -joined_meta %>% +joined_meta |> filter(individualID == fastq_annotations$individualID[[1]]) ``` @@ -344,7 +343,7 @@ Once you've downloaded all the files in the `id` column, you can link those file fastq <- synGet(random_fastq, downloadFile = FALSE) # filter the annotations table to rows that match the fastq filename -annotations_table %>% +annotations_table |> filter(name == fastq$properties$name) ``` @@ -356,8 +355,8 @@ If we look at the processed data files in the table of 5XFAD RNAseq file annotat ```{r filter-multispecimen-files} # -annotations_table %>% - filter(fileFormat == "txt") %>% +annotations_table |> + filter(fileFormat == "txt") |> dplyr::select(name, individualID, specimenID, isMultiSpecimen) ``` @@ -365,10 +364,10 @@ The multispecimen file should contain a row or column of specimenIDs that corres ```{r join-multispecimen-metadata} # In this example, we take a slice of the counts data to reduce computation, transpose it so that each row represents a single specimen, and then join it to the joined metadata by the specimenID -counts %>% - slice_head(n = 5) %>% - t() %>% - as_tibble(rownames = "specimenID") %>% +counts |> + slice_head(n = 5) |> + t() |> + as_tibble(rownames = "specimenID") |> left_join(joined_meta, by = "specimenID") ``` @@ -403,10 +402,10 @@ The MODEL-AD individual mouse metadata contains columns with birth date and deat library(lubridate) # convert columns of strings to month-date-year format -joined_meta_time <- joined_meta %>% - mutate(dateBirth = mdy(dateBirth), dateDeath = mdy(dateDeath)) %>% +joined_meta_time <- joined_meta |> + mutate(dateBirth = mdy(dateBirth), dateDeath = mdy(dateDeath)) |> # create a new column that subtracts dateBirth from dateDeath in days, then divide by 30 to get months - mutate(timepoint = as.numeric(difftime(dateDeath, dateBirth, units ="days"))/30) %>% + mutate(timepoint = as.numeric(difftime(dateDeath, dateBirth, units ="days"))/30) |> # convert numeric ages to timepoint categories mutate(timepoint = case_when(timepoint > 10 ~ "12 mo", timepoint < 10 & timepoint > 5 ~ "6 mo", @@ -417,8 +416,8 @@ We now have balanced samples across sex, genotype, and age: ```{r group-metadata-by-covars} # check that the timepoint column looks ok -joined_meta_time %>% - group_by(sex, genotype, timepoint) %>% +joined_meta_time |> + group_by(sex, genotype, timepoint) |> count() ``` @@ -428,7 +427,7 @@ To reduce the width of the dataframe, we will subset only the columns that conta ```{r subset-covars} # many packages have a "select" function that masks dplyr so we have to specify -covars <- joined_meta_time %>% +covars <- joined_meta_time |> dplyr::select(individualID, specimenID, sex, genotype, timepoint) # check the result @@ -441,7 +440,7 @@ Return to the gene counts matrix we read in earlier. ```{r check-non-mouse-genes} # check how many gene_ids are NOT from the mouse genome by searching for the string "MUS" (as in Mus musculus) in the gene_id column -counts %>% +counts |> filter(!str_detect(gene_id, "MUS")) ``` @@ -500,7 +499,7 @@ Call the `Make.Gene.Symb()` function to add a new column with short gene names t ```{r convert-gene-ids, eval=FALSE, include=FALSE} # use the mutate function from dplyr -named_counts <- counts %>% +named_counts <- counts |> mutate(gene_name = Make.Gene.Symb(gene_id)) ``` @@ -533,9 +532,9 @@ named_counts[1, "gene_name"] <- "PSEN1" named_counts[2, "gene_name"] <- "APP" #make all gene names unique and remove unneeded column -named_counts <- named_counts %>% - mutate(gene_name = make.unique(gene_name)) %>% - dplyr::select(-gene_id) %>% +named_counts <- named_counts |> + mutate(gene_name = make.unique(gene_name)) |> + dplyr::select(-gene_id) |> column_to_rownames(var = "gene_name") ``` @@ -546,9 +545,9 @@ Now we can transpose the dataframe so that each row contains count data cross al ```{r transpose-counts} # -counts_tposed <- named_counts %>% - t() %>% #transposing forces the df to a matrix - as_tibble(rownames = "specimenID") %>% #reconvert to tibble and specify rownames +counts_tposed <- named_counts |> + t() |> #transposing forces the df to a matrix + as_tibble(rownames = "specimenID") |> #reconvert to tibble and specify rownames left_join(covars, by = "specimenID") #join covariates by specimenID ``` @@ -573,7 +572,7 @@ Use ggplot to plot gene counts for each specimen by age, sex, and genotype. library(ggplot2) #Look at Trem2 levels -g <- counts_tposed %>% +g <- counts_tposed |> ggplot(aes(x=timepoint, y=Trem2, color=genotype)) + geom_boxplot() + geom_point(position=position_jitterdodge()) + @@ -586,7 +585,7 @@ Examine any gene of interest by setting the y argument in the `ggplot(aes()` map ```{r plot-Cst7} # -g <- counts_tposed %>% +g <- counts_tposed |> ggplot(aes(x=timepoint, y=Cst7, color=genotype)) + geom_boxplot() + geom_point(position=position_jitterdodge()) + @@ -599,7 +598,7 @@ Ex: `y = Apoe` ```{r plot-Apoe} # -g <- counts_tposed %>% +g <- counts_tposed |> ggplot(aes(x=timepoint, y=Apoe, color=genotype)) + geom_boxplot() + geom_point(position=position_jitterdodge()) + @@ -612,7 +611,7 @@ Ex: `y = Kirrel2` ```{r plot-Kirrel2} # -g <- counts_tposed %>% +g <- counts_tposed |> ggplot(aes(x=timepoint, y=Kirrel2, color=genotype)) + geom_boxplot() + geom_point(position=position_jitterdodge()) + From 5c92f6867438b52d58036cfc2ab21f3c0e1bd2f0 Mon Sep 17 00:00:00 2001 From: Abby Vander Linden <11965371+avanlinden@users.noreply.github.com> Date: Tue, 2 Apr 2024 17:17:20 -0700 Subject: [PATCH 6/9] change up plots for some variety --- 5XFAD_data_R_tutorial.qmd | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/5XFAD_data_R_tutorial.qmd b/5XFAD_data_R_tutorial.qmd index 2e2c28e..06c71f9 100644 --- a/5XFAD_data_R_tutorial.qmd +++ b/5XFAD_data_R_tutorial.qmd @@ -507,9 +507,7 @@ named_counts <- counts |> For this demonstration, instead of running biomaRt, which can be unreliable at times and take a long time to render, we will append a dataframe to our counts matrix with short gene names already translated -```{r} -#ensembl_to_gene <- subset(named_counts, select=c(gene_id, gene_name)) -#write.csv(ensembl_to_gene, file="ensembl_translation_key.csv", row.names=FALSE) +```{r read-preconverted-ensembl-counts} ensembl_to_gene <- read.csv(file="ensembl_translation_key.csv") named_counts <- dplyr::left_join(counts, ensembl_to_gene, by="gene_id") @@ -567,13 +565,13 @@ counts_tposed$timepoint <- factor(counts_tposed$timepoint, levels=c("4 mo","6 mo Use ggplot to plot gene counts for each specimen by age, sex, and genotype. -```{r plot-trem2} +```{r plot-app} # load ggplot2 library(ggplot2) -#Look at Trem2 levels +#Look at APP levels -- this model is the 5X FAD mutant, so we expect it to be high! g <- counts_tposed |> - ggplot(aes(x=timepoint, y=Trem2, color=genotype)) + + ggplot(aes(x=timepoint, y=APP, color=genotype)) + geom_boxplot() + geom_point(position=position_jitterdodge()) + facet_wrap(~sex) @@ -581,12 +579,12 @@ g <- counts_tposed |> g ``` -Examine any gene of interest by setting the y argument in the `ggplot(aes()` mapping equal to the gene name. Ex: `y = Cst7` +Examine any gene of interest by setting the y argument in the `ggplot(aes()` mapping equal to the gene name. Ex: `y = Trem2` -```{r plot-Cst7} +```{r plot-Trem2} # g <- counts_tposed |> - ggplot(aes(x=timepoint, y=Cst7, color=genotype)) + + ggplot(aes(x=timepoint, y=Trem2, color=genotype)) + geom_boxplot() + geom_point(position=position_jitterdodge()) + facet_wrap(~sex) @@ -607,15 +605,4 @@ g <- counts_tposed |> g ``` -Ex: `y = Kirrel2` - -```{r plot-Kirrel2} -# -g <- counts_tposed |> - ggplot(aes(x=timepoint, y=Kirrel2, color=genotype)) + - geom_boxplot() + - geom_point(position=position_jitterdodge()) + - facet_wrap(~sex) - -g -``` +\-\-- From cb1f9ccaa92d61ccba0728fc6ddd221b692f3ccb Mon Sep 17 00:00:00 2001 From: Abby Vander Linden <11965371+avanlinden@users.noreply.github.com> Date: Tue, 2 Apr 2024 17:19:03 -0700 Subject: [PATCH 7/9] add logo --- 5XFAD_data_R_tutorial.qmd | 2 ++ images/ADKP_logo.png | Bin 0 -> 12221 bytes 2 files changed, 2 insertions(+) create mode 100644 images/ADKP_logo.png diff --git a/5XFAD_data_R_tutorial.qmd b/5XFAD_data_R_tutorial.qmd index 06c71f9..3baf5a7 100644 --- a/5XFAD_data_R_tutorial.qmd +++ b/5XFAD_data_R_tutorial.qmd @@ -606,3 +606,5 @@ g ``` \-\-- + +![](images/ADKP_logo.png){width="236"} diff --git a/images/ADKP_logo.png b/images/ADKP_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..36f981f0fedc2cd45d1ec80ac640fc3c51993c0b GIT binary patch literal 12221 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 M2}SW5QRCqM1C9PfF#rGn literal 0 HcmV?d00001 From 13969e894ca3a1128227aff468fb0e8be0c2a050 Mon Sep 17 00:00:00 2001 From: Abby Vander Linden <11965371+avanlinden@users.noreply.github.com> Date: Tue, 2 Apr 2024 17:24:41 -0700 Subject: [PATCH 8/9] render updated tutorial --- docs/5XFAD_data_R_tutorial.html | 237 +++++++++--------- .../figure-html/plot-Apoe-1.png | Bin 86311 -> 85209 bytes .../figure-html/plot-app-1.png | Bin 0 -> 81203 bytes .../figure-html/plot-trem2-1.png | Bin 78367 -> 79359 bytes docs/5XFADdata_python_tutorial.html | 4 +- docs/images/ADKP_logo.png | Bin 0 -> 12221 bytes docs/search.json | 8 +- 7 files changed, 120 insertions(+), 129 deletions(-) create mode 100644 docs/5XFAD_data_R_tutorial_files/figure-html/plot-app-1.png create mode 100644 docs/images/ADKP_logo.png diff --git a/docs/5XFAD_data_R_tutorial.html b/docs/5XFAD_data_R_tutorial.html index 0b2825f..d29e311 100644 --- a/docs/5XFAD_data_R_tutorial.html +++ b/docs/5XFAD_data_R_tutorial.html @@ -6,8 +6,8 @@ - - + + AD Knowledge Portal Workshop: Download and explore 5XFAD mouse data in RStudio