This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Differential expression in pseudobulk snRNA-seq with non-independent pseudobulks

Hi everyone,

I have pseudobulk RNA-seq data generated from snRNA-seq. Each donor contributes one pseudobulk for each cell subtype.

My biological question is whether one cell subtype is transcriptionally different from the remaining subtypes.

For example, if I want to compare Subtype A against all other subtypes, the data are structured as:

Donor 1:
  Subtype A
  Subtype B
  Subtype C
  Subtype D
Donor 2:
  Subtype A
  Subtype B
  Subtype C
...
Donor 7:
  Subtype A
  Subtype B
  Subtype D

Conceptually, I want to compare:

***Subtype A:**
Donor1_A
Donor2_A
...
Donor7_A
vs
**Other:**
Donor1_(B+C+D)
Donor2_(B+C)
...
Donor7_(B+D)*

Since the different subtype pseudobulks originate from the same donor, they are not independent observations.

Would the appropriate approach be to sum the raw counts of all non-target subtypes within each donor, creating one "Other" pseudobulk per donor, and then fit a paired DESeq2 model such as:

design = ~ donor + group

where group is SubtypeA vs Other?

Or is there a better statistical approach for this type of comparison? I'm mainly interested in what would be considered the most appropriate experimental design for this scenario.

rna-seq deseq2 single-cell expression differential

The issue doing this is that if you have different subtype proportions inside each donor, your aggregation will mask this component. Careful if your subtypes are your cell clusters, it would be considered as double dipping.

I have never done it myself but you should be able to have a model design as such : ~ donor + subtype

In the results you should have each comparison (and more) : subtype_B_vs_A, subtype_C_vs_A, subtype_D_vs_A.

Set a coefficient to 0 for each results except these 3. You could give them a -1/3 coefficient like :

L["intercept"] <- 0
...
L["subtype_B_vs_A"] <- -1/3
L["subtype_C_vs_A"] <- -1/3
L["subtype_D_vs_A"] <- -1/3

And rerun the contrast : results(dds, contrast = L)

Which should in theory give you A versus rest.

0 answers

No answers yet.

Log in to answer this question.