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
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
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
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.
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.