How RNA-seq works#
RNA sequencing (RNA-seq) measures how much of each gene’s RNA is present in a sample. For this course you never touch raw FASTQ files. You start from a gene-by-sample matrix that someone else already quantified.
This week’s study (GSE199911)#
Parker et al. (2023) sequenced PBMCs from people about one month into acute HIV-1 infection and from contemporaneous uninfected controls recruited in the same setting (GSE199911). The staged course files keep 29 HIV and 46 control samples. The scientific claim in the paper is a large early host response (cell cycle, DNA repair, immune activation). Your job is to recover a similar story with a transparent teaching pipeline: log2 TPM, Welch t-tests, Benjamini–Hochberg FDR, then Enrichr.
From cells to a matrix#
Isolate RNA from a biological sample (here, peripheral blood mononuclear cells, PBMCs).
Make a sequencing library: convert RNA to complementary DNA (cDNA), fragment it, and add adapters.
Sequence millions of short reads on an Illumina instrument.
Align or pseudo-align those reads to a reference transcriptome or genome.
Count how many reads (or fragments) map to each gene in each sample.
The product is a table: rows are genes, columns are samples, and values are abundances. That table is what Module 11 analyzes.
What is a TPM?#
TPM means transcripts per million (for bulk RNA-seq you can read it as “length-normalized abundance scaled to one million”).
Longer genes and deeper libraries collect more reads even when the biological concentration is the same. TPM adjusts for:
Gene length — divide by length (in kilobases) so long genes are not automatically “higher.”
Sequencing depth — scale each sample so the abundances sum to one million.
After that, a TPM of 10 in sample A and a TPM of 10 in sample B are on a comparable relative scale within typical bulk RNA-seq experiments. They are still not absolute molecules per cell.
Why log2(TPM + 1)?#
TPM values are skewed: many genes sit near zero, a few are huge. Taking log2(TPM + 1):
Compresses the dynamic range
Makes differences closer to fold changes (a difference of 1 on the log2 scale is a 2-fold change)
Softens zeros with the
+ 1pseudocount
Differential expression across sample groups#
Differential expression (DE) asks, gene by gene: does abundance differ between groups of samples (here, acute HIV vs uninfected controls)? You get an effect size (fold change or log2 fold change) and a p-value per gene, then adjust for testing thousands of genes at once.
What you will do this week#
A Welch two-sample t-test on log2(TPM + 1) for each gene, followed by Benjamini–Hochberg FDR. That keeps the pipeline simple.
What production RNA-seq DE usually looks like#
Published analyses usually start from integer counts (not TPM) and use models built for over-dispersed count data, often with covariates (batch, sex, age) in the design:
Negative-binomial GLMs — DESeq2 and edgeR estimate a mean–variance relationship per gene (or shared across genes) and test coefficients in a generalized linear model.
Linear models on variance-stabilized or voom-weighted data — limma (often with voom) fits a gene-wise linear model and borrows strength for variance estimation across genes (empirical Bayes).
Resampling — permutation or bootstrap of sample labels (or residuals) can build an empirical null when parametric assumptions worry you; they are slower at genome scale and less common as the primary DE engine than DESeq2/edgeR/limma, but they appear in robustness checks and some specialized designs.
Those tools shine when library sizes differ, many genes are near zero, and you need a design matrix—not only a two-group mean difference. For Module 11, the Welch + FDR path is enough to learn the biostatistics story: effect size, multiple testing, then gene-set summarization with Enrichr.