← Guides GWAS and Stratification

Core 15 min read Open the module

GWAS and population stratification

A scan that pools two populations flags SNPs that only track ancestry, and principal components remove most of that signal.

Read first: Population structure with PCA

One test per SNP

A genome-wide association study (GWAS) tests every SNP, one at a time, for association with a trait. For a quantitative trait the test is a linear regression of the phenotype on the genotype dosage (0, 1 or 2 copies). A SNP is called significant if its p-value is below 0.05/M, the Bonferroni line for M tests. With M = 2000 SNPs that is p = 2.5 × 10⁻⁵, or −log₁₀ p = 4.6.

The test assumes that people differ in genotype independently of anything else that affects the trait. A sample that mixes two populations breaks that assumption. Suppose the populations differ in allele frequency at a SNP, because of drift, and also differ in mean trait, because of diet or environment. Then the SNP predicts the trait even though it does nothing to it. This is population stratification.

The module simulates this. Two populations at FST = 0.02 are sampled, 200 people each. Ten causal SNPs explain a heritability of h² = 0.5 within each population. The non-genetic mean of the trait differs between the populations by 0.75 within-population standard deviations. The scan then tests all 2000 SNPs, and the module knows which ones are causal.

The uncorrected scan

Figure 1. Manhattan plot of the uncorrected scan, seed 1, six chromosomes. The dashed line is the Bonferroni threshold. Triangles under the axis mark the 10 causal SNPs. 14 SNPs cross the line. They form 10 spurious loci, and only 2 of the 10 causal loci are found. λGC is 2.60.

Inflation and the QQ plot

A QQ plot sorts the observed p-values and plots them against the values expected if no SNP were associated. Under the null the points follow the diagonal. Stratification lifts the whole cloud, not just a few points. The summary of that lift is the genomic inflation factor λGC, the median χ² statistic divided by its null value, 0.4549. A value of 1 means no inflation.

Inflation has a size that can be predicted. For two equal populations that differ by Δ in mean trait, the mean χ² of a null SNP is about 1 + N F Δ² / 4. Here N = 400, F = 0.02 and Δ = 0.75, so about 2.1. The module adds the small genetic difference that drift also creates at the causal loci, and expects 2.22. The null SNPs in the run average 2.42.

The excess grows with N. A bigger study sees a fixed, small difference more clearly, so it flags more false SNPs. More data makes stratification worse unless it is corrected.

The cloud lifts, then settles

Figure 2. QQ plot of the same study with the uncorrected scan and the scan with 1 PC. The uncorrected points leave the diagonal early (λGC 2.60). With one PC the cloud falls back to the diagonal (λGC 1.09). The null SNPs average a χ² of 2.42 uncorrected, against 2.22 expected.

Exercise

Divide by λGC

Open the module, type the seed 1, set PCs to 1 and run. Switch the analysis to Genomic control and read the strip.

What to expect. Genomic control divides every statistic by λGC = 2.60, so λGC returns to 1.00 and the 10 false loci disappear. The true signals shrink too, and only 1 of 10 causal loci remains, down from 2.

Open the walkthrough step →

Adjusting for ancestry

Genomic control treats ancestry as one uniform inflation. It lowers every statistic by the same factor, true signals included. A better fix measures ancestry directly. The top principal components of the genotypes (see the PCA tutorial) are scores of each person along the axes of population structure. Adding them as covariates in each regression removes the part of the trait that ancestry explains. This is the EIGENSTRAT method.

For two populations one axis is enough, since K populations need K − 1. With 1 PC the scan has λGC = 1.09, finds 4 of the 10 causal loci and has no false loci. Genomic control found 1. The residual 0.09 above 1 can come from the real polygenic signal and from LD with causal SNPs, so λGC alone cannot tell stratification from heredity.

The PCs come from a subset of at most 600 LD-thinned SNPs. One PC suits two populations. Continuous structure or relatedness needs more PCs, or a mixed model, which this module does not include.

The corrected scan

Figure 3. The same study with 1 PC as a covariate. The y axis is the same as in the uncorrected plot. The spurious peaks are gone. 5 SNPs cross the line, no false loci remain, and 4 of the 10 causal loci are found. λGC is 1.09.

Exercise

A bigger study

With the seed 1 and PCs at 1, set N to 1000 and run. Read the uncorrected strip, switch to +1 PC, and read the effect size needed for 80% power.

What to expect. The uncorrected scan gets worse: λGC 4.19 and 44 false loci. With 1 PC it finds 8 of the 10 causal loci with none false. A study of 1000 reaches 80% power for an effect of q² = 2.52% of the variance, against 6.19% at N = 400. Then set Shift to 0 at N = 400: λGC falls to 1.14, because only the genetic difference is left.

Open the walkthrough step →

Summary

  • A GWAS tests each SNP separately and calls p below 0.05/M significant; here M = 2000.
  • Two populations that differ in both allele frequency and mean trait make unrelated SNPs look associated.
  • The mean χ² of a null SNP rises by about N F Δ² / 4, so inflation grows with sample size.
  • Genomic control divides by λGC and removes false loci, but it also shrinks true signal.
  • PC covariates (K − 1 of them) remove most of the ancestry effect and keep more true signal.
  • In the run at seed 1, uncorrected: 10 false loci and 2 of 10 true; with 1 PC: 0 false and 4 of 10 true.