Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.
The 10 matches
- [1] § RESULTS › Spatial reorganization of multiple cell types following RIR ↔ 02figure2/fig 2D.ipynb, lines 43–67 · score 0.86 · Schwann cell, proliferating cell, CEC, CSK, LEC, LSC
- [2] § RESULTS › Spatial reorganization of multiple cell types following RIR ↔ 02figure2/fig 2A-B.ipynb, lines 143–164 · score 0.86 · Schwann cell, proliferating cell, CEC, CSK, LEC, LSC
- [3] § RESULTS › RIR induces spatially restricted inflammation and molecular alterations dominated by microglial activation in the inner retina ↔ 03figure3/fig 3J.ipynb, lines 143–145 · score 0.77 · Pde6b, Ms4a7, P2ry12, C1qa, Cd44, Hexb
- [4] § RESULTS › High‐resolution ST delineates region‐specific molecular architecture in the RIR ocular globes ↔ 02figure2/fig 2E.ipynb, lines 169–202 · score 0.68 · Col17a1, Aldh3a1, Nefm, Sncg, Krt12, Nefl
- [5] § METHODS › Processing, dimensionality reduction, clustering, and annotation of public scRNA‐seq datasets ↔ vignettes/geseca-tutorial.Rmd, lines 377–432 · score 0.67 · dimensionality reduction, UMAP, Seurat, downstream, spatial transcriptomics, PCA
- [6] § METHODS › Dividing mouse eyeball into 10 regions ↔ 01figure1/fig 1E.ipynb, lines 61–63 · score 0.59 · Cornea conj, Optic nerve, CB, Iris, Muscle, INL
- [7] § METHODS › Dividing mouse eyeball into 10 regions ↔ 03figure3/fig 3A.ipynb, lines 122–124 · score 0.59 · Cornea conj, Optic nerve, CB, Iris, Muscle, INL
- [8] § METHODS › Processing, dimensionality reduction, clustering, and annotation of public scRNA‐seq datasets ↔ vignettes/geseca-tutorial.Rmd, lines 377–432 · score 0.56 · UMAP, Seurat, variable, PCA, dimensionality, resolution
- [9] § METHODS › Annotation of spatial transcriptomic data ↔ 01figure1/fig 1E.ipynb, lines 61–63 · score 0.54 · Cornea conj, optic nerve, CB, Iris, muscle, RPE
- [10] § METHODS › Annotation of spatial transcriptomic data ↔ 03figure3/fig 3A.ipynb, lines 122–124 · score 0.54 · Cornea conj, optic nerve, CB, Iris, muscle, RPE
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 · 536 lines · 19 KB · MIT · 2 matches
- ---
- title: "Gene set co-regulation analysis tutorial"
- output:
- rmarkdown::html_vignette:
- toc: true
- vignette: >
- %\VignetteIndexEntry{Gene set co-regulation analysis tutorial}
- %\VignetteEngine{knitr::rmarkdown}
- %\VignetteEncoding{UTF-8}
- ---
- ```{r, include = FALSE}
- knitr::opts_chunk$set(
- collapse = TRUE,
- comment = "#>"
- )
- ```
- ```{r echo=FALSE}
- library(BiocParallel)
- register(SerialParam())
- ```
- This vignette describes GESECA (gene set co-regulation analysis): a method
- to identify gene sets that have high gene correlation.
- We will show how GESECA can be used to find regulated pathways
- in multi-conditional data, where there is no obvious contrast that
- can be used to rank genes for GSEA analysis.
- As examples we will consider a time course microarray experiment
- and a spatial transcriptomics dataset.
- ## Overiew of GESECA method
- GESECA takes as an input:
- * *E* - gene expression matrix, where rows and columns correspond to genes and samples respectively.
- * *P* - list of gene sets (i.e.
- [hallmark gene sets](http://www.gsea-msigdb.org/gsea/msigdb/human/collections.jsp#H)).
- **Note**: genes identifier type should be the same for both elements of *P* and for row names of matrix *E*.
- By default, GESECA method performs centering for rows of the matrix *E*.
- So, after that, the gene values are assumed to have zero mean.
- Then for each gene set *p* in *P* let us introduce the gene set score in the following form:
- ```{r eval=FALSE}
- score <- sum(colSums(E[p, ])**2) / length(p)
- ```
- This score was inspired by the variance of principal components
- from the principal component analysis (PCA).
- Therefore, the given score can be viewed in terms of explained variance by the gene set *p*.
- Geometrically, this can be considered as an embedding of samples into
- a one-dimensional space, given by a unit vector in which nonzero
- positions correspond to genes from gene set *p*.
- In the case of row-centered matrix *E* the variance of
- highly correlated genes is summed up to a higher score.
- While the genes that are not correlated cancel each other and the total
- gene set variance is low.
- See the toy example:
- {width=90%}
- Another major feature of the proposed score is that it does not require
- an explicit sample annotation or a contrast.
- As the result, GESECA can be applied to various types of sequencing technologies: RNA-seq, single-cell sequencing, spatial RNA-seq, etc.
- To assess statistical significance for a given gene set *p* we calculate
- an empirical P-value by using gene permutations.
- The definition of the P-value is given by the following expression:
- \[
- \mathrm{P} \left(\text{random score} \geqslant \text{score of p} \right).
- \]
- The estimation of the given P-value is done by sampling random gene sets
- with the same size as *p* from the row names of matrix *E*.
- In practice, the theoretical P-value can be extremely small,
- so we use the adaptive multilevel Markov Chain Monte Carlo scheme,
- that we used previously in `fgseaMultilevel` procedure.
- For more details, see the [preprint](https://www.biorxiv.org/content/10.1101/060012v3).
- ## Analysis of time course data
- In the first example we will consider a time course data of Th2 activation
- from the dataset GSE200250.
- First, let prepare the dataset. We load it from Gene Expression Omnibus,
- apply log and quantile normalization and filter lowly expressed genes.
- ```{r message=FALSE}
- library(GEOquery)
- library(limma)
- gse200250 <- getGEO("GSE200250", AnnotGPL = TRUE, returnType = "ExpressionSet")[[1]]
- es <- gse200250
- es <- es[, grep("Th2_", es$title)]
- es$time <- as.numeric(gsub(" hours", "", es$`time point:ch1`))
- es <- es[, order(es$time)]
- exprs(es) <- normalizeBetweenArrays(log2(exprs(es)), method="quantile")
- es <- es[order(rowMeans(exprs(es)), decreasing=TRUE), ]
- es <- es[!duplicated(fData(es)$`Gene ID`), ]
- rownames(es) <- fData(es)$`Gene ID`
- es <- es[!grepl("///", rownames(es)), ]
- es <- es[rownames(es) != "", ]
- fData(es) <- fData(es)[, c("ID", "Gene ID", "Gene symbol")]
- es <- es[head(order(rowMeans(exprs(es)), decreasing=TRUE), 12000), ]
- head(exprs(es))
- ```
- Then we obtain the pathway list. Here we use Hallmarks
- collection from MSigDB database.
- ```{r}
- library(msigdbr)
- pathwaysDF <- msigdbr(species="mouse", collection="H")
- pathways <- split(as.character(pathwaysDF$ncbi_gene), pathwaysDF$gs_name)
- ```
- Now we can run GESECA analysis:
- ```{r message=FALSE}
- library(fgsea)
- set.seed(1)
- gesecaRes <- geseca(pathways, exprs(es), minSize = 15, maxSize = 500)
- ```
- The resulting table contain GESECA scores and the corresponding P-values:
- ```{r}
- head(gesecaRes, 10)
- ```
- We can plot gene expression profile of HALLMARK_E2F_TARGETS pathway and see
- that these genes are strongly activated at 24 hours time point:
- ```{r fig.width=10, fig.height=4, out.width="100%"}
- plotCoregulationProfile(pathway=pathways[["HALLMARK_E2F_TARGETS"]],
- E=exprs(es), titles = es$title, conditions=es$`time point:ch1`)
- ```
- Hypoxia genes have slightly different profile, getting activated around 48 hours:
- ```{r fig.width=10, fig.height=4, out.width="100%"}
- plotCoregulationProfile(pathway=pathways[["HALLMARK_HYPOXIA"]],
- E=exprs(es), titles = es$title, conditions=es$`time point:ch1`)
- ```
- To get an overview of the top pathway patterns we can use `plotGesecaTable`
- function:
- ```{r fig.width=10, fig.height=6, out.width="100%"}
- plotGesecaTable(gesecaRes |> head(10), pathways, E=exprs(es), titles = es$title)
- ```
- When the expression matrix contains many samples, a PCA-reduced expression matrix
- can be used instead of the full matrix to improve the performance.
- Let reduce the sample space from `r ncol(es)` to 10 dimensions, preserving as much gene variation as possible.
- ```{r}
- E <- t(base::scale(t(exprs(es)), scale=FALSE))
- pcaRev <- prcomp(E, center=FALSE)
- Ered <- pcaRev$x[, 1:10]
- dim(Ered)
- ```
- Now we can run GESECA on the reduced matrix, however we need to disable automatic centering, as we already have done it before the reduction.
- ```{r}
- set.seed(1)
- gesecaResRed <- geseca(pathways, Ered, minSize = 15, maxSize = 500, center=FALSE)
- head(gesecaResRed, 10)
- ```
- The scores and P-values are similar to the ones we obtained for the full matrix.
- ```{r fig.width=4, fig.height=4}
- library(ggplot2)
- ggplot(data=merge(gesecaRes[, list(pathway, logPvalFull=-log10(pval))],
- gesecaResRed[, list(pathway, logPvalRed=-log10(pval))])) +
- geom_point(aes(x=logPvalFull, y=logPvalRed)) +
- coord_fixed() + theme_classic()
- ```
- ## Analysis of single-cell RNA-seq
- Let us load necessary libraries. We a going to use `Seurat` package for working with singe cell data.
- ```{r}
- suppressMessages(library(Seurat))
- ```
- As an example dataset we will use GSE116240 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE116240).
- The dataset features single cell RNA sequencing of aortic CD45+ cells
- and foam cells from atherosclerotic aorta and is extensively described
- in the corresponding publication (https://pubmed.ncbi.nlm.nih.gov/30359200/).
- We also thank the authors for providing the corresponding Seurat object
- used for the publication.
- ```{r fig.width=8, fig.height=3.5}
- obj <- readRDS(url("https://alserglab.wustl.edu/files/fgsea/GSE116240.rds"))
- obj
- newIds <- c("0"="Adventitial MF",
- "3"="Adventitial MF",
- "5"="Adventitial MF",
- "1"="Intimal non-foamy MF",
- "2"="Intimal non-foamy MF",
- "4"="Intimal foamy MF",
- "7"="ISG+ MF",
- "8"="Proliferating cells",
- "9"="T-cells",
- "6"="cDC1",
- "10"="cDC2",
- "11"="Non-immune cells")
- obj <- RenameIdents(obj, newIds)
- DimPlot(obj) + ggplot2::coord_fixed()
- ```
- We apply an appropriate normalization (note that we are using 10000 genes,
- which will be later used as a gene universe for the analysis):
- ```{r}
- obj <- SCTransform(obj, verbose = FALSE, variable.features.n = 10000)
- ```
- To speed up the analysis, instead of using the full transformed
- gene expression matrix, we will consider only its first
- principal components. Note that a "reverse" PCA should be done:
- the principal components should correspond to linear combinations
- of the cells, not linear combinations of the genes as in "normal" PCA.
- By default `SCTransform` returns centered gene expression, so we
- can run PCA directly.
- ```{r}
- length(VariableFeatures(obj)) # make sure it's a full gene universe of 10000 genes
- obj <- RunPCA(obj, assay = "SCT", verbose = FALSE,
- rev.pca = TRUE, reduction.name = "pca.rev",
- reduction.key="PCR_", npcs = 50)
- E <- obj@reductions$[email hidden]
- ```
- Following the authors we are going to use KEGG pathway collection.
- ```{r}
- library(msigdbr)
- pathwaysDF <- msigdbr(species="mouse", collection="C2", subcollection = "CP:KEGG_LEGACY")
- pathways <- split(pathwaysDF$gene_symbol, pathwaysDF$gs_name)
- ```
- Now we can run the analysis (we set `center=FALSE` because we use the
- reduced matrix):
- ```{r}
- set.seed(1)
- gesecaRes <- geseca(pathways, E, minSize = 5, maxSize = 500, center = FALSE, eps=1e-100)
- head(gesecaRes, 10)
- ```
- Now we can plot profiles of the top pathways (we need to specify the reduction
- as we are using the one from the publication):
- ```{r fig.width=12, fig.height=7, out.width="100%"}
- topPathways <- gesecaRes[, pathway] |> head(4)
- titles <- sub("KEGG_", "", topPathways)
- ps <- plotCoregulationProfileReduction(pathways[topPathways], obj,
- title=titles,
- reduction="tsne")
- cowplot::plot_grid(plotlist=ps[1:4], ncol=2)
- ```
- We can see that inflammatory pathways (e.g. KEGG_LEISHMANIA_INFECTION) are
- more associated with the non-foamy intimal macrophages, which was one of the
- main points of the Kim et al. Another pathway highlighted by the authors, KEGG_LYSOSOME, is specific to intimal foamy macrophages:
- ```{r fig.width=5, fig.height=3.5, out.width="50%"}
- plotCoregulationProfileReduction(pathways$KEGG_LYSOSOME,
- obj,
- title=sprintf("KEGG_LYSOSOME (pval=%.2g)",
- gesecaRes[match("KEGG_LYSOSOME", pathway), pval]),
- reduction="tsne")
- ```
- ## Analysis of spatial transcriptomic data
- ### Analysis of 10X visium spatial data
- Similarly to single cell RNA-seq, GESECA can be used for gene set enrichment analysis of spatial
- transcriptomics profiling. As an example we will use glioblastoma
- sample from Ravi et al (https://pubmed.ncbi.nlm.nih.gov/35700707/).
- ```{r message=FALSE}
- library(Seurat)
- obj <- readRDS(url("https://alserglab.wustl.edu/files/fgsea/275_T_ST_Seurat.rds"))
- ```
- As for scRNA-seq, we apply normalization for 10000 genes and run a do a PCA reduction.
- ```{r}
- obj <- SCTransform(obj, assay = "Spatial", verbose = FALSE, variable.features.n = 10000)
- obj <- RunPCA(obj, assay = "SCT", verbose = FALSE,
- rev.pca = TRUE, reduction.name = "pca.rev",
- reduction.key="PCR_", npcs = 50)
- E <- obj@reductions$[email hidden]
- ```
- We will use HALLMARK pathways as the gene set collection.
- ```{r}
- library(msigdbr)
- pathwaysDF <- msigdbr(species="human", collection="H")
- pathways <- split(pathwaysDF$gene_symbol, pathwaysDF$gs_name)
- ```
- Now we can run the analysis (remember, we set `center=FALSE` because we use the
- reduced matrix):
- ```{r}
- set.seed(1)
- gesecaRes <- geseca(pathways, E, minSize = 15, maxSize = 500, center = FALSE)
- head(gesecaRes, 10)
- ```
- Finally, let us plot spatial expression of the top four pathways:
- ```{r fig.width=10, fig.height=7, out.width="100%"}
- topPathways <- gesecaRes[, pathway] |> head(4)
- titles <- sub("HALLMARK_", "", topPathways)
- ps <- plotCoregulationProfileSpatial(pathways[topPathways], obj,
- title=titles,
- pt.size.factor=2.5)
- cowplot::plot_grid(plotlist=ps, ncol=2)
- ```
- <!-- {width=100%} -->
- Consistent with the Ravi et al, we see a distinct hypoxic region (defined by HALLMARK_HYPOXIA) and a reactive immune region (defined by HALLMARK_INTERFERON_GAMMA_RESPONSE). Further, we can explore behavior of
- HALLMARK_OXIDATIVE_PHOSPHORYLATION pathway to see that oxidative metabolism
- is more characteristic to the "normal" tissue region:
- ```{r fig.width=5, fig.height=3.5, out.width="50%"}
- plotCoregulationProfileSpatial(pathways$HALLMARK_OXIDATIVE_PHOSPHORYLATION,
- obj,
- pt.size.factor=2.5,
- title=sprintf("HALLMARK_OXIDATIVE_PHOSPHORYLATION\n(pval=%.2g)",
- gesecaRes[
- match("HALLMARK_OXIDATIVE_PHOSPHORYLATION", pathway),
- pval]))
- ```
- ### Analysis of 10X xenium spatial transcriptomics data
- GESECA can also be applied to spatial transcriptomics data generated by high-plex in situ technologies with subcellular resolution, such as 10X Genomics' Xenium platform. In this example, we analyze a Human Ovarian Cancer sample profiled using the Xenium 5K panel.
- The raw data used in this analysis is publicly available and can be downloaded from the following sources:
- - Xenium output bundle: [Download link](https://s3-us-west-2.amazonaws.com/10x.files/samples/xenium/3.0.0/Xenium_Prime_Ovarian_Cancer_FFPE_XRrun/Xenium_Prime_Ovarian_Cancer_FFPE_XRrun_outs.zip)
- - Cell annotation file: [Download link](https://cf.10xgenomics.com/samples/xenium/3.0.0/Xenium_Prime_Ovarian_Cancer_FFPE_XRrun/Xenium_Prime_Ovarian_Cancer_FFPE_XRrun_cell_groups.csv)
- To prepare the data for GESECA analysis, we carried out the following custom preprocessing steps using Seurat:
- ```{r eval=FALSE}
- fldr <- "" # Path to downloaded Xenium output
- annf_path <- "" # Path to downloaded cell annotation CSV
- # Load the Xenium data as a Seurat object
- xobj <- Seurat::LoadXenium(fldr, molecule.coordinates = FALSE)
- # Remove assays not needed for downstream analysis
- for (nm in names(xobj@assays)[-1]) {
- xobj@assays[[nm]] <- NULL
- }
- # Add spatial coordinates to metadata
- coords <- data.table::as.data.table(xobj@images$fov@boundaries$centroids@coords)
- [email hidden] <- cbind([email hidden], coords)
- # Integrate external cell annotations
- annot <- data.table::fread(annf_path)
- xobj <- xobj[, rownames([email hidden]) %in% annot$cell_id]
- [email hidden]$annotation <- annot[match(rownames([email hidden]), annot$cell_id), ]$group
- [email hidden]$annotation <- factor([email hidden]$annotation)
- # Filter out low-quality cells
- xobj <- subset(xobj, subset = nCount_Xenium > 50)
- # Optional: Crop the region and subsample the object
- # These steps reduce size and complexity for a more compact vignette
- # Helps keep the vignette lightweight and quick to render
- xobj <- xobj[, xobj$x < 3000 & xobj$y < 4000]
- set.seed(1)
- xobj <- xobj[, sample.int(ncol(xobj), 40000)]
- # Normalize and scale data
- xobj <- NormalizeData(xobj, normalization.method = "LogNormalize", scale.factor = 1000, verbose = FALSE)
- xobj <- FindVariableFeatures(xobj, nfeatures = 2000, verbose = FALSE)
- xobj <- ScaleData(xobj, verbose = FALSE)
- # Perform PCA and UMAP dimensionality reduction
- xobj <- RunPCA(xobj, verbose = FALSE)
- xobj <- RunUMAP(xobj, dims = 1:20)
- ```
- Additionally, before saving the object for use in the vignette, we remove the following components from the Seurat object to reduce its size and keep it tidy:
- ```{r eval=FALSE}
- xobj@reductions$pca <- NULL
- xobj@assays$Xenium@layers$scale.data <- NULL
- xobj@assays$Xenium@layers$data <- NULL
- ```
- For this tutorial, we directly use the Seurat object that was preprocessed using the steps described above:
- ```{r}
- xobj <- readRDS(url("https://alserglab.wustl.edu/files/fgsea/xenium-human-ovarian-cancer.rds"))
- xobj <- NormalizeData(xobj, verbose = FALSE)
- xobj <- ScaleData(xobj, verbose = FALSE)
- ```
- The plot below compares the spatial localization of annotated cells (left) with their transcriptional similarity via UMAP (right):
- ```{r fig.width=10, fig.height=5, out.width="100%"}
- p1 <- ImageDimPlot(xobj, group.by = "annotation",
- dark.background = FALSE, size = 0.5,
- flip_xy = TRUE) +
- theme(legend.position = "none")
- p1 <- suppressMessages(p1 + coord_flip() + scale_x_reverse() + theme(aspect.ratio = 1.0))
- p2 <- DimPlot(xobj, group.by = "annotation", raster = FALSE, pt.size = 0.5, stroke.size = 0.0) +
- coord_fixed()
- p1 | p2
- ```
- The command `suppressMessages(p1 + coord_flip() + scale_x_reverse() + theme(aspect.ratio = 1.0))` adjusts the plot orientation to match the spatial layout shown in the [Xenium Explorer web viewer](https://www.10xgenomics.com/datasets/xenium-prime-ffpe-human-ovarian-cancer), ensuring consistency between the analysis and the original data presentation.
- We will now perform the GESECA analysis in the same manner as previously demonstrated with both scRNA-seq and Visium datasets. For consistency and interpretability, we will once again use the HALLMARK gene sets from the MSigDB collection.
- ```{r}
- xobj <- RunPCA(xobj, verbose = F, rev.pca = TRUE, reduction.name = "pca.rev",
- reduction.key="PCR_", npcs=30)
- E <- xobj@reductions$[email hidden]
- gsets <- msigdbr(species="human", collection="H")
- gsets <- split(gsets$gene_symbol, gsets$gs_name)
- set.seed(1)
- gesecaRes <- geseca(gsets, E, minSize = 15, maxSize = 500, center = FALSE, eps = 1e-100)
- head(gesecaRes, 10)
- ```
- Next, we visualize the top enriched pathways identified by GESECA using UMAP embeddings. This allows us to assess transcriptional patterns of gene set activity across cells.
- ```{r fig.width=10, fig.height=7, out.width="100%"}
- topPathways <- gesecaRes[, pathway] |> head(6)
- titles <- sub("HALLMARK_", "", topPathways)
- pvals <- gesecaRes[match(topPathways, pathway), pval]
- pvals <- paste("p-value:", formatC(pvals, digits = 1, format = "e"))
- titles <- paste(titles, pvals, sep = "\n")
- plots <- fgsea::plotCoregulationProfileReduction(
- gsets[topPathways], xobj,
- reduction = "umap", title = titles,
- raster = TRUE, raster.dpi = c(500, 500),
- pt.size = 2.5
- )
- plots <- lapply(plots, function(p){
- p + theme(plot.title = element_text(hjust=0), text = element_text(size=10))
- })
- cowplot::plot_grid(plotlist = plots, ncol = 2)
- ```
- In addition to UMAP plots, you can visualize the spatial expression patterns of the most enriched pathways using the `plotCoregulationProfileImage` function. This enables a detailed view of how pathway activities vary across spatial coordinates:
- ```{r fig.width=10, fig.height=15, out.width="100%"}
- imagePlots <- plotCoregulationProfileImage(
- gsets[topPathways], object = xobj,
- dark.background = FALSE,
- title = titles,
- size=0.8
- )
- imagePlots <- lapply(imagePlots, function(p){
- suppressMessages(
- p + coord_flip() + scale_x_reverse() +
- theme(plot.title = element_text(hjust=0), text = element_text(size=10), aspect.ratio = 1.0)
- )
- })
- cowplot::plot_grid(plotlist = imagePlots, ncol = 2)
- ```
- ## Session info
- ```{r echo=TRUE}
- sessionInfo()
- ```
geseca-tutorial.Rmd at commit 570f590, under MIT · at the source
Overview
- Guangdong Eye Institute, Department of Ophthalmology, Guangdong Provincial People's Hospital (Guangdong Academy of Medical Sciences) Southern Medical University Guangzhou China
- State Key Laboratory of Ophthalmology, Zhongshan Ophthalmic Center Sun Yat‐sen University, Guangdong Provincial Key Laboratory of Ophthalmology Visual Science Guangzhou China
- College of Life Sciences University of Chinese Academy of Sciences Beijing China
- Analysis Center of Agrobiology and Environmental Sciences Zhejiang University Hangzhou China
- Shenzhen Eye Hospital, Shenzhen Eye Medical Center Southern Medical University Shenzhen China
- Department of Eye and Vision Sciences, Institute of Life Course and Medical Sciences University of Liverpool Liverpool UK
- Singapore Eye Research Institute Singapore National Eye Center Singapore Singapore
- Centre for Eye Research Australia, University of Melbourne, Department of Surgery (Ophthalmology) University of Melbourne Melbourne Australia
- Joint Shantou International Eye Center of Shantou University and The Chinese University of Hong Kong Shantou China
Abstract
Retinal ischemia‐reperfusion (RIR) injury is a central mechanism underlying irreversible vision loss in glaucoma and other retinal diseases, yet the spatial organization of the pathogenic microenvironment remains poorly understood. Here, we constructed a high‐resolution, whole‐eye spatial multi‐omics atlas integrating Stereo‐seq transcriptomics and MALDI‐MSI‐based metabolomics to capture the early molecular events in the RIR mouse model. Spatially, retinal ganglion cell (RGC) interactions with surrounding cells were markedly reduced after injury, whereas immune–glial interactions were enhanced, revealing a shift from a neuron‐centered to an immunometabolic state. Within the ganglion cell layer (GCL), the primary pathological locus, we identified Trem2 + microglia that expand in situ, establish close proximity to degenerating RGCs, and exhibit strong spatial association with dysregulated sphingolipid metabolism. Mechanistically, using Trem2 knockout mice and microglia‐specific Trem2 siRNA knockdown, we demonstrate that TREM2 directly binds to SPTLC2, the rate‐limiting enzyme of de novo sphingolipid biosynthesis, driving ceramide‐centric metabolic reprogramming that modulates the AKT‐mTOR signaling axis and amplifies inflammatory activation. Pharmacological inhibition of serine palmitoyl transferase (SPT) with myriocin reverses this cascade, protecting RGCs. Multi‐omics integration of human glaucoma aqueous humor datasets further reveals conserved upregulation of sphingolipid biosynthetic enzymes, sphingolipid metabolites, and lipid‐sensing immune effectors, offering preliminary translational clues. Collectively, our findings reveal that spatially defined immunometabolic remodeling—in which Trem2 + microglia are central—converges on sphingolipid metabolism as a druggable regulatory axis, with the TREM2‐SPTLC2 interface thus emerging as a new therapeutic opportunity for retinal neurodegenerative diseases.
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 10 matches between paragraphs and lines of code.
alserglab/fgsea
570f5903545835cb340e699fcdfdf444b1ba07ec, 22 September 2026Availability: 1 check, the latest on 26 September 2026: the link answers
- 26 September 2026: the link answers
53 files
- R/
RcppExports.R — R, 59 lines - R/
fgsea-package.R — R, 38 lines - R/
fgsea.R — R, 743 lines - R/
fgseaMultilevel.R — R, 295 lines - R/
fgseaORA.R — R, 146 lines - R/
geseca-multilevel.R — R, 381 lines - R/
geseca-plot.R — R, 555 lines - R/
geseca-simple.R — R, 151 lines - R/
geseca-utils.R — R, 70 lines - R/
pathways.R — R, 97 lines - R/
plot.R — R, 286 lines - R/
util.R — R, 45 lines - data-raw/
exampleExpressionMatrix. — R, 5 linesR - data-raw/
examplePathways.R — R, 6 lines - data-raw/
exampleRanks.R — R, 6 lines - inst/
exact/ — C++, 139 linesexact.cpp - inst/
exact/ — R, 52 linesrunFgsea.R - inst/
gen_gene_ranks.R — R, 29 lines - inst/
gen_gse14308_expression_ — R, 21 linesmatrix.R - inst/
gene_reactome_pathways.R — R, 25 lines - inst/
gse19429_gsea.R — R, 17 lines - inst/
run_broad_gsea.R — R, 30 lines - inst/
th1_gsea.R — R, 201 lines - src/
RcppExports.cpp — C++, 105 lines - src/
ScoreCalculation.cpp — C++, 43 lines - src/
ScoreCalculation.h — C/C++, 22 lines - src/
ScoreRuler.cpp — C++, 172 lines - src/
ScoreRuler.h — C/C++, 43 lines - src/
esCalculation.cpp — C++, 75 lines - src/
esCalculation.h — C/C++, 98 lines - src/
fastGSEA.cpp — C++, 502 lines - src/
fastGSEA.h — C/C++, 55 lines - src/
fgseaMultilevel.cpp — C++, 55 lines - src/
fgseaMultilevel.h — C/C++, 25 lines - src/
fgseaMultilevelSupplemen — C++, 494 linest.cpp - src/
fgseaMultilevelSupplemen — C/C++, 104 linest.h - src/
geseca.cpp — C++, 29 lines - src/
geseca.h — C/C++, 13 lines - src/
util.cpp — C++, 82 lines - src/
util.h — C/C++, 31 lines - test.R — R, 5 lines
- tests/
testthat.R — R, 9 lines - tests/
testthat/ — R, 52 linestest_fora.R - tests/
testthat/ — R, 103 linestest_geseca.R - tests/
testthat/ — R, 289 linestest_gsea_analysis.R - tests/
testthat/ — R, 261 linestest_gsea_multilevel.R - tests/
testthat/ — R, 202 linestest_gsea_stat.R - tests/
testthat/ — R, 18 linestest_pathways.R - tests/
testthat/ — R, 54 linestest_plot.R - vignettes/
fgsea-tutorial.Rmd — R, 183 lines - vignettes/
geseca-tutorial.Rmd — R, 536 lines, 2 matches - LICENCE — License, 20 lines
- README.md — Text, 103 lines
pienapple1/eyeball_STSM
25b0e5bfff66ec91a343c292b22257d1800df964, 16 September 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
46 files, not copied: shown from their source
OSCR keeps no copy of these files: this repository has no license that allows it. The reader above shows each one from its source, fetched by your browser at commit 25b0e5b, when its fingerprint is the one OSCR verified. How this works.
- 01figure1/
.ipynb_checkpoints/ — Jupyter, 227 lines, shown from its sourcefig 1C-checkpoint.ipynb - 01figure1/
.ipynb_checkpoints/ — Python, 88 lines, shown from its sourcefig 1D-checkpoint.py - 01figure1/
.ipynb_checkpoints/ — Jupyter, 75 lines, shown from its sourcefig 1E-checkpoint.ipynb - 01figure1/
.ipynb_checkpoints/ — Jupyter, 71 lines, shown from its sourcefig 1F-checkpoint.ipynb - 01figure1/
.ipynb_checkpoints/ — Jupyter, 81 lines, shown from its sourcefig 1G-checkpoint.ipynb - 01figure1/
fig 1C.ipynb — Jupyter, 227 lines, shown from its source - 01figure1/
fig 1D.py — Python, 88 lines, shown from its source - 01figure1/
fig 1E.ipynb — Jupyter, 75 lines, 2 matches, shown from its source - 01figure1/
fig 1F.ipynb — Jupyter, 71 lines, shown from its source - 01figure1/
fig 1G.ipynb — Jupyter, 81 lines, shown from its source - 02figure2/
.ipynb_checkpoints/ — Jupyter, 193 lines, shown from its sourcefig 2A-B-checkpoint.ipynb - 02figure2/
.ipynb_checkpoints/ — Jupyter, 232 lines, shown from its sourcefig 2C-checkpoint.ipynb - 02figure2/
.ipynb_checkpoints/ — Jupyter, 70 lines, shown from its sourcefig 2D-checkpoint.ipynb - 02figure2/
.ipynb_checkpoints/ — Jupyter, 328 lines, shown from its sourcefig 2E-checkpoint.ipynb - 02figure2/
fig 2A-B.ipynb — Jupyter, 189 lines, 1 match, shown from its source - 02figure2/
fig 2C.ipynb — Jupyter, 232 lines, shown from its source - 02figure2/
fig 2D.ipynb — Jupyter, 70 lines, 1 match, shown from its source - 02figure2/
fig 2E.ipynb — Jupyter, 267 lines, 1 match, shown from its source - 03figure3/
.ipynb_checkpoints/ — Jupyter, 372 lines, shown from its sourcefig 3A-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 230 lines, shown from its sourcefig 3B-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 338 lines, shown from its sourcefig 3C-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 139 lines, shown from its sourcefig 3D-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 157 lines, shown from its sourcefig 3E-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 116 lines, shown from its sourcefig 3F-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 155 lines, shown from its sourcefig 3H-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 263 lines, shown from its sourcefig 3I-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 202 lines, shown from its sourcefig 3J-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 276 lines, shown from its sourcefig 3K-checkpoint.ipynb - 03figure3/
.ipynb_checkpoints/ — Jupyter, 178 lines, shown from its sourcefig 3M-checkpoint.ipynb - 03figure3/
fig 3A.ipynb — Jupyter, 372 lines, 2 matches, shown from its source - 03figure3/
fig 3B.ipynb — Jupyter, 230 lines, shown from its source - 03figure3/
fig 3C.ipynb — Jupyter, 346 lines, shown from its source - 03figure3/
fig 3D.ipynb — Jupyter, 147 lines, shown from its source - 03figure3/
fig 3E.ipynb — Jupyter, 165 lines, shown from its source - 03figure3/
fig 3F.ipynb — Jupyter, 124 lines, shown from its source - 03figure3/
fig 3H.ipynb — Jupyter, 163 lines, shown from its source - 03figure3/
fig 3I.ipynb — Jupyter, 268 lines, shown from its source - 03figure3/
fig 3J.ipynb — Jupyter, 202 lines, 1 match, shown from its source - 03figure3/
fig 3K.ipynb — Jupyter, 276 lines, shown from its source - 03figure3/
fig 3M.ipynb — Jupyter, 177 lines, shown from its source - 04figure5/
.ipynb_checkpoints/ — R, 79 lines, shown from its sourcefigure 5A-checkpoint.R - 04figure5/
.ipynb_checkpoints/ — Jupyter, 635 lines, shown from its sourcefigure 5D-J-checkpoint.ipynb - 04figure5/
figure 5A.R — R, 79 lines, shown from its source - 04figure5/
figure 5D-J.ipynb — Jupyter, 596 lines, shown from its source - 05figure6/
.ipynb_checkpoints/ — Jupyter, 634 lines, shown from its sourcefig 6A-B & sup8-checkpoint.ipynb - 05figure6/
fig 6A-B & sup8.ipynb — Jupyter, 417 lines, shown from its source - This repository has no license: its authors keep all rights. Read it at the source.
The paper's code and data availability statement is in the Data section.
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;
- 97 scripts, each with its path and the digest of its content;
- 10 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
No dataset and no data link were found in the paper.
Data availability statement
The data that support the findings of this study are available from the corresponding author upon reasonable request. Data generated during this study have been deposited in the Genome Sequence Archive in BIG Data Center, Beijing Institute of Genomics (BIG, 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 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 13 authors, 5 keywords, 4 funders, 78 references.
Cite
This paper
Shi, Y., Lin, J., Wu, Y., Xu, S., Zhang, N., Pan, Y., Ren, A., Fang, Y., Huang, Y., Zhang, X., Zhu, Z., Zhuo, Y., & Yu, H. (2026). Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche. iMeta, 5(4), e70163. https://
BibTeX
@article{shi2026spatial,
author = {Shi, Yunhong and Lin, Jinpei and Wu, Yi and Xu, Shengsong and Zhang, Naiyuan and Pan, Yiji and Ren, Anli and Fang, Ying and Huang, Yu and Zhang, Xiayin and Zhu, Zhuoting and Zhuo, Yehong and Yu, Honghua},
title = {{Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche}},
journal = {iMeta},
year = {2026},
month = aug,
volume = {5},
number = {4},
pages = {e70163},
publisher = {Wiley},
issn = {2770-5986},
doi = {10.1002/
url = {https://
pmid = {42630359},
pmcid = {PMC13494123}
}
RIS
TY - JOUR
AU - Shi, Yunhong
AU - Lin, Jinpei
AU - Wu, Yi
AU - Xu, Shengsong
AU - Zhang, Naiyuan
AU - Pan, Yiji
AU - Ren, Anli
AU - Fang, Ying
AU - Huang, Yu
AU - Zhang, Xiayin
AU - Zhu, Zhuoting
AU - Zhuo, Yehong
AU - Yu, Honghua
TI - Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche
T2 - iMeta
J2 - Imeta
PY - 2026
DA - 2026/
VL - 5
IS - 4
SP - e70163
SN - 2770-5986
PB - Wiley
DO - 10.1002/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1002/
"type": "article-journal",
"title": "Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche",
"container-title": "iMeta",
"author": [
{
"family": "Shi",
"given": "Yunhong"
},
{
"family": "Lin",
"given": "Jinpei"
},
{
"family": "Wu",
"given": "Yi"
},
{
"family": "Xu",
"given": "Shengsong"
},
{
"family": "Zhang",
"given": "Naiyuan"
},
{
"family": "Pan",
"given": "Yiji"
},
{
"family": "Ren",
"given": "Anli"
},
{
"family": "Fang",
"given": "Ying"
},
{
"family": "Huang",
"given": "Yu"
},
{
"family": "Zhang",
"given": "Xiayin"
},
{
"family": "Zhu",
"given": "Zhuoting"
},
{
"family": "Zhuo",
"given": "Yehong"
},
{
"family": "Yu",
"given": "Honghua"
}
],
"container-title-short":
"volume": "5",
"issue": "4",
"page": "e70163",
"DOI": "10.1002/
"PMID": "42630359",
"PMCID": "PMC13494123",
"ISSN": "2770-5986",
"publisher": "Wiley",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
20
]
]
}
}
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.1038/s42003-026-10957-8 [code]
- Brain defence by the extracellular matrix protein Cochlin.Journal: Communications biologyIn common: Monocle 3, edgeR, limma, 23 other tools, mouse, cellular / molecular
- [2] doi:10.1038/s41593-026-02300-5 [code]
- Integrated single-cell and spatial transcriptomic profiling in ALS uncovers peripheral-to-central immune infiltration and reprogramming.Journal: Nature neuroscienceIn common: Harmony, edgeR, anndata, 20 other tools, genetics / omics, cellular / molecular, 1 reference
- [3] doi:10.1186/s13059-026-04177-w [code]
- Genomic sequence evolution underlying human neocortical interareal diversification.Journal: Genome biologyIn common: Monocle 3, rstatix, anndata, 20 other tools, genetics / omics, mouse, cellular / molecular
- [4] doi:10.1126/sciadv.aeg3223 [code]
- The extreme diversity of retinal amacrine cells has deep evolutionary roots.Journal: Science advancesIn common: rstatix, anndata, DESeq2, 19 other tools, genetics / omics, cellular / molecular, 1 reference
- [5] 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: edgeR, limma, rstatix, 20 other tools, genetics / omics
- [6] doi:10.1016/j.cpblue.2026.100007 [code]
- An integrated single-cell and spatial proteotranscriptomics atlas of fibroblast-driven immunoregulation within the human adult oral cavity.Journal: Cell press blueIn common: SingleCellExperiment, edgeR, limma, 20 other tools
- [7] doi:10.1038/s44318-026-00818-9 [code]
- FAM134B-mediated ER-phagy degrades APP and suppresses Alzheimer's disease pathology.Journal: The EMBO journalIn common: Monocle 3, Harmony, SingleCellExperiment, 19 other tools, mouse, cellular / molecular
- [8] doi:10.1038/s41593-026-02367-0 [code]
- A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes.Journal: Nature neuroscienceIn common: Monocle 3, Harmony, SingleCellExperiment, 16 other tools, cellular / molecular
- [9] doi:10.1038/s41586-026-10629-x [code]
- Whole-genome duplication shaped cell-type evolution in the vertebrate brain.Journal: NatureIn common: Harmony, rstatix, anndata, 19 other tools, genetics / omics, mouse, cellular / molecular
- [10] doi:10.1038/s41380-026-03629-w [code]
- Maternal fasting during early gestation induces epigenetic alterations and schizophrenia-related phenotypes.Journal: Molecular psychiatryIn common: Harmony, limma, anndata, 16 other tools, genetics / omics, mouse, cellular / molecular, 2 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, 97 scripts, and 10 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:afeb4faaa5cb7a1e…
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.
