集団構造解析

集団構造解析

この章では、SNP データがあるときに行える解析の一例として集団構造解析を紹介する。

集団構造とは

生物集団には、遺伝的な多様性が存在する。これらの多様性は地理的な障壁や選択、移住などによって生じ、集団構造と呼ばれる。集団構造解析では、多型データからこれらの集団構造を推定することができる。

集団構造解析のソフトウェアには、MCMC (マルコフ連鎖モンテカルロ法) による STRUCTURE (opens in a new tab)ADMIXTURE (opens in a new tab), 行列分解に基づく sNMF (opens in a new tab), 主成分分析などがある。

ここでは、主成分分析を用いて集団構造解析を行う。

RStudio を起動し、以下のファイルを実行する。

pca.R

require(vcfR)
require(pcaMethods)

seed <- 123
set.seed(seed)
first_pc <- 1
last_pc <- first_pc + 1

vcf_filename <- "/<path>/<to>/snp_filtered.vcf.gz"

# prepare genotype data
vcf <- read.vcfR(vcf_filename)
chrom <- getCHROM(vcf)
chrom <- sub("NC_053035.2", "1", chrom)
chrom <- sub("NC_053036.2", "2", chrom)
chrom <- sub("NC_053037.2", "3", chrom)
chrom <- sub("NC_053038.2", "4", chrom)
chrom <- sub("NC_053039.2", "5", chrom)
chrom <- sub("NC_053040.2", "6", chrom)
chrom <- sub("NC_053041.2", "7", chrom)
chrom <- sub("^N.*$", "100", chrom)
pos <- getPOS(vcf)
genotype <- extract.gt(vcf)
genotype.score <- matrix(NA, nrow(genotype), ncol(genotype))
genotype.score[genotype == "0/0"] <- -1
genotype.score[genotype == "0/1"] <- 0
genotype.score[genotype == "1/1"] <- 1
rownames(genotype.score) <- rownames(genotype)
colnames(genotype.score) <- colnames(genotype)
genotype.score <- t(genotype.score)

# remove column with all NaN
genotype_for_pca <- genotype.score[, colSums(is.na(genotype.score)) < nrow(genotype.score)]

# filter by NaN rate
genotype_for_pca <- genotype_for_pca[, colSums(is.na(genotype_for_pca)) != nrow(genotype_for_pca)]
rownames(genotype_for_pca) <- sub(".*?_", "", rownames(genotype_for_pca))

# sort by ID
genotype_for_pca <- genotype_for_pca[order(row.names(genotype_for_pca)),]
# execute probablistic principal component analysis
# takes a few minutes
pca <- pcaMethods::pca(genotype_for_pca, "ppca", nPcs = 4, seed = seed)
pca_scores <- scores(pca)

par(pty="s")
first_pc_contrib = R2cum(pca)[first_pc]
if (first_pc != 1) {
  first_pc_contrib = first_pc_contrib - R2cum(pca)[first_pc - 1]
}
second_pc_contrib = R2cum(pca)[last_pc] - R2cum(pca)[first_pc]
plot(pca_scores[, first_pc:last_pc],
     pch = 20, 
     xlab = paste("PC", first_pc, " (", round(first_pc_contrib * 100, 2), "%)", sep = ""),
     ylab = paste("PC",  last_pc, " (", round(second_pc_contrib * 100, 2), "%)", sep = "")
)

grid()

References

R のコードは R で GWAS と GS, 岩田洋佳 (opens in a new tab) を参考にしています。