SNPデータの読み込みにgastonを用いる。

require(gaston) # vcfファイルの読み込み、GRMの計算 
require(cluster) # pam(k-medoids)の実行

データの読み込み。

# vcfファイルの読み込み
bm <- read.vcf("data/HDRA-G6-4-RDP1-RDP2-NIAS.AGCT_MAF005MIS001NR_imputed.vcf.gz") 
## ped stats and snps stats have been set. 
## 'p' has been set. 
## 'mu' and 'sigma' have been set.
bm # データのsummaryが表示される
## A bed.matrix with 1568 individuals and 38769 markers.
## snps stats are set
## ped stats are set

標準化された内積行列(ゲノム関係行列)の計算

standardize(bm) <- "mu_sigma"
B <- GRM(bm) * (ncol(bm) - 1)

関係行列からの距離を計算 \[b_{ij} = -\frac{1}{2}(d_{ij}^2 - d_{i.}^2 - d_{.j}^2 + d_{..}^2)\] \[-2 b_{ij} = d_{ij}^2 - d_{i.}^2 - d_{.j}^2 + d_{..}^2\] \[d_{ij}^2 = -2 b_{ij} + d_{i.}^2 + d_{.j}^2 - d_{..}^2\]

n <- nrow(B)
sum_bii.div.n <- sum(diag(B)) / n
di.2 <- diag(B) + sum_bii.div.n
d..2 <- 2 * sum_bii.div.n
D2 = - 2 * B + matrix(rep(di.2, n), nrow = n, byrow = T) + 
  matrix(rep(di.2, n), nrow = n, byrow = F) - d..2
D2[D2 < 0] <- 0

k-medoidsを実行して、500の代表を選ぶ

k <- 500
res <- pam(sqrt(D2), k, diss = T)
df <- data.frame(id.med = sort(res$id.med))
write.csv(df, "data/id_med.csv", quote = F)