Stan & POPPK (3): 多変量正規分布を用いたパラメータ間の相関まで含めた解析

Stan & POPPK (2): 階層モデルを用いた複数被験者の薬物動態解析 - yoshidk6’s blog の続きです。前回使用したモデルを拡張して、パラメータ間の相関も含めた解析を行います。

使用する仮想データ

作成された仮想データは前回と同じなので、説明を省略します。

解析

Stanモデル

モデル構造は前回とほぼ同じですが、多変量正規分布を扱うための変更を行っています。
Stan超初心者入門 の114ページ目から詳しい説明が載っています。
簡単にまとめると、個人間変動を考慮している2つのパラメータに対して相関行列rhoと各々の標準偏差sigmaを定義し、そこから分散共分散行列Omegaを算出するようになっています。

GitHubリンク: https://github.com/yoshidk6/simple_pk_stan/blob/master/code/mod_03_multinorm.stan

Rコード

上記のモデルを動かすRのコードは以下の通りです。

library(tidyverse)
library(rstan)
library(ggmcmc)

rstan_options(auto_write=T)
options(mc.cores=parallel::detectCores())

data.pk   <- read_csv("../data/sim_pk_20170521.csv") 
data.subj <- read_csv("../data/subj_dose_20170521.csv")

init <- function(){
    list(KA = exp(rnorm(1, log(0.5), 0.2)),
         CL = exp(rnorm(1, log(0.5), 0.2)),
         VD = exp(rnorm(1, log(5), 0.2)),
         sigma = exp(rnorm(2, log(0.2), 0.5)),
         rho = diag(2),
         s_Y = runif(1, 0.5, 2),
         CLVDiLog=matrix(rep(log(c(0.5,5)), ea = nrow(data.subj)), 
                      nrow = nrow(data.subj)))
}

data <- 
  list(N    = nrow(data.pk),
       N_ID = nrow(data.subj),
       ID   = data.pk$ID,
       TIME = data.pk$TIME,
       DOSE = data.subj$DOSE,
       Y    = data.pk$CONC)

fit.stan <-
  stan(file = "mod_03_multinorm.stan", 
       data = data, init=init)

結果の評価

推定されたパラメータを元に算出された平均値と90%予測区間を見てみると、前回と同様に、全体・個人ごとのプロット共に観測値とよく合っています。

f:id:yoshidk6:20171027125833p:plain f:id:yoshidk6:20171027125837p:plain

一方で、推定された各個人のパラメータと、モデルに基づいた予測値を比較すると、CLiVDiの相関が正しく表現されるようになったことがわかります。(一つ目がパラメータ間の相関を考慮していない前回の結果、2つめが今回の結果)

f:id:yoshidk6:20171027130526p:plain f:id:yoshidk6:20171027130025p:plain

今回のモデルを用いることで、正しく個人間のパラメータ変動を反映した予測結果が算出されることが期待できます。