Inferensys

Glossary

Counts Per Million (CPM)

Counts Per Million (CPM) is a simple normalization unit representing the raw read count for a gene scaled by the total number of mapped reads in the sample and multiplied by one million, primarily used for filtering lowly expressed genes.
Developer demonstrating multi-agent tool use, agent tool selection interface on laptop, casual tech demo moment.
RNA-SEQ NORMALIZATION

What is Counts Per Million (CPM)?

A fundamental unit of measurement in RNA sequencing that scales raw gene counts by library size to enable preliminary comparisons.

Counts Per Million (CPM) is a simple normalization metric representing the raw read count for a gene divided by the total number of mapped reads in a sample, multiplied by one million. It accounts for differences in sequencing depth between samples, making counts comparable when library sizes vary. CPM does not normalize for gene length, so longer genes will inherently have higher CPM values than shorter genes at the same expression level.

CPM is primarily used as a filtering criterion rather than for downstream differential expression analysis. Researchers apply a CPM threshold—often requiring a minimum CPM in a certain number of samples—to remove genes with lowly expressed transcripts before statistical testing. This pre-filtering step reduces the burden of multiple testing correction and improves power by eliminating genes unlikely to be biologically meaningful.

RNA-SEQ NORMALIZATION UNITS

CPM vs. TPM vs. RPKM/FPKM

Comparison of three common normalization units for RNA-seq expression data, highlighting their calculation order, handling of gene length, and suitability for different analytical tasks.

FeatureCPMTPMRPKM/FPKM

Full Name

Counts Per Million

Transcripts Per Million

Reads/Fragments Per Kilobase per Million

Normalization Order

Sequencing depth only

Gene length, then sequencing depth

Sequencing depth, then gene length

Corrects for Gene Length

Corrects for Sequencing Depth

Sum of Values per Sample

Equals 1,000,000

Equals 1,000,000

Variable; not constrained

Comparable Across Samples

Within-sample only

Not recommended

Primary Use Case

Filtering lowly expressed genes

Comparing transcript proportions across samples

Comparing expression within a single sample

Suitable for Differential Expression

Yes, but TPM preferred

NORMALIZATION FUNDAMENTALS

Key Characteristics of CPM

Counts Per Million (CPM) is the foundational unit of RNA-seq expression normalization. It corrects for the primary technical bias—sequencing depth—by scaling raw counts to a common denominator, making it the essential first step for filtering lowly expressed genes.

01

Depth-Normalized Scaling

CPM transforms raw read counts by dividing each gene's count by the total mapped reads in the sample and multiplying by one million. This accounts for varying library sizes between samples, where one sample may have 20 million reads and another 50 million. Without this correction, a gene with 100 reads would appear 2.5x more expressed in the deeper sample purely due to technical bias. CPM places all samples on a comparable scale.

02

The CPM Formula

The calculation is straightforward:

CPM = (Gene Count / Total Mapped Reads) * 10^6

  • Gene Count: Raw number of reads mapping to a gene
  • Total Mapped Reads: Library size for that sample
  • 10^6: Scaling factor for interpretability

A CPM of 1 means that for every million reads sequenced, one read mapped to that gene. This linear scaling preserves the relative proportions of counts within a sample.

03

Primary Use: Low-Expression Filtering

CPM is the standard metric for defining expressed vs. unexpressed genes. A common threshold is a CPM > 1 in at least n samples (where n is the smallest group size). Genes below this threshold are considered noise and removed before differential expression testing. This filtering reduces the multiple testing burden and improves statistical power by eliminating genes with insufficient data for reliable dispersion estimation.

04

Key Limitation: No Gene Length Correction

CPM does not account for gene length. A 5kb gene and a 1kb gene expressed at the same biological level will produce different raw counts because longer transcripts generate more fragments. Consequently, CPM values cannot be directly compared between different genes within the same sample. For within-sample comparisons, use Transcripts Per Million (TPM) or Reads Per Kilobase Million (RPKM). CPM is valid only for comparing the same gene across samples.

05

Relationship to TMM Normalization

CPM is the input to more sophisticated normalization methods like the Trimmed Mean of M-values (TMM) used in edgeR. The TMM algorithm:

  • Calculates CPM for all genes
  • Trims extreme log-ratios and high-expression genes
  • Computes a weighted mean of the remaining M-values
  • Derives sample-specific scaling factors

These factors are then applied to the raw library sizes to produce effective library sizes for downstream analysis.

06

CPM in the Analysis Pipeline

A typical RNA-seq workflow positions CPM as the first normalization step:

  1. Raw counts from alignment/quantification
  2. CPM calculation for initial exploration
  3. Low-expression filtering using CPM thresholds
  4. TMM/RLE normalization for effective library size
  5. Differential expression with DESeq2/edgeR

CPM is also used to generate log-CPM values for visualization (e.g., heatmaps, PCA plots) after adding a small prior count to avoid log(0).

COUNTS PER MILLION EXPLAINED

Frequently Asked Questions

Clear answers to common questions about the CPM normalization method, its calculation, appropriate use cases, and how it compares to other RNA-seq expression units.

Counts Per Million (CPM) is a simple normalization unit that represents the raw read count for a gene scaled by the total number of mapped reads in the sample and multiplied by one million. The formula is: CPM = (gene_count / total_mapped_reads) * 1,000,000. This transformation accounts for differences in sequencing depth between samples, allowing for more meaningful comparisons of relative expression levels. For example, if a gene has 50 reads in a sample with 10 million total mapped reads, its CPM value is 5. CPM does not normalize for gene length, making it suitable for within-sample comparisons or between-sample comparisons of the same gene, but inappropriate for comparing expression levels of different genes within the same sample.

Prasad Kumkar

About the author

Prasad Kumkar

CEO & MD, Inference Systems

Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.

His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.