Clinical PK/PD
http://w.atwiki.jp/wiki5_hks/
Clinical PK/PD
ja
2008-03-30T15:10:46+09:00
1206857446
-
濃度の予測区間
https://w.atwiki.jp/wiki5_hks/pages/106.html
*個体間変動と個体内変動を考慮した濃度の予測区間を構成する。
**非線形混合効果モデル
CL と V の個体間変動はいずれも 20%CV、個体内変動は 10% として、5 点 x 100 人のデータを発生させる。そのデータに対して、「真のモデル」(=データ発生に用いたモデル) を用いて FO 法で NONMEM パラメータを推定する。その結果を用いて、パラメトリック・ブートストラップにより個体間変動パラメータをシミュレートして、個体間変動のみを考慮した予測区間を構成。さらに、正規近似を用いて個体内変動分を加算した予測区間を求める。
以上のプロセスによって 90% 区間をシミュレーションしてみたところ、もともとのデータをどれくらいの割合で含んでいるか?
|種類|カバー率|
|個体間変動のみ|84%|
|個体内変動も|96%|
こうやって構成する予測区間と、「元のデータの何割を含んでいるか」とは本来全く関係がない。したがって、90% 区間が含む割合が上記のようになったとしても不思議はない。
**線形混合効果モデル
上記の結果の原因が非線形混合効果モデルにあるのは、それとも FO 法近似の限界なのかを確認するために線形混合効果モデルの設定で同様の検討をしてみる。デザインは上と全く同じ。
|種類|カバー率|
|個体間変動のみ|87%|
|個体内変動も|96%|
すなわち、非線形に起因する問題ではなく、本質的なことであることが示される。
**注意
なお、ここで用いたシミュレーションではパラメータの推定誤差は全く考慮していないが、考慮したところで傾向は同じだろう。個体内変動を含む区間のカバー率はさらに大きくなる (90% から遠くなる) だけである。
Cmax 付近、あるいはトラフ濃度の予測区間がどの程度になるか、といった本来の M&S に近い立場であるならば、この方法による予測区間構成は全く問題ない。
しかし、回顧的な 'posterior predictive check' = 'visual predictive check' の場合はどうなのだろう。
----
[[こちら>http://d.hatena.ne.jp/Fumi/20080324/120635787
2008-03-30T15:10:46+09:00
1206857446
-
$TABLEに20以上の変数
https://w.atwiki.jp/wiki5_hks/pages/105.html
*変数を 20 個以上 TABLE に出力したい
PRED-defined の変数が多数ある時、$TABLE ですべての変数を出力したくても NONMEM V では 20 個までしか出力できない(VI では 50 個まで)。$TABLE を複数用意して、別々の TABLE に出力させようとしてもエラーが出る。
以下のように、$PROBLEM を複数に分ければよい。
-1 回目の run ($PROBLEM 1) での結果を $EST MSF= で出力しておく。
-2 回目の run ($PROBLEM 2) ではその結果を $MSFI で読み込み、推定は実行しない。ただ単に $TABLE 出力のみを行わせる。
$PROBLEM 1(ESTIMATION)
$DATA DATA.TXT
$INPUT ID TIME AMT DV
$SUB ADVAN1 TRANS2
$PK
CL=THETA(1)*EXP(ETA(1))
V =THETA(2)*EXP(ETA(2))
;
SC=V
;
; 以下、適当
X1=1
X2=2
X3=3
X4=4
X5=5
X6=6
X7=7
X8=8
X9=9
X10=10
X11=1
X12=2
X13=3
X14=4
X15=5
X16=6
X17=7
X18=8
X19=9
X20=10
X21=11
;
$ERROR
Y=F*EXP(ERR(1))
$THETA
(0 0.1)
(0 1)
$OMEGA 0.04 0.04
$SIGMA 0.01
$EST MAXE=9999 MSF=MSF1.DAT
$COV
$TABLE
NOPRINT ONEHEADER NOAPPEND FILE=TAB1.TXT
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
X11 X12 X13 X14 X15 X16 X17 X18 X19 X20
;X21 ; 21 個目を出力しようとするとエラーが出る
;
$PROBLEM 2
$DATA D
2008-03-23T19:51:08+09:00
1206269468
-
Wang2007
https://w.atwiki.jp/wiki5_hks/pages/104.html
*Wang, Y (2007) J.PKPD
[[Derivation of various NONMEM estimation methods>http://www.springerlink.com/content/x513842121054931/]]
NONMEM の目的関数についての解説。
NONMEM が具体的にどういう式で目的関数を計算しているかついて、マニュアルには明瞭に書かれていない。特に、FOCE + INTERACTION 法や Laplace 法の目的関数の式は mystery でさえある。そこでこの論文では Laplace 法、FOCE 法、FO 法の目的関数が明確に示された。
まず、(周辺尤度の)積分を Laplace 近似する方法で目的関数を導く。ただし、個体内誤差は問う誤差モデルを仮定する。この枠組みでは、Laplace、FOCE、FO の違いは、対数尤度の二階微分(ヘッセ行列)をどう評価するかの違いに帰着する。ヘッセ行列をそのまま評価(数値計算)しようとするのが Laplace 法であり、一方、FOCE、FO 法ではヘッセ行列をその期待値で近似する。期待値ならば一階微分のみを用いて計算可能である。なお、FOCE 法と FO 法とでは、個体間変動パ
ラメータηに関する Taylor 展開の際にηの経験ベイズ推定量の周りで行う (FOCE) か、あるいは、期待値 (=0) の周りで行うか、が異なる。
ところで、Laplace 近似に基づく目的関数の式はそのままでは数値計算に使いにくい。それは上記したヘッセ行列(の期待値)の評価が含まれるためである。そこで、論文中では FOCE 法と FO 法について、より直感的な誘導も示される。この場合、いわゆる「モデル式」、すなわち、
Yi = f(θ, ηi) + εi
の f(.) をηi について展開した上で、Yi の周辺期待値および周辺分散を近似によって求める。後は、Yi が(多変量)正規分布に従うとの仮定のもと、尤度を書き下せばよい。
さて、前者の Laplace 近似に基づく方法と後者の周辺分布に基づく方法とで導かれるそれぞれの目的関数は(INTERACTION のない)FOCE 法と FO 法とでは一致する。なお、比例誤差モデルの場合は、εの
2008-01-08T19:19:05+09:00
1199787545
-
論文
https://w.atwiki.jp/wiki5_hks/pages/103.html
-[[Wang, J.PKPD, 2007>Wang2007]]
2008-01-04T21:15:40+09:00
1199448940
-
グラフタイトル
https://w.atwiki.jp/wiki5_hks/pages/102.html
>par(oma=c(0,0,2,1)+0.1, mfrow=c(2,2))
>
>hist(rnorm(100))
>hist(rnorm(100))
>hist(rnorm(100))
>hist(rnorm(100))
>
>title(main="MAIN TITLE", outer=T)
2007-03-31T14:52:47+09:00
1175320367
-
R/SでODE
https://w.atwiki.jp/wiki5_hks/pages/101.html
*R で ODE
ex1 <-
function(t, y, p) {
dy1 <- -p["ka"] * y[1] # amount
dy2 <- p["ka"] * y[1] / p["V"] - p["CL"] / p["V"] * y[2] # concentration
list(c(dy1, dy2)) # list で返す
}
ka <- 0.7; CL <- 0.1; V <- 1
parms <- c(ka=ka, CL=CL, V=V)
TIME <- seq(0, 24, by=1)
Dose <- 1000
require(odesolve)
my.atol <- c(1e-6, 1e-10)
out <-
lsoda(c(Dose, 0), TIME, ex1, parms, rtol=1e-5, atol=my.atol)
out
*S-PLUS で ODE
ex1 <-
function(x, y, CL, V, ka) {
dy1 <- -ka * y[1] # amount
dy2 <- ka * y[1] / V - CL * y[2] # concentration
c(dy1, dy2)
}
TIME <- seq(1, 24, by=1)
CONC <- double(length(TIME))
CL <- 0.1; V <- 1; ka <- 0.7
Dose <- 1000
out <- ivp.ab(TIME[1], c(0, c(Dose, 0)), ex1, aux=list(CL=CL, V=V, ka=ka))
CONC[1] <- out$values[3]
for (i in seq(2, length(TIME))) {
out <- ivp.ab(TIME[i], restart=out)
CONC[i] <- out$values[3]
}
CONC
2008-03-12T19:25:50+09:00
1205317550
-
濃度推移の重ね描き
https://w.atwiki.jp/wiki5_hks/pages/100.html
*個体での血漿中濃度推移をひとつのグラフ内で重ね描き
plot.super <-
function(
tab, ID="ID", Y="DV",
xlab="Time (hr)", ylab="Concentration (ng/mL)",
...
) {
tab.plot <- data.frame(ID=tab[,ID], TIME=tab$TIME, Y=tab[,Y])
res <- xyplot(
Y ~ TIME, tab.plot, groups=ID, panel=panel.superpose,
type="l",
xlab=xlab, ylab=ylab,
...
)
res
}
plot.super(tab[tab$MDV==0,], ID="SID",
ylab="Plasma concentration (ng/mL)")
2007-02-03T10:46:20+09:00
1170467180
-
被験者背景シミュレーション
https://w.atwiki.jp/wiki5_hks/pages/99.html
# n = 19 (nonsmoker)
# n = 49 (former smoker)
# n = 32 (smoker)
smoke.num <- c(rep(1, 19), rep(2, 49), rep(3, 32))
label.smoke <- c("Nonsmoker","Former smoker","Smoker")
smoke <- factor(smoke.num, levels=1:3, labels=label.smoke)
mu <- mean(log(smoke.num))
sg <- sqrt(var(log(smoke.num)))
# Empirical distribution
Pi <- cumsum(as.numeric(table(smoke)) / length(smoke))
Pi <- Pi[-length(Pi)]
# Continuous critical value
CrV <- exp(mu + sg * qnorm(Pi))
# Simulation
set.seed(27011)
nsim <- 1000
smoke.sim.continuous <- exp(rnorm(nsim, mean=mu, sd=sg))
smoke.sim <- cut(smoke.sim.continuous, breaks=c(0,CrV,max(smoke.sim.continuous)), labels=label.smoke)
table(smoke.sim)
# Plot
hist(smoke.sim.continuous, freq=F, xlab='Smoke', main='')
lines(density(smoke.sim.continuous))
abline(v=CrV, col=4)
2007-02-01T21:36:05+09:00
1170333365
-
DV_PRED_IPRED
https://w.atwiki.jp/wiki5_hks/pages/98.html
*DV, PRED, IPRED の重ね描き
plot.ipred <-
function(
tab, ID="ID", DV="DV", IPRE="IPRE",
layout=c(3, 3),
xlab="Time (hr)", ylab="Concentration (ng/mL)",
...
) {
tab.plot <- rbind(
data.frame(type=rep(1, nrow(tab)), ID=tab[,ID], TIME=tab$TIME, Y=tab$DV),
data.frame(type=rep(2, nrow(tab)), ID=tab[,ID], TIME=tab$TIME, Y=tab$PRED),
data.frame(type=rep(3, nrow(tab)), ID=tab[,ID], TIME=tab$TIME, Y=tab[,IPRE])
)
res <- xyplot(Y ~ TIME | factor(ID), tab.plot,
type=tab.plot$type,
layout=layout,
xlab=xlab, ylab=ylab,
panel=function(x, y, subscripts, type=type) {
panel.xyplot(x[type[subscripts]==1], y[type[subscripts]==1], col.symbol=1)
panel.xyplot(x[type[subscripts]==2], y[type[subscripts]==2], type="l", col.line=1)
panel.xyplot(x[type[subscripts]==2], y[type[subscripts]==3], type="l", col.line=4)
},
...
)
res
}
plot.ipred(tab[tab$MDV==0,], ID="SID", ylab="Plasma conce
2007-02-03T10:45:27+09:00
1170467127
-
変数変換の妥当性
https://w.atwiki.jp/wiki5_hks/pages/97.html
*変数変換の妥当性
>### 元データ y を z = f(y) と変換する ###
>### y, z それぞれにモデルを当てはめて AIC を比較 ###
>fm.y <- lm(y ~ x)
>AIC.y <- AIC(fm.y)
>#
>fm.z <- lm(z ~ x)
>### 対数変換 z = f(y) = log(y) の場合の例 ###
>### df/dy = 1/y を計算し、-2∑log|df/df| を算出する ###
>AIC.z <- AIC(fm.z) - 2 * sum(log(abs(1/y)))
>### AIC.y, AIC.z の小さいほうを採用する ###
2007-01-25T22:05:26+09:00
1169730326