Thank you Panos for taking the time to reply to me. I was also thinking of proceeding in this way (5 TR vs CTL 1,2,3).
Hi everyone, I’m analyzing a bacterial RNA-seq experiment with two conditions: TR (treated): 5 biological replicates and CTL (control): 5 biological replicates
What I observe (problem): In unsupervised QC (PCA on VST/rlog, sample distances), two CTL controls consistently appear “intermediate” between CTL and TR: CTL-4 and CTL-5.
HISAT2 overall alignment rate:
CTL-1/2/3: ~97%, CTL-4: 91.90%
CTL-5: 91.34%
TR samples: ~93.9–96.2%
featureCounts assignment is in the ~30–41% range for all samples; CTL-4/5 are slightly lower than other CTL but not dramatically. Expression-based diagnostics supporting “TR-like CTL”.
I computed an “TR marker score” using a set of TR marker genes (mean VST expression across the marker set):
TR samples: 10.11–10.43
CTL-1/2/3: 3.55–3.71
CTL-4: 7.8687
CTL-5: 7.8482
I also computed a centroid-correlation diagnostic (top 2000 variable genes; correlation to CTL centroid vs TR centroid): For CTL samples, delta = cor_to_CTL - cor_to_TR:
CTL-1/2/3: ~0.322–0.326
CTL-4: 0.0405
CTL-5: 0.0502
So CTL-4/CTL-5 correlate almost equally to CTL and TR centroids (much closer to TR than the other CTL replicates).
Differential expression approaches compared I compared 4 scenarios (FDR < 0.05 and |logFC| > 1):
All samples (5 TR vs 5 CTL) - limma-trend on logCPM
DE genes: 990
All samples (5 TR vs 5 CTL) - limma::voomWithQualityWeights()
DE genes: 1527
Clean CTL only (5 TR vs 3 CTL) dropping CTL-4/CTL-5 - limma-trend
DE genes: 1636
Clean CTL only (5 TR vs 3 CTL) dropping CTL-4/CTL-5 - voomWithQualityWeights
DE genes: 1612
Sample quality weights (scenario 5 TR vs 5 CTL with voomWithQualityWeights):
CTL-4: 0.186
CTL-5: 0.192
other CTL: 2.287–2.878 (also TR-4 and TR-5 have lower weights: 0.441 and 0.570)
So voomWithQualityWeights strongly down-weights CTL-4/CTL-5.
Sensitivity / stability checks: When I drop both CTL-4 and CTL-5 and compare DE results to the baseline voomQW-all analysis:
baseline voomQW (5 vs 5): nDE = 1527
drop CTL-4/CTL-5 voomQW (5 vs 3): nDE = 1612
common DE genes: 1510
same direction: 100%
correlation of logFC: 0.9998
Set overlap (Jaccard) on DE gene sets:
voomQW (all) vs standard (clean):
Jaccard = 0.836 (common=1440)
standard (all) vs standard (clean):
Jaccard = 0.559 (common=942)
standard (clean) vs voomQW (clean):
Jaccard = 0.851 (common=1493)
Lab records indicate no sample mix-up/swapping (consistent sample tracking during extraction/library prep). Given CTL-4/CTL-5 look biologically TR-like by marker score and centroid correlation (not just noisy), what’s the most defensible way to proceed?
- Main analysis = 5 vs 5 with voomWithQualityWeights (and report weights)?
- Main analysis = 5 vs 3 (drop CTL-4/CTL-5) with voomWithQualityWeights, and report 5 vs 5 voomQW as sensitivity?
- Should I treat CTL-4/CTL-5 as a third group (“suspected mislabel / contamination / partial treatment”) and exclude them from the primary contrast?
In your experience, which additional checks are most convincing to distinguish mislabel/contamination vs batch/technical artifact when I don’t have genotyping/fingerprinting? Thank you very much to anyone who is willing to help me.
1 answer
What I've been doing in similar cases was to exclude the "mis-behaving" replicate(s). In your case, I would run a differential expression analysis using all 5 TR samples vs 3 CTL (1, 2, 3). But, just for the sake of comparison (or curiosity!), you can also try a DE analysis with 5 vs 5. To be fair, CTL_4 and CTL_5 are not grouping with the TR samples, so it makes sense to try a 5-vs-5 DE analysis. However, it's clear that something happened during handling, sequencing etc of the samples.
One way you can check for contamination is by drawing Krona plots; BLAST (Diamond BLAST, to be precise) your short reads against a database such as Uniref (Uniref50 is the one I usually use), then get the first (best) hit for each read, extract the taxon name from which the hit originates and give it as input to Krona. Krona will then draw those nice hierarchical taxonomy plots. However, I haven't tried running Krona with bacterial RNAseq data and I don't know how good it works... In the insect samples that I've tried, there was one case in which the contamination was from the plant that those insects were eating; so, there was a very clear picture in Krona.
Log in to answer this question.
Post in its current form is hard to read. Can you format relevant portions of the post as
code(using10101button in edit mode after selecting text)? Without some visual aid (plot etc) people may not be inclined to read this mass of text.I would have tried to format the post but I don't want to remove any data/change its format that may be important for your post. I just tidied up the questions at the end as a list.
Thank you very much for your suggestions :)
Just run
Kraken2on the raw reads. If there's actual contamination that's documented in current sequence databases (the ones the tool uses anyway), it will show up, and you could filter these out. You could also runSortMeRNA(on the raw reads again), take the rRNA reads the tool identifies, and see if you get hits to possible contaminants viaBLAST. If you've assembled the transcriptome, maybe try running NCBI'sFCStool on it. This should flag all kinds of contaminants.There is another possibility: the variation in your control samples may actually be that large. Why should multiple individual organisms (even bacteria) be "sufficiently" identical at some arbitrary threshold just because some experimenter assumes that they have controlled for all sources of variation? Maybe your treatment actually defines a narrower trait space that the organisms are coerced into existing in (hence the better clustering) than the control (treatment).