I have a bulk RNASeq dataset which encompass samples from 2 conditions - senescence vs NON (from a mouse disease model). I want to extract a gene signature from this dataset and apply it to scrnaseq dataset (also from the same mouse disease model) in order to find proportion of cells that are senescent.
I have used 2 approaches so far:
- Performed GSEA and ORA on the DE genes (SEN vs NON-SEN). Using core enrichment genes (~25 genes) within cellular senescence GO term I built a gene set score (Seurat's AddModuleScore) and applied it to scrnaseq dataset.
- Assigned an initial weight (padj value along with sign of fold change) to each gene. Extracted mitotic & senescence gene sets in msigdb. Eliminated genes that are cell cycle but are not senescent. Applied a gaussian scoring on the normalized matrix (bulk) to build a classifier to classify genes as SEN vs NON-SEN. I further multiplied this gaussian scoring with the initial weight to form the final weight. Performed GSEA (final weight=rank) and ORA (final weight=thres). However, the significant pathways are not implicated in senescence.
Could you please comment on these 2 approaches? Is there a better method to perform this kind of analysis?
Thanks
1 answer
On approach 1, I'd drop the GO filter. Taking core enrichment genes from within the senescence GO term limits your signature to what's already annotated as senescence, so any real signal in your own DE that isn't annotated just gets discarded, and senescence annotation is patchy at best. You have the exact comparison you care about already, so take the top DE genes by effect size and use those. 25 is also on the small side once dropout hits it, I'd aim for 50-150.
Approach 2 sounds circular, which might be why the pathways look wrong. You're constructing a ranking from the bulk data and then testing whether that ranking is enriched for pathway sets you partly derived from the same prior knowledge. Not much independent information survives that, so "not implicated in senescence" doesn't really mean the signature is bad.
The bigger issue is that AddModuleScore gives you a relative score, not a proportion. Your stated goal is the fraction of senescent cells, and no scoring method hands you that -- you need a threshold, and where the threshold comes from is the genuinely hard part. If you have any population you know to be senescent, calibrate on it. Failing that, fitting a two-component mixture to the score distribution at least makes the assumption explicit. Reporting the shift in score distribution between conditions is usually more defensible than a percentage you had to invent a cutoff for.
Two practical notes. UCell or AUCell behave better than AddModuleScore on sparse data, since they're rank-based rather than depending on randomly sampled control gene sets. And score within cell type rather than pooled -- SASP expression varies a lot between lineages, so a pooled score ends up partly reporting composition rather than senescence.
Last thing, senescent cells are easy to lose in scRNA-seq QC. They're large, often have unusual RNA content, and get filtered as doublets or low-quality. If your senescent fraction comes out suspiciously low, that could be upstream of any scoring decision.
Log in to answer this question.