SNPデータの読み込み、GWA解析にgastonを用いる。Rのパッケージインストーラで簡単にダウンロード・インストールできる。
require(gaston) # for reading a vcf file and performing GWAS
require(mvtnorm) # 多変量正規分布に従う乱数の発生
シミュレーションの一連の解析を行う関数を作る(GWASSimのパーツの寄せ集め)
gwas.sim <- function(bm.sim, grm, eigen.grm, settings) {
w.qtn <- settings$w.qtn
n.qtn <- length(w.qtn)
g.var.ratio <- settings$g.var.ratio
he <- settings$he
fdr.thresh <- settings$fdr.thresh
n <- ncol(bm.sim)
qtn.id <- sample(n, n.qtn) # n.qtn個のSNPをQTNとして無作為に選ぶ
X.qtn <- as.matrix(bm.sim[, qtn.id]) # QTNの遺伝子型スコアを抜き出す
g.qtn <- as.vector(X.qtn %*% w.qtn) # QTNによる変異を全系統について計算
var_g.poly <- var(g.qtn) # ここでは、50%に設定
g.poly <-
as.vector(rmvnorm(1, sigma = grm * var(g.qtn) * g.var.ratio))
g <- g.qtn + g.poly # 遺伝子型値 = QTNの効果 + ポリジーン効果
var.e <- (1 - he) / he * var(g) # 環境分散を計算する
e <- rnorm(length(g), sd = sqrt(var.e)) # var.eを分散にもつ環境変異を生成
y <- g + e # 遺伝変異に環境変異を加えて表現型変異を計算する
gwa.sim <- association.test(
bm.sim,
Y = y,
method = "lmm",
response = "quantitative",
test = "wald",
eigenK = eigen.grm,
p = 4
)
fdr <- p.adjust(gwa.sim$p, method = "BH")
n.detected <-
sum(bm.sim@snps$id[qtn.id] %in% gwa.sim$id[fdr < fdr.thresh])
fnr.obs <- 1 - n.detected / n.qtn # 1 - 全QTNのうちの検出されたQTNの割合
is.true <- rep(F, nrow(bm.sim@snps)) # QTNおよびその周辺であれば真になる
range <- 200000 # QTNから200kb以内は、正しく検出したものとする
for (i in 1:n.qtn) {
qtn <- bm.sim@snps[qtn.id[i], ] # 1つのQTNずつ調べる
cond.chr <- bm.sim@snps$chr == qtn$chr # 染色体番号が一致するか?
cond.pos1 <- bm.sim@snps$pos > qtn$pos - range # QTNの位置より-range〜
cond.pos2 <- bm.sim@snps$pos < qtn$pos + range # +rangeに入っているか?
is.true <-
is.true | (cond.chr & cond.pos1 & cond.pos2) # QTNおよびその周辺
}
fdr.obs <-
sum(!(is.true) & fdr < fdr.thresh) / sum(fdr < fdr.thresh)
fpr.obs <-
sum(!(is.true) & fdr < fdr.thresh) / sum(!(is.true))
c(fnr.obs, fdr.obs, fpr.obs)
}
データを読み込み、一部を利用。
# 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
解析のためのデータの準備
id.med <- read.csv("data/id_med.csv", row.names = 1)$id.med # 代表500系統のid
bm.sim <- bm[id.med, ] # idのある系統を抽出
standardize(bm.sim) <- "mu_sigma"
grm <- GRM(bm.sim)
grm <- grm + diag(0.0001, nrow(grm))
eigen.grm <- eigen(grm)
以下が、シミュレーションの本体となる。settingsの数値を変えて実行することで、様々な結果が得られる。
settings <- list(
w.qtn = rep(1.0, 5), # 主働遺伝子の効果と数。ここでは、5QTNの効果を全て1とする。
g.var.ratio = 1.0, #ポリジーン遺伝分散対QTN遺伝分散比。ここでは100%とする。
he = 0.7, # 遺伝率。ここでは、表現型分散の70%が遺伝分散とする。
fdr.thresh = 0.1 # 偽発見率のしきい値。ここでは、10%とする。
)
n.sim <- 20 # シミュレーションの回数
# 結果を入れるための入れ物を準備
sim.res <- data.frame(fnr = rep(F, n.sim),
fdr = rep(F, n.sim),
fpr = rep(F, n.sim))
# シミュレーションを実行
for(i in 1:n.sim) { # 1〜n.simまでiを変化させて、ループを回す
print(i) # i回目であることを表示
# 上で定義した関数を使って計算。結果をsim.resに代入
sim.res[i, ] <- gwas.sim(bm.sim, grm, eigen.grm, settings)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
## [1] 12
## [1] 13
## [1] 14
## [1] 15
## [1] 16
## [1] 17
## [1] 18
## [1] 19
## [1] 20
# シミュレーション回数分のFNR, FDR, FPR
sim.res
## fnr fdr fpr
## 1 0.4 0.38709677 3.121748e-04
## 2 0.4 0.28571429 3.635703e-04
## 3 0.2 0.52830189 7.265556e-04
## 4 0.6 0.25000000 2.595178e-05
## 5 0.0 0.30769231 3.114618e-04
## 6 0.4 0.68000000 4.409400e-04
## 7 0.4 0.29032258 2.336570e-04
## 8 0.2 0.15789474 1.556743e-04
## 9 0.0 0.07692308 2.597605e-05
## 10 0.2 0.25000000 2.337237e-04
## 11 0.0 0.22222222 1.038152e-04
## 12 0.0 0.30000000 1.559454e-04
## 13 0.0 0.49333333 9.597427e-04
## 14 0.2 0.12903226 1.037829e-04
## 15 0.4 0.00000000 0.000000e+00
## 16 0.2 0.44444444 2.076196e-04
## 17 0.0 0.47887324 8.834611e-04
## 18 0.0 0.22727273 1.299072e-04
## 19 0.2 0.04545455 2.599293e-05
## 20 0.0 0.54285714 4.926875e-04
# そののsummary
summary(sim.res)
## fnr fdr fpr
## Min. :0.00 Min. :0.0000 Min. :0.0000000
## 1st Qu.:0.00 1st Qu.:0.2061 1st Qu.:0.0001038
## Median :0.20 Median :0.2880 Median :0.0002206
## Mean :0.19 Mean :0.3049 Mean :0.0002946
## 3rd Qu.:0.40 3rd Qu.:0.4531 3rd Qu.:0.0003829
## Max. :0.60 Max. :0.6800 Max. :0.0009597
# 箱ひげ図を描く
title <- paste(sapply(settings, paste, collapse=":"), collapse=" ")
boxplot(sim.res, ylim = c(0,1), main = title) # 箱ひげ図