The Complete Guide to qPCR Relative Quantification: Livak 2^-ddCt vs. Pfaffl Model

The mathematical derivation of Livak and Schmittgen ΔΔCt, housekeeping-gene normalisation, Pfaffl efficiency correction and error propagation.

The 2^-ΔΔCt method is four subtractions and an exponent. Almost every wrong fold change comes from one of three places: the wrong thing counted as n, an efficiency assumption nobody checked, or statistics done on the fold change instead of on the ΔCt.

**The short answer.** Subtract your reference gene from your target within each sample, subtract the control group's mean from that, and raise 2 to the negative of the result. Do the statistics in ΔCt space, not on fold change. And if your target and reference genes amplify at different efficiencies, 2 is the wrong base — use Pfaffl.

**Step 1 — normalise within the sample (ΔCt).** For each biological replicate, ΔCt = Ct(target) − Ct(reference). The reference gene has to come from the *same* sample, because that is the entire point: it cancels differences in how much cDNA went into the well. Normalising against a reference measured in a different sample cancels nothing.

With more than one reference gene, take the arithmetic mean of their Ct values. That is not a shortcut — Ct is already a log2 quantity, so the arithmetic mean of Cts *is* the geometric mean of the underlying quantities, which is what geNorm (Vandesompele et al., 2002) prescribes. Taking exp(mean(ln(Ct))) instead computes the geometric mean of the cycle numbers, which has no defined meaning, and happens to sit close to the right answer over a narrow Ct range — which is why that mistake survives in a lot of spreadsheets.

**Step 2 — compare to the calibrator (ΔΔCt).** ΔΔCt = ΔCt(sample) − mean ΔCt(control group). Note that the control's *mean* is subtracted. The control group therefore comes out at a fold change of exactly 1.0 by construction, which is a property of the arithmetic and not evidence that the control behaved.

**Step 3 — fold change.** Fold change = 2^(−ΔΔCt). The 2 encodes an assumption: that every cycle doubles the product, i.e. 100% amplification efficiency for both genes.

**Where n comes from, and why this matters more than the arithmetic.** Three wells of the same cDNA are technical replicates. They measure your pipetting. They are not three independent observations of the biology, and averaging them into an n of 3 is pseudoreplication — it shrinks the confidence interval and manufactures significance.

The replicate hierarchy that matters is: condition → biological replicate (a separate animal, passage, or transfection) → technical replicates (wells). Average the technical replicates within each biological replicate, then do everything downstream — spread, intervals, p-values — across biological replicates only. If you have one biological replicate measured in triplicate, you have n = 1, and no p-value is available at any amount of arithmetic. SciKeep refuses to print one in that case and says why, which is the behaviour this whole tool exists for.

**Do the statistics on ΔCt, never on fold change.** Ct is logarithmic, so ΔCt is a log-ratio and is approximately normal. Fold change is its exponential, and is log-normal — strongly right-skewed. Averaging fold changes biases the estimate upward, and a t-test on them violates the normality it assumes (Yuan et al., *BMC Bioinformatics* 2006).

So: take the mean in ΔCt space, run the test in ΔCt space, and exponentiate once at the end for display. Error propagates the same way — combine the standard errors of the two groups in ΔCt space,

SD(ΔΔCt) = √(SD²treated + SD²control)

and exponentiate the bounds, which produces an asymmetric interval: [2^−(ΔΔCt + SD), 2^−(ΔΔCt − SD)]. That asymmetry is real and should not be tidied into a symmetric error bar. A fold change of 4 with an interval of 2.8 to 5.7 is telling you something the notation "4 ± 1.4" cannot.

**When 2 is the wrong base: the Pfaffl model.** The comparative method assumes both genes double every cycle. Real assays do not. A primer pair at 95% efficiency and another at 105% will drift apart, and the error compounds with the size of the ΔΔCt.

Pfaffl (2001) corrects for it by raising each gene to *its own* measured efficiency:

ratio = E_target^ΔCt(target, control−sample) / E_ref^ΔCt(ref, control−sample)

The detail that is easy to get wrong — and that SciKeep itself got wrong until September 2026 — is that the reference gene's efficiency applies to the *reference gene's* Ct difference. Applying the target's efficiency to the whole ΔΔCt is not Pfaffl; with E_target = 1.9 and E_ref = 2.1 over a 2-cycle target shift and a 1-cycle reference shift it gives 1.90-fold where the correct answer is 1.72. Roughly a 10% error, growing with the efficiency gap.

When both efficiencies are 100%, Pfaffl reduces exactly to 2^-ΔΔCt. So the comparative method is the special case, not the default.

To use it you need real efficiencies, which means a standard curve: a dilution series across at least three orders of magnitude, four or more points, E = 10^(−1/slope) − 1, and R² ≥ 0.98. MIQE (Bustin et al., 2009) asks you to report them, and it is one of the most commonly skipped requirements in published qPCR.

**Choosing reference genes is an empirical question, not a habit.** GAPDH and ACTB are conventions, not constants. Both change with treatment in plenty of systems, and normalising to a gene that responds to your treatment moves the effect into the denominator — which can shrink a real difference or reverse its direction.

Test the candidates you actually use. The geNorm M statistic measures a gene's average pairwise variation against the other candidates across your samples; below 0.5 is the usual practical cut for homogeneous sample sets. It takes one extra plate, once, per system.

**A short checklist before you report a fold change.**

- n is biological replicates, and you can say what one replicate physically is. - Technical replicates were averaged within replicate, not pooled across. - The statistics were run on ΔCt. - Amplification efficiency is known for both genes, and Pfaffl was used if they differ. - Reference gene stability was checked in *these* samples, not assumed. - Melt curves show one product per assay. - The error bars state what they are, and the interval is asymmetric on the fold-change axis.

**What the calculator does.** SciKeep's ΔΔCt engine takes one row per well, averages technical replicates within each biological replicate, computes Livak or efficiency-corrected Pfaffl, runs Welch's t-test or one-way ANOVA on ΔCt values, corrects across target genes, reports geNorm M for multiple reference genes, and declines to produce a p-value when the design cannot support one. It does not decide which genes are appropriate references, and it cannot tell you whether your primers amplify what you think they do.

All articles · SciKeep tools

SciKeepLoading SciKeep…