A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes.
The 18 matches · 1 of them tie a paragraph to a whole file, not to given lines: a weak match, whose lines are not tinted
- [1] § Results › 3BTMs enable studying AD-relevant perturbations and drug responses in human brain cells ↔ analysis_3BTM_rhapsody/analysis_3BTM_downstream.Rmd, lines 6167–6187 · score 0.85 · apoptotic signaling pathways, MHC class, protein folding, negative regulation, neuron projection, stress
- [2] § Methods › scRNA-seq › Downstream analysis of the BD Rhapsody datasets ↔ install_bioc.R, the whole file · a weak match · score 0.76 · ComplexHeatmap, UCell, clusterProfiler, fgsea, MAST, seq
- [3] § Methods › scRNA-seq › Downstream analysis of the 10X dataset ↔ analysis_3BTM_10x/Figure5_scRNA_microglia_KI.Rmd, lines 787–822 · score 0.76 · downregulated DEGs, min.pct, FindMarkers, WT Resting, MAST, DEAs
- [4] § Methods › scRNA-seq › Downstream analysis of the BD Rhapsody datasets ↔ analysis_3BTM_10x/Figure5_scRNA_microglia_KI.Rmd, lines 82–219 · score 0.72 · FindMarkers, VlnPlot, ribosomal, Seurat, downstream, UMIs
- [5] § Methods › scRNA-seq › Downstream analysis of the BD Rhapsody datasets ↔ analysis_3BTM_rhapsody/analysis_3BTM_downstream.Rmd, lines 5642–5690 · score 0.72 · latent.vars, FindMarkers, Sample_univoque, MAST, Rhapsody, threshold
- [6] § Methods › scRNA-seq › Downstream analysis of the 10X dataset ↔ analysis_3BTM_10x/Figure3_scRNA_microglia_maturation_clean.Rmd, lines 246–299 · score 0.66 · k.weight, IntegrateData, CCA, transform, Seurat, Downstream
- [7] § Results › iMGs in AD-modeling 3BTMs recapitulate disease-related changes ↔ analysis_3BTM_10x/Figure5_scRNA_microglia_KI.Rmd, lines 1238–1261 · score 0.64 · AD risk genes, KI cluster, WT resting, BLNK, SORL1, TREM2
- [8] § Methods › scRNA-seq › Downstream analysis of the 10X dataset ↔ analysis_3BTM_10x/Figure5_scRNA_microglia_KI.Rmd, lines 82–219 · score 0.64 · standard Seurat, workflow, ribosomal, downstream, UMIs, mitochondrial
- [9] § Results › 3BTMs enable studying AD-relevant perturbations and drug responses in human brain cells ↔ analysis_3BTM_rhapsody/analysis_3BTM_downstream.Rmd, lines 6267–6333 · score 0.63 · MHC protein complex, innate immune response, GO term, phagocytosis, aducanumab, signal
- [10] § Results › iMGs, iNEs and iAS show reproducible, AD-related changes across cell lines ↔ analysis_3BTM_rhapsody/analysis_3BTM_downstream.Rmd, lines 6023–6049 · score 0.59 · unfolded protein response, endoplasmic reticulum, neurons, GO
- [11] § Results › iMGs mature in 3BTMs and adopt transcriptomic signatures similar to the human brain ↔ analysis_3BTM_10x/Figure3_scRNA_microglia_maturation_clean.Rmd, lines 2023–2060 · score 0.56 · adult human, signatures derived, scRNA, fetal, maturation, seq
- [12] § Results › Brain cells in 3BTMs show increased maturity, homeostasis and functionality compared to 2D co-cultures ↔ analysis_3BTM_3Dvs2D/analysis_3BTM_3Dvs2D_minimal.Rmd, lines 3259–3282 · score 0.56 · ATP1A2, SLC2A1, MT3
- [13] § Methods › scRNA-seq › Downstream analysis of the 10X dataset ↔ analysis_3BTM_10x/Figure3_scRNA_microglia_maturation_clean.Rmd, lines 595–616 · score 0.56 · ALDH1A1, SOX11, TYROBP, AQP4, canonical, downstream
- [14] § Results › CRISPR–Cas9-mediated insertion of synergistic APP mutations to model AD ↔ analysis_3BTM_10x/Figure5_scRNA_microglia_KI.Rmd, lines 241–274 · score 0.53 · causing mutations, stem cells, iPSC, APP, knocked, cultured
- [15] § Results › iMGs in AD-modeling 3BTMs recapitulate disease-related changes ↔ analysis_3BTM_10x/Figure5_scRNA_microglia_KI.Rmd, lines 1238–1261 · score 0.52 · AD risk genes, WT resting, Cell state, Violin, Figure 5, subset
- [16] § Results › Brain cells in 3BTMs show increased maturity, homeostasis and functionality compared to 2D co-cultures ↔ analysis_3BTM_rhapsody/analysis_3BTM_downstream.Rmd, lines 6167–6187 · score 0.52 · synaptic signaling, synapse organization, pathways, regulation, protein
- [17] § Results › iMGs, iNEs and iAS show reproducible, AD-related changes across cell lines ↔ analysis_3BTM_3Dvs2D/analysis_3BTM_3Dvs2D_minimal.Rmd, lines 2372–2397 · score 0.51 · BCL11B, mid, GABAergic, layer, SATB2, cortical
- [18] § Results › Brain cells in 3BTMs show increased maturity, homeostasis and functionality compared to 2D co-cultures ↔ analysis_3BTM_3Dvs2D/analysis_3BTM_3Dvs2D_minimal.Rmd, lines 2886–2912 · score 0.51 · synaptic signaling, synapse organization, regulation, protein
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
R Markdown · 1,404 lines · 50 KB · no license · 6 matches
- ---
- title: "Characterization of the KI 3months model"
- author: ""
- date: "`r format(Sys.time(), '%d %B, %Y')`"
- output:
- html_document:
- code_download: yes
- df_print: kable
- theme: united
- toc: yes
- toc_depth: 6
- toc_float: yes
- output: html_document
- editor_options:
- chunk_output_type: inline
- ---
- # Load packages
- ```{r}
- library(Seurat)
- library(SeuratDisk)
- library(ggplot2)
- library(SingleR)
- library(biomaRt)
- library(org.Hs.eg.db)
- library(clusterProfiler)
- library(RColorBrewer)
- library(ggpubr)
- library(reshape2)
- library(org.Hs.eg.db)
- library(tidyverse)
- library(gridExtra)
- library(ComplexHeatmap)
- library(readxl)
- library(scCustomize)
- library(data.table)
- library(ggVennDiagram)
- library(slingshot)
- library(ggplotify)
- library(patchwork)
- library(AUCell)
- library(ggVennDiagram)
- library(nichenetr)
- library(viridis)
- library(dittoSeq)
- library(ggvolc)
- library(cowplot)
- library(reticulate)
- library(sceasy)
- library(MAST)
- library(UpSetR)
- library(sceasy)
- library(UCell)
- library(PCAtools)
- library(scIntegrationMetrics)
- library(topGO)
- library(harmony)
- library(genesorteR)
- library(ggVolcano)
- library(speckle)
- library(monocle3)
- library(monocle)
- library(SeuratWrappers)
- library(SingleCellExperiment)
- library(Nebulosa)
- library(org.Mm.eg.db)
- BiocManager::install("GeneOverlap")
- library("GeneOverlap")
- devtools::install_github("mw201608/SuperExactTest")
- library(SuperExactTest)
- sess.i <- sessionInfo()
- ```
- # Define custom functions
- ```{r}
- # barplot of DEGs from filtered FindMarkers output
- degs_barplot <- function(degs_df){
- h <- degs_df[degs_df$Regulation != "none",]
- f_u <- table(h$Regulation)
- f_uh <- data.frame(status = names(f_u),
- total = as.vector(f_u))
- degs_bp <- ggplot(f_uh, aes(x = status, y = total, fill = status))+
- geom_bar(stat= "identity", width = 0.9)+
- geom_text(aes(label = total), vjust= -0.2, size = 6)+
- theme_classic()+
- theme(aspect.ratio = 1.9,
- legend.position = 'none',
- axis.text.x = element_text(size=20, angle=0),
- axis.text.y = element_text(size=20, angle=0),
- axis.title = element_text(size = 20))+
- scale_fill_manual(values = c("#00798c","#cc0000"))+
- ylab("number of DEGs")+
- xlab(label= NULL)
- return(degs_bp)
- }
- # Filtering FindMarkers output to get up and down regulated genes
- up_down_degs <- function(degs_df){
- degs.list <- degs_df
- degs.list$genes <- rownames(degs_df)
- degs.list$Significance <- "none"
- degs.list$Significance <- ifelse(degs.list$p_val_adj < 0.01, "yes", degs.list$Significance)
- degs.list$Significance <- ifelse(degs.list$p_val_adj > 0.01, "no", degs.list$Significance)
- degs.list$Regulation <- "none"
- degs.list$Regulation <- ifelse(degs.list$avg_log2FC > 0.25 & degs.list$p_val_adj < 0.01, "up", degs.list$Regulation)
- degs.list$Regulation <- ifelse(degs.list$avg_log2FC < -0.25 & degs.list$p_val_adj < 0.01, "down", degs.list$Regulation)
- degs.list <- subset(degs.list, degs.list$Regulation != "none")
- return(degs.list)
- }
- # seuratv3 integration wrapper
- integr_wrap <- function(sobject.list, nfeatures, k_anchor, k_filter, k_score ){
- # select features that are repeatedly variable across datasets for integration
- features <- SelectIntegrationFeatures(object.list = sobject.list, nfeatures = 2000)
- features.to.integrate <- intersect(rownames(sobject.list[[2]]), rownames(sobject.list[[1]]))
- uglia.anchors <- FindIntegrationAnchors(object.list = sobject.list, anchor.features = features, k.anchor = k_anchor, k.filter = k_filter, k.score = k_score)
- # this command creates an 'integrated' data assay
- uglia.combined <- IntegrateData(anchorset = uglia.anchors, features.to.integrate = features.to.integrate)
- # specify that we will perform downstream analysis on the corrected data note that the
- # original unmodified data still resides in the 'RNA' assay
- DefaultAssay(uglia.combined) <- "integrated"
- # Run the standard workflow for visualization and clustering
- uglia.combined <- ScaleData(uglia.combined, verbose = FALSE)
- uglia.combined <- RunPCA(uglia.combined, npcs = 30, verbose = FALSE)
- uglia.combined <- RunUMAP(uglia.combined, reduction = "pca", dims = 1:30)
- uglia.combined <- FindNeighbors(uglia.combined, reduction = "pca", dims = 1:30)
- uglia.combined <- FindClusters(uglia.combined, resolution = 0.5)
- return(uglia.combined)
- }
- # dotplot to display GO enrichment results
- ego_dp <- function(df){
- plot <- df %>%
- arrange(Description) %>%
- mutate(status = factor(status, levels = c("up", "down"))) %>%
- ggplot(aes(x = status, y = Description, color = `qvalue`, size = Count)) +
- geom_point() +
- scale_color_gradient(low = "#006f62", high = "#b6d7a8") +
- ylab("") +
- xlab("")
- return(plot)
- }
- # QC plots
- plot_QC <- function(seurat){
- #Features (genes)
- n_feat_cl <- VlnPlot(seurat,
- features = c("nFeature_RNA"),
- pt.size = 0) +
- geom_hline(yintercept = 250, linetype = "dashed", colour = "red")+
- ylim(500, 10000)+
- NoLegend()
- #Counts (UMIs)
- n_count_cl <- VlnPlot(seurat,
- features = c("nCount_RNA"),
- pt.size = 0)+
- geom_hline(yintercept = 15000, linetype = "dashed", colour = "red")+
- ylim(500, 80000)+
- NoLegend()
- #Percent of mitochondrial reads
- # mito cutoff 10%
- mito_pt_cl <- VlnPlot(seurat,
- features = c("percent.mt"),
- pt.size = 0) +
- geom_hline(yintercept = 7, linetype = "dashed", colour = "red")+
- ylim(0, 40)+
- NoLegend()
- #Percent of ribosomal reads
- seurat[["percent.rb"]] <- PercentageFeatureSet(seurat, pattern = "^RP[SL]")
- ribo_pt_cl <- VlnPlot(seurat,
- features = c("percent.rb"),
- pt.size = 0) +
- geom_hline(yintercept = 25, linetype = "dashed", colour = "red")+
- ylim(0, 40)+
- NoLegend()
- plots <- list(n_feat_cl, n_count_cl, mito_pt_cl, ribo_pt_cl)
- print(plots)
- }
- # standard seurat pre-processing wrapper
- standard_preprocessing <- function(sobj){
- sobj <- NormalizeData(sobj, normalization.method = "LogNormalize", scale.factor = 10000)
- sobj <- FindVariableFeatures(sobj, selection.method = "vst", nfeatures = 2000)
- all.genes <- rownames(sobj)
- sobj <- ScaleData(sobj, features = all.genes_mancuso)
- sobj <- RunPCA(sobj, features = VariableFeatures(object = sobj))
- sobj <- FindNeighbors(sobj, reduction = "pca",dims = 1:50)
- sobj <- FindClusters(sobj, resolution = 0.5)
- sobj <- RunUMAP(sobj, reduction = "pca",dims = 1:50, seed.use = 42)
- return(sobj)
- }
- ```
- # Define colors
- ```{r}
- pal <- c("#E1BE6A","#004949","#009292","#ff6db6","#ffb6db",
- "#490092","#006ddb","#b66dff","#6db6ff","#b6dbff",
- "#920000","#924900","#db6d00","#24ff24","#ffff6d")
- pal_viridis <- viridis(n = 10, option = "D")
- sobj_3mo_pal <- c("WT Resting" = "#228b22",
- "KI Cluster 2" = "#ffb90f",
- "KI Cluster 1" = "#eae4b7",
- "Chemokine 3mo" = "#74d600",
- "Glycolytic 3mo" = "#b0bf1a",
- "Proliferative 3mo" = "#b2ffff")
- ```
- #_____________________________________________________________________________________________________________________________________________________
- #DATASET description
- #_____________________________________________________________________________________________________________________________________________________
- All 10X samples derive from human stem cell (iPSC-) derived 3D cultures made of cortical neurons (NE), astrocytes (AS) and microglia (MG). The cell types were differentiated separately, then aggregated into a spheroid-like culture, and grown for 1 month (1mo) or 3 months (3mo). For the experiment, wildtype (WT) and knock-in (KI) cultures carrying three familial Alzheimer’s disease-causing mutations in the APP gene are analyzed. The experiment was performed as indicated below:
- o Sample 3: WT 1mo (pooled 2 biological replicates with hashtags)
- o Sample 4: WT 3mo (pooled 2 biological replicates with hashtags)
- o Sample 5: KI 3mo (pooled 2 biological replicates with hashtags)
- #Load Data
- The code chunks relative to the loading of external objects(.csv, .xlsx) containing signature gene lists have been silenced. When loading the minimal environment it won't be necessary to load seurat objects and running pre-processing and differential expression aanlysis code chunks.
- ```{r}
- #load main seurat objects
- seurat_objects_figure6 <- readRDS("/path/seurat_figure6.rds")
- #Load environment:
- #In this environment are included:
- # - main seurat objects produced
- # - all signatures used for scoring
- # - differential analysis code
- #load("/path/figure6_env.RData")
- #extract each object from list (if environment is not loaded)
- #sobj_sub <- seurat_objects_figure6[[1]] # The code for pre-processing and subsetting this object are reported in Figure 3 script
- #sobj_mg <- seurat_objects_figure6[[2]] #seurat object filtered to have only microglia cells
- #sobj_3mo <- seurat_objects_figure6[[3]] # subset seurat object for 3 months old WT and KI neurocultures
- ```
- # Pre-processing
- ```{r}
- #Normalization
- sobj_mg <- NormalizeData(sobj_mg, normalization.method = "LogNormalize", scale.factor = 10000)
- #Variable features exploration
- sobj_mg <- FindVariableFeatures(sobj_mg, selection.method = "vst", nfeatures = 2000)
- # Identify the 10 most highly variable genes
- top10 <- head(VariableFeatures(sobj_mg), 10)
- #Scaling
- all.genes <- rownames(sobj_mg)
- sobj_mg <- ScaleData(sobj_mg, features = all.genes)
- #Dimensional reduction
- sobj_mg <- RunPCA(sobj_mg, features = VariableFeatures(object = sobj_mg))
- print(sobj_mg[["pca"]], dims = 1:5, nfeatures = 5)
- DimPlot(sobj_mg, reduction = "pca")
- #determine informative PCs
- ElbowPlot(sobj_mg)
- ```
- ```{r}
- set.seed(42)
- # Find clusters
- sobj_mg <- FindNeighbors(object=sobj_mg, dims=1:10)
- # Find clusters for several resolutions and choose appropriate one for downstream analysis
- sobj_mg_cl_tr <- FindClusters(object = sobj_mg, resolution = c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0))
- # Plot and save several resolutions
- sobj_mg_cl_tr <- RunUMAP(object=sobj_mg_cl_tr, dims=1:10, seed.use = 42)
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.0.1", label=T, seed = 42) + ggtitle("Res 0.1")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.0.2", label=T, seed = 42) + ggtitle("Res 0.2")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.0.3", label=T, seed = 42) + ggtitle("Res 0.3")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.0.4", label=T, seed = 42) + ggtitle("Res 0.4")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.0.5", label=T, seed = 42) + ggtitle("Res 0.5")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.0.6", label=T, seed = 42) + ggtitle("Res 0.6")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.0.8", label=T, seed = 42) + ggtitle("Res 0.8")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.1", label=T, seed = 42) + ggtitle("Res 1.0")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.1.2", label=T, seed = 42) + ggtitle("Res 1.2")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.1.4", label=T, seed = 42) + ggtitle("Res 1.4")
- DimPlot(object=sobj_mg_cl_tr, reduction="umap", group.by="RNA_snn_res.0.7", label=T, seed = 42) + ggtitle("Res 0.7")
- #Here the resolution to be used was chosen empirically to avoid over-clustering. In case of re-analysis of published dataset the resolution was chosen accordingly to the information on the original publication if mentioned with the aim of replicating the published data
- ```
- ```{r}
- #Find clusters with chosen resolution
- sobj_mg <- FindClusters(object = sobj_mg, resolution=0.5)
- remove(sobj_mg_cl_tr) #removing object to limit memory usage
- ```
- ```{r}
- set.seed(42)
- #UMAP
- sobj_mg <- RunUMAP(sobj_mg, dims = 1:10, seed.use = 42)
- #plots
- DimPlot(sobj_mg, reduction = "umap", cols = pal, seed = 1) + theme(aspect.ratio=1)
- DimPlot(sobj_mg, split.by = "condition", cols = pal, seed = 1) + theme(aspect.ratio=1)
- #total number of cells and number of cells per cluster
- table(Idents(sobj_mg))
- ncol(sobj_mg)
- ```
- ```{r, fig.height=7, fig.width=20}
- #UMAP plot splitted by replicate
- DimPlot(sobj_mg, split.by = "orig.ident", cols = pal, seed = 1) + theme(aspect.ratio=1)
- ```
- # QC per cluster (only microglia)
- ```{r, fig.height=7, fig.width=20}
- #QC plots per condition
- Idents(sobj_mg) <- "condition"
- sobj_mg_QC_c <-plot_QC(sobj_mg)
- #QC plots per cluster
- Idents(sobj_mg) <- "seurat_clusters"
- sobj_mg_QC_cl <-plot_QC(sobj_mg)
- ```
- ## Subset to exclude sample enriched clusters
- some clusters may be sample specific and so not really informative in the downstream analysis. Here we excluded one cluster with such characteristics to avoid its inclusion in the downstream process.
- The seurat object was subject to pre-processing following the subset
- ```{r}
- set.seed(42)
- #subset
- clusters_to_keep <- c("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
- sobj_mg_filt <- subset(sobj_mg, subset = seurat_clusters %in% clusters_to_keep)
- #Normalization
- sobj_mg_filt <- NormalizeData(sobj_mg_filt, normalization.method = "LogNormalize", scale.factor = 10000)
- #Variable features exploration
- sobj_mg_filt <- FindVariableFeatures(sobj_mg_filt, selection.method = "vst", nfeatures = 2000)
- # Identify the 10 most highly variable genes
- top10 <- head(VariableFeatures(sobj_mg_filt), 10)
- #Scaling
- all.genes <- rownames(sobj_mg_filt)
- sobj_mg_filt <- ScaleData(sobj_mg_filt, features = all.genes)
- #Dimensional reduction
- sobj_mg_filt <- RunPCA(sobj_mg_filt, features = VariableFeatures(object = sobj_mg_filt))
- print(sobj_mg_filt[["pca"]], dims = 1:5, nfeatures = 5)
- DimPlot(sobj_mg_filt, reduction = "pca")
- #determine informative PCs
- ElbowPlot(sobj_mg_filt)
- # Find clusters
- sobj_mg_filt <- FindNeighbors(object=sobj_mg_filt, dims=1:10)
- # Explore clustering resolutions
- sobj_mg_filt_t <- FindClusters(object = sobj_mg_filt, resolution = c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0))
- # Plot
- sobj_mg_filt_t <- RunUMAP(object=sobj_mg_filt_t, dims=1:10, seed.use =42)
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.0.2", label=T,seed = 42) + ggtitle("Res 0.1")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.0.2", label=T, seed = 42) + ggtitle("Res 0.2")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.0.2", label=T, seed = 42) + ggtitle("Res 0.3")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.0.4", label=T, seed = 42) + ggtitle("Res 0.4")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.0.5", label=T, seed = 42) + ggtitle("Res 0.5")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.0.6", label=T, seed = 42) + ggtitle("Res 0.6")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.0.8", label=T, seed = 42) + ggtitle("Res 0.8")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.1", label=T, seed = 42) + ggtitle("Res 1.0")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.1.2", label=T, seed = 42) + ggtitle("Res 1.2")
- DimPlot(object=sobj_mg_filt_t, reduction="umap", group.by="RNA_snn_res.1.4", label=T, seed = 42) + ggtitle("Res 1.4")
- #Here the resolution to be used was chosen empirically to avoid over-clustering. In case of re-analysis of published dataset the resolution was chosen accordingly to the information on the original publication if mentioned with the aim of replicating the published data
- ```
- ```{r}
- set.seed(42)
- # Find clusters this time using the good resolution. Old resolution data is automatically overwritten.
- sobj_mg_filt <- FindClusters(object = sobj_mg_filt, resolution=0.5)
- #UMAP
- sobj_mg_filt <- RunUMAP(sobj_mg_filt, dims = 1:10, seed.use = 42)
- DimPlot(sobj_mg_filt, reduction = "umap", cols = pal, seed = 1) + theme(aspect.ratio=1)
- DimPlot(sobj_mg_filt, split.by = "condition", cols = pal, seed = 1) + theme(aspect.ratio=1)
- remove(sobj_mg_filt_t) #remove objects to limit memory usage
- ```
- ```{r, fig.height=7, fig.width=20}
- DimPlot(sobj_mg_filt, split.by = "orig.ident", cols = pal, seed = 1) + theme(aspect.ratio=1)
- ```
- # Cell type specific markers (feature plots)
- Check for the presence of only microglia in the subset.
- ```{r, fig.height=8, fig.width=8}
- tyrobp <- FeaturePlot(sobj_mg_filt, features = c("TYROBP")) + theme_void()
- sox <- FeaturePlot(sobj_mg_filt, features = c("SOX11")) + theme(aspect.ratio=1)
- astro <- FeaturePlot(sobj_mg_filt, features = c("ALDH1A1")) + theme(aspect.ratio=1)
- grid.arrange(sox, astro)
- grid.arrange(tyrobp)
- ```
- # Identify cluster biomarkers
- To identify different cell states in the microglia data the top 10 differentially expressed genes per cluster were calculated and their averaged expression shown in a dotplot
- ```{r, fig.height= 6, fig.width= 18}
- #set idents to clusters
- Idents(sobj_mg_filt) <- "seurat_clusters"
- #Find cluster enriched markers
- s.markers <- FindAllMarkers(sobj_mg_filt, assay = "RNA", only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
- #select top 10 markers per cluster to plot
- s.markers %>%
- group_by(cluster) %>%
- top_n(n = 10, wt = avg_log2FC) -> top10_s
- ```
- #___________________________________________________________________________________________________________________________
- # SUBSET FOR 3mo (KI, WT)
- #_____________________________________________________________________________________________________________________________________________________________________
- # Subset for 3mo cells
- If loading directly the sobj_3mo object at the beginning of the script running the subsetting and pre-processing code chunks is not necessary
- ```{r}
- #subset by time
- Idents(sobj_mg_filt) <- "time"
- sobj_3mo <- subset(sobj_mg_filt, idents= c("3mo"))
- #set and check subset idents
- Idents(sobj_3mo) <- "genotype"
- levels(Idents(sobj_3mo))
- ```
- ## Pre-processing
- ```{r}
- #Normalization
- sobj_3mo <- NormalizeData(sobj_3mo, normalization.method = "LogNormalize", scale.factor = 10000)
- #Find Variable features
- sobj_3mo <- FindVariableFeatures(sobj_3mo, selection.method = "vst", nfeatures = 2000)
- # Identify the 10 most highly variable genes
- top10 <- head(VariableFeatures(sobj_3mo), 10)
- plot1 <- VariableFeaturePlot(sobj_3mo)
- LabelPoints(plot = plot1, points = top10, repel = TRUE)
- ## Scaling
- all.genes <- rownames(sobj_3mo)
- sobj_3mo <- ScaleData(sobj_3mo, features = all.genes)
- ## PCA
- sobj_3mo <- RunPCA(sobj_3mo, features = VariableFeatures(object = sobj_3mo))
- print(sobj_3mo[["pca"]], dims = 1:5, nfeatures = 5)
- DimPlot(sobj_3mo, reduction = "pca")
- #determine more informative principal components
- ElbowPlot(sobj_3mo)
- ```
- ```{r}
- ## Clustering
- set.seed(42)
- # Find clusters
- sobj_3mo <- FindNeighbors(object = sobj_3mo, dims=1:10)
- #Plot different clustering resolutions
- sobj_3mo_t <- FindClusters(object = sobj_3mo, resolution = c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0), verbose = F)
- # Plots
- sobj_3mo_t <- RunUMAP(object= sobj_3mo_t, dims=1:10, seed.use = 42)
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.0.1", label=T, seed = 42) + ggtitle("Res 0.1")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.0.2", label=T, seed = 42) + ggtitle("Res 0.2")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.0.3", label=T, seed = 42) + ggtitle("Res 0.3")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.0.4", label=T, seed = 42) + ggtitle("Res 0.4")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.0.5", label=T, seed = 42) + ggtitle("Res 0.5")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.0.6", label=T, seed = 42) + ggtitle("Res 0.6")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.0.8", label=T, seed = 42) + ggtitle("Res 0.8")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.1", label=T, seed = 42) + ggtitle("Res 1.0")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.1.2", label=T, seed = 42) + ggtitle("Res 1.2")
- DimPlot(object=sobj_3mo_t, reduction="umap", group.by="RNA_snn_res.1.4", label=T, seed = 42) + ggtitle("Res 1.4")
- ```
- ```{r}
- ## UMAP
- set.seed(42)
- #remove object to reduce memory usage
- rm(sobj_3mo_t)
- #choose dimensional reduction to use
- sobj_3mo <- FindNeighbors(object = sobj_3mo, dims=1:10)
- sobj_3mo <- FindClusters(object = sobj_3mo, resolution = c(0.4), verbose = F)
- sobj_3mo <- RunUMAP(object= sobj_3mo, dims=1:10)
- #reset idents
- Idents(sobj_3mo) <- "seurat_clusters"
- ```
- ```{r}
- #plot
- DimPlot(sobj_3mo, split.by = "condition", cols = pal, seed = 1) + theme(aspect.ratio=1)
- ```
- ```{r, fig.height=5, fig.width=10}
- #plot UMAP splitted by sample
- DimPlot(sobj_3mo, split.by = "orig.ident", cols = pal, seed = 1) + theme(aspect.ratio=1)
- ```
- # Characterization of the clusters
- ## Top markers
- ```{r}
- #set idents
- Idents(sobj_3mo) <- "seurat_clusters"
- #Find cluster enriched markers
- s3mo.markers <- FindAllMarkers(sobj_3mo, assay = "RNA", only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
- #select top 10 markers per cluster to plot
- s3mo.markers %>%
- group_by(cluster) %>%
- top_n(n = 10, wt = avg_log2FC) -> top10_s3mo
- ```
- ```{r, fig.height= 6, fig.width= 18}
- #extract genes to plot
- to_plot_s3mo <- unique(top10_s3mo$gene)
- #dotplot
- plot_mpc_s3mo <- DotPlot(sobj_3mo, features = to_plot_s3mo, group.by = "seurat_clusters", cols = c("RdBu"))+
- theme(axis.text.x = element_text(angle = 90))
- #cell number per cluster
- table(Idents(sobj_3mo))
- ```
- ## Functional enrichments in specific clusters
- ## Cell states annotation
- The annotation was given looking at the markers per cluster and in accordance with the annotation of the Figure 3 UMAP
- ```{r}
- Idents(sobj_3mo) <- "seurat_clusters"
- cell_states <- c( "0"="WT Resting",
- "1"="KI Cluster 1",
- "2"="KI Cluster 2",
- "3"="Chemokine 3mo",
- "4"="Glycolytic 3mo",
- "5"="Proliferative 3mo")
- names(cell_states) <- levels(sobj_3mo)
- sobj_3mo <- RenameIdents(sobj_3mo, cell_states)
- sobj_3mo$cell_states <- Idents(sobj_3mo)
- ```
- # QC per cluster
- ```{r, fig.height=7, fig.width=10}
- #QC plots per cluster
- #set idents
- Idents(sobj_3mo) <- "seurat_clusters"
- #plots
- sobj_3mo_QC_cl <- plot_QC(sobj_3mo)
- a <- sobj_3mo_QC_cl[[1]]
- b <- sobj_3mo_QC_cl[[2]]
- c <- sobj_3mo_QC_cl[[3]]
- d <- sobj_3mo_QC_cl[[4]]
- plot_grid(a, b, c, d)
- ```
- ```{r}
- #here I give names to metadata columns to store percentage of mitochondrial and ribosomal genes in the object before subsetting. The information will be retained in all subsets of the object
- #sobj_sub[["percent.mt"]] <- PercentageFeatureSet(sobj_sub, pattern = "^MT-")
- #sobj_sub[["percent.rb"]] <- PercentageFeatureSet(sobj_sub, pattern = "^RP[SL]")
- #here I visualize such parameters in all the clusters of the 3mo subset
- mito <- VlnPlot(object = sobj_3mo, features = "percent.mt", group.by = "seurat_clusters", pt.size = 0)+ theme(legend.position="none") + ggtitle("Percent of mitochondrial counts") + ylab("% of all counts") + xlab("")+ylim(0, 40)+geom_hline(yintercept = 10)
- ribo <- VlnPlot(object = sobj_3mo, features = "percent.rb", group.by = "seurat_clusters", pt.size = 0)+ theme(legend.position="none") + ggtitle("Percent of ribosomal counts") + ylab("% of all counts") + xlab("")+ylim(0, 40)+geom_hline(yintercept = 20)
- mito+ribo
- ```
- #______________________________________________________________________________
- # Figure
- Umap plots for the 3 mo subset
- ```{r}
- Idents(sobj_3mo) <- "cell_states"
- umap_3mo <-DimPlot(sobj_3mo, reduction = "umap", group.by = "cell_states", pt.size = 0.5,
- cols = c(sobj_3mo_pal))+
- theme(aspect.ratio = 1,
- legend.text = element_text(size = 15),
- axis.line = element_blank(),
- axis.title = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- legend.key.size = unit(0.5, "cm"),
- legend.title = element_text(color = "black", size = 18, face = 2),)+
- guides(color = guide_legend(override.aes = list(size = 6)))+
- ggtitle(element_blank())
- umap_3mo
- ```
- # Figure
- UMAP plot colored by genotype
- ```{r}
- #Highlight plots
- levels(Idents(sobj_3mo))
- Idents(sobj_3mo) <- "genotype"
- WT <- WhichCells(sobj_3mo, idents = c("WT"))
- cells_wt <- list("WT" = WT)
- highlight_wt <- Cell_Highlight_Plot(seurat_object = sobj_3mo, cells_highlight = cells_wt, highlight_color = c("#004D00"))+
- theme(aspect.ratio = 1,
- legend.text = element_text(size = 15),
- axis.line = element_blank(),
- axis.title = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- legend.key.size = unit(0.5, "cm"),
- legend.title = element_text(color = "black", size = 18, face = 2))+
- guides(color = guide_legend(override.aes = list(size = 6)))
- highlight_wt
- KI<- WhichCells(sobj_3mo, idents = c("KI"))
- cells_ki <- list("KI" = KI)
- highlight_ki <- Cell_Highlight_Plot(seurat_object = sobj_3mo, cells_highlight = cells_ki, highlight_color = c("#c99005"))+
- theme(aspect.ratio = 1,
- legend.text = element_text(size = 15),
- axis.line = element_blank(),
- axis.title = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- legend.key.size = unit(0.5, "cm"),
- legend.title = element_text(color = "black", size = 18, face = 2))+
- guides(color = guide_legend(override.aes = list(size = 6)))
- highlight_ki
- split_3mo_umap<- plot_grid(highlight_wt, highlight_ki, ncol= 2)
- split_3mo_umap
- ```
- # Figure
- Cell proportions
- ```{r}
- #adding replicate information to the metadata
- levels(as.factor([email hidden]$orig.ident))
- sobj_3mo$replicate <- ifelse([email hidden]$orig.ident == "JK211112_J2_WT_T1", "J1WT1", ifelse(
- [email hidden]$orig.ident == "JK211112_J2_WT_T2", "J1WT2", ifelse(
- [email hidden]$orig.ident == "JK211112_J3_KI_T1", "J3KI1", ifelse(
- [email hidden]$orig.ident == "JK211112_J3_KI_T2", "J3KI2", ""
- )
- )
- ))
- levels(as.factor([email hidden]$replicate))
- #DA
- propeller_3mo <- propeller(clusters = sobj_3mo$cell_states, sample = sobj_3mo$replicate, group = sobj_3mo$condition)
- # Plot cell type proportions
- propeller_prop_3mo <- plotCellTypeProps(clusters=sobj_3mo$cell_states, sample=sobj_3mo$genotype)
- ```
- ```{r}
- #barplot
- KI_cell_props <- propeller_prop_3mo+
- scale_fill_manual(values = c("WT Resting" = "#228b22",
- "KI Cluster 2" = "#ffb90f",
- "KI Cluster 1" = "#eae4b7",
- "Chemokine 3mo" = "#74d600",
- "Glycolytic 3mo" = "#b0bf1a",
- "Proliferative 3mo" = "#b2ffff"))+
- xlab("")+
- ylab("Frequency")+
- scale_x_discrete(limits =c("WT", "KI"))+
- theme(aspect.ratio = 1.5,
- panel.background = element_blank(),
- axis.line = element_line(colour = "black", linewidth = 0.5),
- axis.text.x = element_text(face = "bold"),
- axis.title.y = element_text(face = "bold"))
- KI_cell_props
- ```
- # Figure
- QC per cluster
- ```{r, fig.height=7, fig.width=10}
- #QC plots per cluster
- Idents(sobj_3mo) <- "cell_states"
- plot_grid(a, b, c, d)
- ```
- #Figure
- ```{r}
- Idents(sobj_3mo) <- "cell_states"
- #order sample
- sobj_3mo$sample <- ifelse([email hidden]$orig.ident == "JK211112_J2_WT_T1", "WT rep1", ifelse(
- [email hidden]$orig.ident == "JK211112_J2_WT_T2", "WT rep2", ifelse(
- [email hidden]$orig.ident == "JK211112_J3_KI_T1", "KI rep1", ifelse(
- [email hidden]$orig.ident == "JK211112_J3_KI_T2", "KI rep2", ""
- )
- )
- ))
- umap.3mo.sample <- DimPlot(sobj_3mo, reduction = "umap", group.by = "cell_states", split.by = "sample", pt.size = 0.5, cols = c(sobj_3mo_pal), ncol = 2)+
- theme(aspect.ratio = 1,
- legend.text = element_text(size = 15),
- axis.line = element_blank(),
- axis.title = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- legend.key.size = unit(0.5, "cm"),
- legend.title = element_text(color = "black", size = 18, face = 2),)+
- guides(color = guide_legend(override.aes = list(size = 6)))+
- ggtitle(element_blank())
- umap.3mo.sample
- ```
- #Figure
- ```{r, fig.height= 6, fig.width= 18}
- plot_mpc_s3mo
- ```
- #______________________________________________________________________________
- # DEA
- ## Cluster-wise comparison
- ## KI Cluster 2 vs WT resting
- ```{r}
- set.seed(42)
- #set and check idents
- Idents(sobj_3mo) <- "cell_states"
- levels(Idents(sobj_3mo))
- #subset the object to have only the clusters interested in the comparison
- sobj_3mo_sub1 <- subset(sobj_3mo, idents = c("KI Cluster 2", "WT Resting"))
- #assess differentially expressed genes with MAST
- ki.c2.wt.dea <- FindMarkers(sobj_3mo_sub1, min.pct = 0.25, logfc.threshold = 0, ident.1 = "KI Cluster 2", ident.2 = "WT Resting", test.use= "MAST")
- #add gene names to the output dataframe
- ki.c2.wt.dea$genes <- rownames(ki.c2.wt.dea)
- #select statistically significant genes with p.adjust < 0.01 and log2FC >< 0.25
- ki.c2.wt.dea_filt <- up_down_degs(ki.c2.wt.dea)
- #determination of markers to plot
- #select upregulated degs
- up_degs_ki.c2.wt.dea <- dplyr::filter(ki.c2.wt.dea_filt, Regulation == "up")
- #order in function of log2FC
- up_degs_ki.c2.wt.dea_ord <- dplyr::arrange(up_degs_ki.c2.wt.dea, desc(avg_log2FC))
- #subset for top 20 genes to display
- top20_up_degs_fc_ord_ki.c2.wt.dea <- up_degs_ki.c2.wt.dea_ord[1:20, ]
- #select downregulated degs
- dn_degs_ki.c2.wt.dea <- dplyr::filter(ki.c2.wt.dea_filt, Regulation == "down")
- #order in function of log2FC
- dn_degs_ki.c2.wt.dea_ord <- dplyr::arrange(dn_degs_ki.c2.wt.dea, avg_log2FC)
- #subset for top 20 genes to display
- top20_dn_degs_fc_ord_ki.c2.wt.dea <- dn_degs_ki.c2.wt.dea_ord[1:20, ]
- ```
- ## KI Cluster 1 vs WT resting
- ```{r}
- set.seed(42)
- #set and check idents
- Idents(sobj_3mo) <- "cell_states"
- levels(Idents(sobj_3mo))
- #subset the object to have only the clusters interested in the comparison
- sobj_3mo_sub2<- subset(sobj_3mo, idents = c("KI Cluster 1", "WT Resting"))
- #assess differentially expressed genes with MAST
- ki.c1.wt.dea <- FindMarkers(sobj_3mo_sub2, min.pct = 0.25, logfc.threshold = 0, ident.1 = "KI Cluster 1", ident.2 = "WT Resting", test.use= "MAST")
- ki.c1.wt.dea$genes <- rownames(ki.c1.wt.dea)
- #filter for statistically significant genes with p.adjust < 0.01 and log2FC >< 0.25
- ki.c1.wt.dea_filt <- up_down_degs(ki.c1.wt.dea)
- #determination of markers to plot
- up_degs_ki.c1.wt.dea <- dplyr::filter(ki.c1.wt.dea_filt, Regulation == "up")
- up_degs_ki.c1.wt.dea_ord <- dplyr::arrange(up_degs_ki.c1.wt.dea, desc(avg_log2FC))
- top20_up_degs_fc_ord_ki.c1.wt.dea <- up_degs_ki.c1.wt.dea_ord[1:20, ]
- dn_degs_ki.c1.wt.dea <- dplyr::filter(ki.c1.wt.dea_filt, Regulation == "down")
- dn_degs_ki.c1.wt.dea_ord <- dplyr::arrange(dn_degs_ki.c1.wt.dea, avg_log2FC)
- top20_dn_degs_fc_ord_ki.c1.wt.dea <- dn_degs_ki.c1.wt.dea_ord[1:20, ]
- ```
- ## Union of upregulated genes in KI clusters when compared with WT Resting
- ```{r}
- #filter for upregulated genes in KI Cluster 2
- up_ki.c2vswt_all <- subset(ki.c2.wt.dea_filt, Regulation == "up")
- #fiilter for upregulated genes in KI Cluster 1
- up_ki.c1vswt_all <- subset(ki.c1.wt.dea_filt, Regulation == "up")
- #union of upregulated genes in KI Cluster 1 and 2
- up_kivswt_union <- unique(c(up_ki.c2vswt_all$genes, up_ki.c1vswt_all$genes))
- #union of all DEGs in KI Cluster 1 and 2
- all_kivswt_union <- unique(c(ki.c2.wt.dea_filt$genes, ki.c1.wt.dea_filt$genes))
- ```
- # GO enrichment
- ## KI Cluster 2 vs WT resting
- ```{r}
- ## Define universe for GO enrichment
- univers <- unique(rownames(sobj_3mo@assays[["RNA"]]@counts))
- # Perform enrichment analysis for up-regulated genes
- ego_up <- enrichGO(gene = up_ki.c2vswt_all$genes,
- OrgDb = org.Hs.eg.db,
- keyType = "SYMBOL",
- ont = "BP",
- pvalueCutoff = 0.05,
- pAdjustMethod = "BH",
- universe = univers,
- qvalueCutoff = 0.2,
- minGSSize = 10,
- maxGSSize = 500,
- readable = FALSE)
- #add information to enrich GO result to later merge results for enriched terms relative to up- and downregulated genes
- ego_up_res_cmplt <- ego_up@result
- ego_up_res_cmplt$status <- "up"
- # Subset down-regulated genes
- dn_genes <- subset(ki.c2.wt.dea_filt, Regulation == "down")
- # Perform enrichment analysis for down-regulated genes
- ego_down <- enrichGO(gene = dn_genes$genes,
- OrgDb = org.Hs.eg.db,
- keyType = "SYMBOL",
- ont = "BP",
- pvalueCutoff = 0.05,
- pAdjustMethod = "BH",
- universe = univers,
- qvalueCutoff = 0.2,
- minGSSize = 10,
- maxGSSize = 500,
- readable = FALSE)
- #add information to enrich GO result to later merge results for enriched terms relative to up- and downregulated genes
- ego_down_res_cmplt <- ego_down@result
- ego_down_res_cmplt$status <- "down"
- # Combine the results and filter for the most relevant ones
- ego_combined_cmplt_ki.c2 <- dplyr::bind_rows(ego_down_res_cmplt, ego_up_res_cmplt)
- # filter for statistically significant enriched terms
- ego_combined_ki.c2 <- dplyr::filter(ego_combined_cmplt_ki.c2, qvalue < 0.2)
- ```
- ## KI Cluster 1 vs WT resting
- ```{r}
- # Define a function to perform the go enrichment analysis and generate the dot plot
- # Subset up-regulated genes
- up_genes_ki.c1 <- subset(ki.c1.wt.dea_filt, Regulation == "up")
- # Perform enrichment analysis for up-regulated genes
- ego_up_ki.c1 <- enrichGO(gene = up_genes_ki.c1$genes,
- OrgDb = org.Hs.eg.db,
- keyType = "SYMBOL",
- ont = "BP",
- pvalueCutoff = 0.05,
- pAdjustMethod = "BH",
- universe = univers,
- qvalueCutoff = 0.2,
- minGSSize = 10,
- maxGSSize = 500,
- readable = FALSE)
- ego_up_res_cmplt_ki.c1 <- ego_up_ki.c1@result
- ego_up_res_cmplt_ki.c1$status <- "up"
- # Subset up-regulated genes
- dn_genes_ki.c1 <- subset(ki.c1.wt.dea_filt, Regulation == "down")
- # Perform enrichment analysis for down-regulated genes
- ego_down_ki.c1 <- enrichGO(gene = dn_genes_ki.c1$genes,
- OrgDb = org.Hs.eg.db,
- keyType = "SYMBOL",
- ont = "BP",
- pvalueCutoff = 0.05,
- pAdjustMethod = "BH",
- universe = univers,
- qvalueCutoff = 0.2,
- minGSSize = 10,
- maxGSSize = 500,
- readable = FALSE)
- ego_down_res_cmplt_ki.c1 <- ego_down_ki.c1@result
- ego_down_res_cmplt_ki.c1$status <- "down"
- # Combine the results
- ego_combined_cmplt_ki.c1 <- dplyr::bind_rows(ego_down_res_cmplt_ki.c1, ego_up_res_cmplt_ki.c1)
- ego_combined_ki.c1 <- dplyr::filter(ego_combined_cmplt_ki.c1, qvalue < 0.2)
- ```
- #______________________________________________________________________________
- # Figure
- ## DEGs between KI Cluster 2 and WT resting
- ## Highlight plots
- ```{r}
- #Highlight plots
- levels(Idents(sobj_3mo))
- Idents(sobj_3mo) <- "cell_states"
- WT <- WhichCells(sobj_3mo, idents = c("WT Resting"))
- ki.c2 <- WhichCells(sobj_3mo, idents = c("KI Cluster 2"))
- cells_wtki.c2 <- list("WT" = WT,
- "KI Cluster 2" = ki.c2)
- highlight_ki.c2 <- Cell_Highlight_Plot(seurat_object = sobj_3mo, cells_highlight = cells_wtki.c2, highlight_color = c("#228b22", "#ffb90f"))+
- theme(aspect.ratio = 1,
- legend.text = element_text(size = 15),
- axis.line = element_blank(),
- axis.title = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- legend.key.size = unit(0.5, "cm"),
- legend.title = element_text(color = "black", size = 18, face = 2),
- legend.position.inside = c(0.65 ,0.25))+
- guides(color = guide_legend(override.aes = list(size = 6)))
- highlight_ki.c2
- ```
- ```{r, fig.height=4, fig.width=8}
- #input dataframe for barplot of DEGs
- ki.c2.wt.degs.count <- data.frame(status = names(table(ki.c2.wt.dea_filt$Regulation)),
- total = as.vector(table(ki.c2.wt.dea_filt$Regulation)))
- #barplot
- ki.c2.wt.dea_bp <- ggplot(ki.c2.wt.degs.count, aes(x = status, y = total ,fill = status))+
- geom_bar(stat= "identity", width = 0.9)+
- scale_fill_manual(values = c("#00798c","#cc0000"))+
- geom_text(aes(label = total), vjust= -0.2, size = 6, hjust = 1)+
- coord_flip()+
- theme_classic()+
- theme(aspect.ratio = 0.5,
- legend.position = 'none',
- axis.text.x = element_text(size=20, angle=0),
- axis.text.y = element_text(size=20, angle=0),
- axis.title = element_text(size = 20),
- axis.line = element_line(linewidth = 1.5))+
- scale_x_discrete(labels = c("up" = "KI Cluster 2 vs WT Resting up",
- "down" = "KI Cluster 2 vs WT Resting down"))+
- ylab("number of DEGs")+
- xlab(label= NULL)
- #number of cells in the respective clusters
- table(Idents(sobj_3mo_sub1))
- ki.c2.wt.dea_bp
- ```
- #Figure
- ## DEGs heatmap
- ```{r, fig.height=7, fig.width=15}
- # create vector with the top 20 degs
- ki2wt_markers_to_plot <- dplyr::bind_rows(top20_up_degs_fc_ord_ki.c2.wt.dea, top20_dn_degs_fc_ord_ki.c2.wt.dea)
- ki2wt_markers_to_plot_vec <- ki2wt_markers_to_plot$gene
- ```
- ```{r, fig.height= 10, fig.width=5}
- Idents(sobj_3mo_sub1) <- factor(Idents(sobj_3mo_sub1),
- levels = c("WT Resting", "KI Cluster 2"))
- #heatmap of top 20 DEGs expressed between two time points (assessed with MAST)
- [email hidden]$HM <- Idents(sobj_3mo_sub1)
- wtki2_heat <- DoHeatmap(sobj_3mo_sub1, features = ki2wt_markers_to_plot_vec, size = 4,
- angle = 45, group.by = "HM", draw.lines = T, raster = FALSE)+
- scale_fill_gradientn(colors = c("blue", "white", "red"))
- wtki2_heat
- ```
- #Figure
- ## GO dotplot
- ```{r, fig.width=9, fig.height=3.5}
- #split in up and down to select non redundant terms more easily
- up_ki.ki2 <- subset(ego_combined_ki.c2, status== "up")
- dn_ki.ki2 <- subset(ego_combined_ki.c2, status== "down")
- #selection of non redundant terms
- selected_got_ki.c2vswt0 <- subset(ego_combined_ki.c2, Description %in% c("humoral immune response", "immune response-regulating cell surface receptor signaling pathway", "regulation of myeloid leukocyte differentiation", "regulation of chemotaxis", "acute inflammatory response", "regulation of neuron death", "antigen processing and presentation of peptide antigen", "MHC class II protein complex assembly", "peptide antigen assembly with MHC protein complex"))
- #modify aesthetics
- selected_got_ki.c2vswt0$Description <- factor(selected_got_ki.c2vswt0$Description, levels = unique(c("humoral immune response", "immune response-regulating cell surface receptor signaling pathway", "regulation of myeloid leukocyte differentiation", "regulation of chemotaxis", "acute inflammatory response", "regulation of neuron death", "antigen processing and presentation of peptide antigen", "MHC class II protein complex assembly", "peptide antigen assembly with MHC protein complex")))
- #dotplot
- ki.c2.wt_goe_sel <- ego_dp(selected_got_ki.c2vswt0)
- #modify aesthetics
- ki.c2.wt_goe_sel+
- scale_color_gradient(low ="#6a329f", high = "#cd99e7")+
- theme(axis.text.x = element_text(size = 14, face = "bold"),
- axis.text.y = element_text(size = 14, face = "bold"))
- ```
- #Figure
- ## DEGs between KI Cluster 1 vs WT resting
- ```{r}
- #Highlight plots
- levels(Idents(sobj_3mo))
- Idents(sobj_3mo) <- "cell_states"
- WT <- WhichCells(sobj_3mo, idents = c("WT Resting"))
- ki.c1 <- WhichCells(sobj_3mo, idents = c("KI Cluster 1"))
- cells_wtki.c1 <- list("WT" = WT,
- "KI Cluster 1" = ki.c1)
- highlight_ki.c1 <- Cell_Highlight_Plot(seurat_object = sobj_3mo, cells_highlight = cells_wtki.c1, highlight_color = c("#228b22", "#eae4b7"))+
- theme(aspect.ratio = 1,
- legend.text = element_text(size = 15),
- axis.line = element_blank(),
- axis.title = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- legend.key.size = unit(0.5, "cm"),
- legend.title = element_text(color = "black", size = 18, face = 2),
- legend.position.inside = c(0.65 ,0.25))+
- guides(color = guide_legend(override.aes = list(size = 6)))
- highlight_ki.c1
- ```
- barplot
- ```{r}
- #input dataframe for barplot of DEGs
- ki.c1.wt.degs.count <- data.frame(status = names(table(ki.c1.wt.dea_filt$Regulation)),
- total = as.vector(table(ki.c1.wt.dea_filt$Regulation)))
- #barplot
- ki.c1.wt.dea_bp <- ggplot(ki.c1.wt.degs.count, aes(x = status, y = total ,fill = status))+
- geom_bar(stat= "identity", width = 0.9)+
- scale_fill_manual(values = c("#00798c","#cc0000"))+
- geom_text(aes(label = total), vjust= -0.2, size = 6, hjust = 1)+
- coord_flip()+
- theme_classic()+
- theme(aspect.ratio = 0.5,
- legend.position = 'none',
- axis.text.x = element_text(size=20, angle=0),
- axis.text.y = element_text(size=20, angle=0),
- axis.title = element_text(size = 20),
- axis.line = element_line(linewidth = 1.5))+
- scale_x_discrete(labels = c("up" = "KI Cluster 1 vs WT Resting up",
- "down" = "KI Cluster 1 vs WT Resting down"))+
- ylab("number of DEGs")+
- xlab(label= NULL)
- #number of cells in the respective clusters
- table(Idents(sobj_3mo_sub2))
- ki.c1.wt.dea_bp
- ```
- #Figure
- ## DEGs heatmap
- ```{r, fig.height= 10, fig.width=5}
- Idents(sobj_3mo_sub2) <- factor(Idents(sobj_3mo_sub2),
- levels = c("WT Resting", "KI Cluster 1"))
- # create vector with the top 20 degs
- ki1wt_markers_to_plot <- dplyr::bind_rows(top20_up_degs_fc_ord_ki.c1.wt.dea, top20_dn_degs_fc_ord_ki.c1.wt.dea)
- ki1wt_markers_to_plot_vec <- ki1wt_markers_to_plot$gene
- #heatmap of top 20 DEGs expressed between two time points (assessed with MAST)
- [email hidden]$HM <- Idents(sobj_3mo_sub2)
- wtki1_heat <- DoHeatmap(sobj_3mo_sub2, features = ki1wt_markers_to_plot_vec, size = 4,
- angle = 45, group.by = "HM", draw.lines = T, raster = FALSE)+
- scale_fill_gradientn(colors = c("blue", "white", "red"))
- wtki1_heat
- ```
- #Figure
- ## GO dotplot
- ```{r, fig.width=6, fig.height=3.5}
- #split in up and down to select non redundant terms more easily
- up_ki.c1 <- subset(ego_combined_ki.c1, status== "up")
- dn_ki.c1 <- subset(ego_combined_ki.c1, status== "down")
- #selection of non redundant terms
- selected_got_ki.c1vswt0 <- subset(ego_combined_ki.c1, Description %in% c("cell junction disassembly", "positive regulation of endocytosis", "inflammatory response to antigenic stimulus", "mononuclear cell migration", "regulation of lipid metabolic process", "response to nutrient levels"))
- #modify aesthetics
- selected_got_ki.c1vswt0$Description <- factor(selected_got_ki.c1vswt0$Description, levels = unique(c("cell junction disassembly", "positive regulation of endocytosis", "inflammatory response to antigenic stimulus", "mononuclear cell migration", "regulation of lipid metabolic process", "response to nutrient levels")))
- #dotplot
- ki.c1.wt_goe_sel <- ego_dp(selected_got_ki.c1vswt0)
- #modify aestethics
- ki.c1.wt_goe_sel+
- scale_color_gradient(low ="#6a329f", high = "#cd99e7")+
- theme(axis.text.x = element_text(size = 14, face = "bold"),
- axis.text.y = element_text(size = 14, face = "bold"))
- ```
- #_____________________________________________________________________________________________________
- ## Expression of AD-risk genes
- Expression levels of genes curated from GWAS studies aimed at identifying risk factors in AD. The list of genes was taken from Mancuso et al., 2024 supplementary table 4
- Publication:
- Mancuso, R., Fattorelli, N., Martinez-Muriana, A. et al. Xenografted human microglia display diverse transcriptomic states in response to Alzheimer’s disease-related amyloid-β pathology. Nat Neurosci 27, 886–900 (2024). https://doi.org/10.1038/s41593-024-01600-y
- https://www.nature.com/articles/s41593-024-01600-y?s=31
- ```{r}
- #load gene list extrapolated from Mancuso et al., supplementary
- #Mancuso_2024_AD_risk_gene_list (import .xlsx file)
- #get list of genes
- ad_risk_genes <- mancuso_ad_risk$genes
- length(ad_risk_genes)
- ```
- ```{r, fig.width= 30, fig.height= 8}
- #are any of these genes DEG in the KI clusters of this dataset?
- ad_risk_deg_paquet <- intersect(ad_risk_genes, all_kivswt_union)
- ad_risk_deg_paquet
- #select genes
- ad_risk_genes_deg <- c("ANKH", "BLNK", "CLU", "SORL1", "TREM2", "HLA-DQA1", "HLA-DRB1")
- ```
- ## Signature scoring
- Zhou et al.,2020 signature
- Publication:
- Zhou, Y., Song, W.M., Andhey, P.S. et al. Human and mouse single-nucleus transcriptomics reveal TREM2-dependent and TREM2-independent cellular responses in Alzheimer’s disease. Nat Med 26, 131–142 (2020). https://doi.org/10.1038/s41591-019-0695-9
- https://www.nature.com/articles/s41591-019-0695-9
- Dataset description:
- Human and mouse single-nucleus transcriptomics reveal TREM2-dependent and -independent cellular responses in Alzheimer’s disease
- source of signature: supplementary table 4-Micro 0 signature
- ```{r}
- #import zhou et al supplementary from excel
- #zhou_supp4 <-read_excel("/path/zhou_tablesup4_micro0.xlsx")
- #extract gene list
- zhou_sig <- list("gene.symbol" = zhou_supp4$gene)
- #dimension of signature
- length(zhou_sig[[1]])
- ```
- ```{r}
- #set idents
- Idents(sobj_3mo) <- "genotype"
- #scoring of signature
- sobj_3mo <- AddModuleScore_UCell(sobj_3mo, features = zhou_sig, name = "zhou1")
- ```
- #________________________________________________________________________________________________
- # Figure
- ## AD risk genes in KI cultures
- ```{r, fig.height=8, fig.width=3}
- #stacked violin
- Idents(sobj_3mo) <- "cell_states"
- sobj_3mo_sub4 <- subset(sobj_3mo, idents = c("WT Resting", "KI Cluster 1", "KI Cluster 2"))
- [email hidden]$id_factor <- factor([email hidden]$cell_states, levels = c("WT Resting", "KI Cluster 1", "KI Cluster 2"))
- Idents(sobj_3mo_sub4) <- "id_factor"
- #violin plot
- Stacked_VlnPlot(seurat_object = sobj_3mo_sub4, features = c("ANKH", "BLNK", "SORL1", "TREM2", "HLA-DQA1", "HLA-DRB1", "CLU"),
- x_lab_rotate = TRUE, idents = c("WT Resting", "KI Cluster 1", "KI Cluster 2"), colors_use = c("#228b22","#eae4b7", "#ffb90f"))+
- theme(aspect.ratio = 1.5)
- ```
- # Fig
- ## Enrichment for Zhou et al, signature
- ```{r}
- #WT resting vs KI Inflammatory vs KI 2
- #set idents
- Idents(sobj_3mo_sub4) <- "cell_states"
- #subset for clusters of interest
- v.cl <- VlnPlot(sobj_3mo_sub4, assay="RNA",
- features = "gene.symbolzhou1" ,
- pt.size = 0, cols = c("#228b22", "#eae4b7", "#ffb90f")) +
- geom_boxplot(width = 0.4)+
- ylim(0.1, 0.45)+
- scale_x_discrete(limits = c("WT Resting", "KI Cluster 1", "KI Cluster 2"))+
- NoLegend() +
- geom_signif(test = "wilcox.test",
- map_signif_level = F,
- comparisons = list(c("WT Resting", "KI Cluster 1"),
- c("WT Resting", "KI Cluster 2")),
- y_position = c(0.37, 0.4))+
- theme(aspect.ratio = 0.9,
- title = element_blank(),
- axis.text.x = element_text(size=14, angle=45, hjust = 1),
- axis.text.y = element_text(size=14, angle=0),
- axis.title.x = element_text(face = "bold", size = 14),
- axis.title.y = element_text(face = "bold", size = 14))+
- xlab("")+
- ylab("ES")+
- ggtitle("AD microglia signature", subtitle = "Zhou et al., 2020")
- v.cl
- #stat
- es_df_ad <- [email hidden][, c("cell_states", "gene.symbolzhou1")]
- #stat
- es_df_ad <- [email hidden][, c("cell_states", "gene.symbolzhou1")]
- #ordering
- es_df_ad$cell_states <- ordered(es_df_ad$cell_states,
- levels = c("WT Resting", "KI Cluster 1", "KI Cluster 2"))
- kruskal.test(gene.symbolzhou1 ~ cell_states, data = es_df_ad)
- ```
- ```{r}
- #levels(Idents(sobj_3mo_sub4))
- # sobj_3mo_sub4$cell_states_subset <- Idents(sobj_3mo_sub4)
- #Idents(sobj_3mo_sub4) <- "cell_states_subset"
- #scoring of signature
- # sobj_3mo_sub4 <- AddModuleScore_UCell(sobj_3mo_sub4, features = zhou_sig, name = "zhou_sub")
- es_df <- FetchData(sobj_3mo_sub4, vars = c("cell_states_subset", "gene.symbolzhou_sub"))
- summary(es_df)
- table(es_df$cell_states_subset, useNA = "ifany")
- table(es_df$gene.symbolzhou_sub, useNA = "ifany")
- kruskal.test(gene.symbolzhou_sub ~ cell_states_subset, data = es_df)
- p <- ggplot(es_df, aes(x= cell_states_subset, y = gene.symbolzhou_sub))+
- geom_violin(trim = FALSE)
- p <- p + geom_signif(comparisons = list(c("WT Resting", "KI Cluster 1"),
- c("WT Resting", "KI Cluster 2")),
- map_signif_level = FALSE,
- test = "wilcox.test")
- p
- rm(p)
- p <- ggplot(es_df, aes(x= cell_states_subset, y = gene.symbolzhou_sub))+
- geom_violin(trim = FALSE)
- p <- p + geom_signif(map_signif_level = FALSE,
- test = "kruskal.test")
- p
- ```
- #______________________________________________________________________________________________________________________________
- #Figure
- #Overlap between updegs in KI Cluster 2 and Zhou signature
- ```{r}
- #paquet: up_kivswt_union
- #zhou:
- zhou_chr <- zhou_sig[[1]]
- #background: total of tested genes in differential expression analysis
- total.degs <- union(x = ki.c2.wt.dea$genes, y = ki.c1.wt.dea$genes)
- total.degs <- unique(total.degs)
- total.degs.num <- length(total.degs)
- #create gene overlap object
- go.objB <- newGeneOverlap(listA = up_kivswt_union, listB = zhou_chr, genome.size = total.degs.num)
- #stat
- go.objB <- testGeneOverlap(go.objB)
- #show odds ratio
- print(go.objB)
- ```
- ```{r}
- gene.set <- list("KI 3mo" = up_kivswt_union, "Zhou et al., 2020 signature" = zhou_chr)
- resPZ <- supertest(x= gene.set, n= total.degs.num)
- plot.pz <- as.ggplot(~plot(resPZ, Layout="landscape", sort.by="size", keep=FALSE,
- show.elements=TRUE,
- elements.cex=0.7,
- elements.list=subset(summary(resPZ)$Table,Observed.Overlap <= 20),
- show.expected.overlap=F,
- color.expected.overlap='red',
- color.on = NULL))
- plot.pz
- summary(resPZ)$Table
- ```
Figure5_scRNA_microglia_KI.Rmd at commit 31c0793, no license · at the source
Overview
and 7 other authors
Elena De Domenico3,14, Marc D. Beyer3,14,15, Joachim L. Schultze3,14,16, Christian Haass4,7,9, Stefan F. Lichtenthaler4,5,9, Caterina Carraro3, Dominik Paquet1,916 affiliations
- Institute for Stroke and Dementia Research (ISD), LMU University Hospital, LMU Medizin, LMU Munich,Munich, Germany
- Graduate School of Systemic Neuroscience (GSN), LMU Munich,Munich, Germany
- Systems Medicine, Deutsches Zentrum für Neurodegenerative Erkrankungen (DZNE) e.V.,Bonn, Germany
- German Center for Neurodegenerative Diseases (DZNE) Munich,Munich, Germany
- Neuroproteomics, School of Medicine and Health, TUM University Hospital, Technical University of Munich,Munich, Germany
- Institute of Neuropathology, LMU Medizin, LMU Munich,Munich, Germany
- Metabolic Biochemistry, Biomedical Center (BMC), Faculty of Medicine, LMU Munich,Munich, Germany
- Chair of Physiological Genomics, Biomedical Center (BMC), LMU Medizin, LMU Munich,Munich, Germany
- Munich Cluster for Systems Neurology (SyNergy),Munich, Germany
- Max-Planck-Institute of Psychiatry,Munich, Germany
- Institute of Neuronal Cell Biology, Technical University of Munich,Munich, Germany
- Institute of Clinical Neuroimmunology, LMU University Hospital, LMU Medizin, LMU Munich,Munich, Germany
- Biomedical Center (BMC), LMU Medizin, LMU Munich,Munich, Germany
- PRECISE Platform for Genomics and Epigenomics, Deutsches Zentrum für Neurodegenerative Erkrankungen (DZNE) e.V. and University of Bonn and West German Genome Center,Bonn, Germany
- Immunogenomics & Neurodegeneration, Deutsches Zentrum für Neurodegenerative Erkrankungen (DZNE) e.V.,Bonn, Germany
- Genomics and Immunoregulation, Life & Medical Sciences (LIMES) Institute, University of Bonn,Bonn, Germany
Abstract
Stem-cell-based in vitro models offer promising potential to elucidate human brain cell functions and interactions, but limitations in reproducibility, maturation and cell-type diversity persist. Especially, prolonged incorporation of mature microglia and studies of neuroinflammation have proven challenging. Here, we developed a human induced pluripotent stem cell-based three-dimensional cortical brain tissue model (3BTM) containing neurons, astrocytes and microglia with high reproducibility, maturity and viability. 3BTMs show morphological, functional and proteomic maturation of all cell types, leading to high similarity to their in vivo counterparts. Incorporated microglia survive for over 6 months and display mature morphology, functions and gene expression. Importantly, when engineered to model Alzheimer’s disease pathology, 3BTMs recapitulate key disease hallmarks, including amyloid deposition, increased phospho-tau levels and neuroinflammation, with microglia shifting their transcriptional landscape to disease-relevant signatures. Treatment of Alzheimer’s disease 3BTMs with anti-Aβ immunotherapy cleared deposits and largely reversed disease signatures in glia. Together, our microglia-containing model provides a platform for studying physiological and pathological states of human brain tissue.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 18 matches between paragraphs and lines of code.
jsschrepping/r_docker
187c49cdfa925ebd14226ede042ddc0122cf6215, 29 April 2024Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
13 files
- install_WGCNA.R, R, 5 lines
- install_bioc.R, R, 64 lines, 1 match
- install_biodb.R, R, 10 lines
- install_cran.R, R, 74 lines
- install_cyto.R, R, 15 lines
- install_future.R, R, 8 lines
- install_github.R, R, 17 lines
- install_github2.R, R, 20 lines
- install_scEpi.R, R, 19 lines
- start_docker.sh, Shell, 1 line
- test_installation.R, R, 167 lines
- LICENSE, License, 21 lines
- README.md, Text, 62 lines
gitlab.dzne.de/ag-beyer/singlecell_analysis_3btm
31c079315b8210b043d0b6d72b92ad5a18e0d168, 8 May 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
7 files
- analysis_3BTM_10x/
Figure3_scRNA_microglia_ , R, 2,695 lines, 3 matchesmaturation_clean.Rmd - analysis_3BTM_10x/
Figure5_scRNA_microglia_ , R, 1,404 lines, 6 matchesKI.Rmd - analysis_3BTM_3Dvs2D/
analysis_3BTM_3Dvs2D_min , R, 3,666 lines, 3 matchesimal.Rmd - analysis_3BTM_rhapsody/
analysis_3BTM_downstream , R, 6,683 lines, 5 matches.Rmd - analysis_3BTM_rhapsody/
analysis_3BTM_hdWGCNA_mi , R, 938 linescroglia/ analysis_3BTM_hdWGCNA_mi croglia.Rmd - analysis_3BTM_rhapsody/
analysis_3BTMs_preproces , R, 1,474 linessing_feb2026.Rmd - README.md, Text, 22 lines
Code availability
All original code to analyze the scRNA-seq data, and the tool and package information to fully reproduce the analysis is publicly available via GitLab at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 17 scripts, each with its path and the digest of its content;
- 18 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
Datasets cited
- uniprot.org/
uniprot/ , at UniProt; found in “Generation of a reproducible human 3D brain…”p2ry12 - uniprot.org/
uniprot/ , at UniProt; found in the text, “iMGs mature in 3BTMs and adopt transcriptomic…”p2ry13
Data availability
The scRNA-seq profiling datasets have been deposited with the European Genome-phenome Archive (EGA) (10X dataset: EGAS50000000469 (https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 3, 28 September 2026
- Publisher: n/a → Nature Portfolio
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 27 authors, 5 keywords, 9 MeSH terms, 2 funders, 104 references, 4 RRIDs.
Cite
This paper
Klimmt, J., Cardoso Gonçalves, C., Montgomery, J. V., Müller, S. A., Bublitz, M., Filser, S., Paeger, L., Nuscher, B., Dannert, A., Roeber, S., Pravata, V., Schifferer, M., Shrouder, J. J., Schulz, N., González-Gallego, J., Cappello, S., Misgeld, T., Plesnila, N., Beltrán, E., . . . Paquet, D. (2026). A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes. Nature neuroscience, 29(9), 2324-2340. https://
BibTeX
@article{klimmt2026repro
author = {Klimmt, Julien and Cardoso Gonçalves, Carolina and Montgomery, Jessica Valentina and Müller, Stephan A. and Bublitz, Merle and Filser, Severin and Paeger, Lars and Nuscher, Brigitte and Dannert, Angelika and Roeber, Sigrun and Pravata, Veronica and Schifferer, Martina and Shrouder, Joshua J. and Schulz, Nathalie and González-Gallego, Judit and Cappello, Silvia and Misgeld, Thomas and Plesnila, Nikolaus and Beltrán, Eduardo and Herms, Jochen and De Domenico, Elena and Beyer, Marc D. and Schultze, Joachim L. and Haass, Christian and Lichtenthaler, Stefan F. and Carraro, Caterina and Paquet, Dominik},
title = {{A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes}},
journal = {Nature neuroscience},
year = {2026},
month = aug,
volume = {29},
number = {9},
pages = {2324--2340},
publisher = {Nature Portfolio},
issn = {1097-6256},
doi = {10.1038/
url = {https://
pmid = {42552384},
pmcid = {PMC13533838}
}
RIS
TY - JOUR
AU - Klimmt, Julien
AU - Cardoso Gonçalves, Carolina
AU - Montgomery, Jessica Valentina
AU - Müller, Stephan A.
AU - Bublitz, Merle
AU - Filser, Severin
AU - Paeger, Lars
AU - Nuscher, Brigitte
AU - Dannert, Angelika
AU - Roeber, Sigrun
AU - Pravata, Veronica
AU - Schifferer, Martina
AU - Shrouder, Joshua J.
AU - Schulz, Nathalie
AU - González-Gallego, Judit
AU - Cappello, Silvia
AU - Misgeld, Thomas
AU - Plesnila, Nikolaus
AU - Beltrán, Eduardo
AU - Herms, Jochen
AU - De Domenico, Elena
AU - Beyer, Marc D.
AU - Schultze, Joachim L.
AU - Haass, Christian
AU - Lichtenthaler, Stefan F.
AU - Carraro, Caterina
AU - Paquet, Dominik
TI - A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes
T2 - Nature neuroscience
J2 - Nat Neurosci
PY - 2026
DA - 2026/
VL - 29
IS - 9
SP - 2324
EP - 2340
SN - 1097-6256
PB - Nature Portfolio
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes",
"container-title": "Nature neuroscience",
"author": [
{
"family": "Klimmt",
"given": "Julien"
},
{
"family": "Cardoso Gonçalves",
"given": "Carolina"
},
{
"family": "Montgomery",
"given": "Jessica Valentina"
},
{
"family": "Müller",
"given": "Stephan A."
},
{
"family": "Bublitz",
"given": "Merle"
},
{
"family": "Filser",
"given": "Severin"
},
{
"family": "Paeger",
"given": "Lars"
},
{
"family": "Nuscher",
"given": "Brigitte"
},
{
"family": "Dannert",
"given": "Angelika"
},
{
"family": "Roeber",
"given": "Sigrun"
},
{
"family": "Pravata",
"given": "Veronica"
},
{
"family": "Schifferer",
"given": "Martina"
},
{
"family": "Shrouder",
"given": "Joshua J."
},
{
"family": "Schulz",
"given": "Nathalie"
},
{
"family": "González-Gallego",
"given": "Judit"
},
{
"family": "Cappello",
"given": "Silvia"
},
{
"family": "Misgeld",
"given": "Thomas"
},
{
"family": "Plesnila",
"given": "Nikolaus"
},
{
"family": "Beltrán",
"given": "Eduardo"
},
{
"family": "Herms",
"given": "Jochen"
},
{
"family": "De Domenico",
"given": "Elena"
},
{
"family": "Beyer",
"given": "Marc D."
},
{
"family": "Schultze",
"given": "Joachim L."
},
{
"family": "Haass",
"given": "Christian"
},
{
"family": "Lichtenthaler",
"given": "Stefan F."
},
{
"family": "Carraro",
"given": "Caterina"
},
{
"family": "Paquet",
"given": "Dominik"
}
],
"container-title-short":
"volume": "29",
"issue": "9",
"page": "2324-2340",
"DOI": "10.1038/
"PMID": "42552384",
"PMCID": "PMC13533838",
"ISSN": "1097-6256",
"publisher": "Nature Portfolio",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
4
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1016/j.xcrm.2026.102766 [code]
- A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.Journal: Cell reports. MedicineIn common: Monocle 3, WGCNA, Harmony, 17 other tools, cellular / molecular, 6 references
- [2] doi:10.1038/s41586-026-10214-2 [code]
- Multidimensional profiling of heterogeneity in supratentorial ependymomas.Journal: NatureIn common: Monocle 3, Harmony, SingleCellExperiment, 16 other tools, 2 references
- [3] doi:10.1038/s42003-026-10957-8 [code]
- Brain defence by the extracellular matrix protein Cochlin.Journal: Communications biologyIn common: Subread (featureCounts), Monocle 3, WGCNA, 16 other tools, cellular / molecular
- [4] doi:10.1093/bioinformatics/btag592 [code]
- Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.Journal: Bioinformatics (Oxford, England)In common: multcomp, Subread (featureCounts), WGCNA, 16 other tools
- [5] doi:10.1002/imt2.70163 [code]
- Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.Journal: iMetaIn common: Monocle 3, Harmony, SingleCellExperiment, 16 other tools, cellular / molecular
- [6] doi:10.1038/s41467-026-70232-6 [code]
- Gene expression dynamics of human and mouse craniofacial development at the single-cell level.Journal: Nature communicationsIn common: Harmony, SingleCellExperiment, edgeR, 13 other tools, cellular / molecular, 3 references
- [7] doi:10.1016/j.isci.2026.115573 [code]
- Female cortical cellular mosaicism underlies shared MeCP2 and PCB impacted gene pathways.Journal: iScienceIn common: WGCNA, SingleCellExperiment, edgeR, 13 other tools, cellular / molecular, 2 references
- [8] doi:10.1016/j.isci.2026.115657 [code]
- Integration of machine learning to develop a disulfidptosis model for predicting glioma prognosis, immunotherapy response, and drug.Journal: iScienceIn common: WGCNA, Harmony, edgeR, 15 other tools
- [9] doi:10.1016/j.xcrm.2026.102682 [code]
- TET CpG sequence-context-specifi
c DNA demethylation shapes progression of IDH-mutant gliomas. Journal: Cell reports. MedicineIn common: multcomp, edgeR, limma, 13 other tools, 2 references - [10] doi:10.1016/j.celrep.2026.117500 [code]
- Spatio-molecular gene expression reflects dorsal anterior cingulate cortex structure and function in the human brain.Journal: Cell reportsIn common: Harmony, SingleCellExperiment, edgeR, 12 other tools, cellular / molecular, 4 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 2 repositories of the authors' code, each at its verified commit and with its license, 17 scripts, and 18 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:8fd6c248efad7b3e…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
