Skip to content

Commit 33cace0

Browse files
authored
added CP vs NCP using PopPK model (#24)
1 parent 0d22d76 commit 33cace0

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

code/08-cp_vs_ncp.jl

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
using Pumas
2+
using DataFrames
3+
using CSV
4+
5+
# CP
6+
poppk2cpt_cp = @model begin
7+
@param begin
8+
tvcl ~ LogNormal(log(10), 0.25)
9+
tvq ~ LogNormal(log(15), 0.5)
10+
tvvc ~ LogNormal(log(35), 0.25)
11+
tvvp ~ LogNormal(log(105), 0.5)
12+
tvka ~ LogNormal(log(2.5), 1)
13+
σ ~ truncated(Cauchy(0, 5), 0, Inf)
14+
C ~ LKJCholesky(5, 1.0)
15+
ω Constrained(
16+
MvNormal(zeros(5), Diagonal(0.4^2 * ones(5))),
17+
lower=zeros(5),
18+
upper=fill(Inf, 5),
19+
init=ones(5),
20+
)
21+
end
22+
23+
@random begin
24+
η ~ MvNormal(ω .* C .* ω')
25+
end
26+
27+
@pre begin
28+
# PK parameters
29+
CL = tvcl * exp(η[1])
30+
Q = tvq * exp(η[2])
31+
Vc = tvvc * exp(η[3])
32+
Vp = tvvp * exp(η[4])
33+
Ka = tvka * exp(η[5])
34+
end
35+
36+
@dynamics begin
37+
Depot' = -Ka * Depot
38+
Central' = Ka * Depot - (CL + Q) / Vc * Central + Q / Vp * Peripheral
39+
Peripheral' = Q / Vc * Central - Q / Vp * Peripheral
40+
end
41+
42+
@derived begin
43+
cp := @. Central / Vc
44+
dv ~ @. LogNormal(log(cp), σ)
45+
end
46+
end
47+
48+
# NCP
49+
poppk2cpt_ncp = @model begin
50+
@param begin
51+
tvcl ~ LogNormal(log(10), 0.25)
52+
tvq ~ LogNormal(log(15), 0.5)
53+
tvvc ~ LogNormal(log(35), 0.25)
54+
tvvp ~ LogNormal(log(105), 0.5)
55+
tvka ~ LogNormal(log(2.5), 1)
56+
σ ~ truncated(Cauchy(0, 5), 0, Inf)
57+
C ~ LKJCholesky(5, 1.0)
58+
ω Constrained(
59+
MvNormal(zeros(5), Diagonal(0.4^2 * ones(5))),
60+
lower=zeros(5),
61+
upper=fill(Inf, 5),
62+
init=ones(5),
63+
)
64+
end
65+
66+
@random begin
67+
ηstd ~ MvNormal(I(5))
68+
end
69+
70+
@pre begin
71+
# compute the η from the ηstd
72+
# using lower Cholesky triangular matrix
73+
η = ω .* (getchol(C).L * ηstd)
74+
75+
# PK parameters
76+
CL = tvcl * exp(η[1])
77+
Q = tvq * exp(η[2])
78+
Vc = tvvc * exp(η[3])
79+
Vp = tvvp * exp(η[4])
80+
Ka = tvka * exp(η[5])
81+
end
82+
83+
@dynamics begin
84+
Depot' = -Ka * Depot
85+
Central' = Ka * Depot - (CL + Q) / Vc * Central + Q / Vp * Peripheral
86+
Peripheral' = Q / Vc * Central - Q / Vp * Peripheral
87+
end
88+
89+
@derived begin
90+
cp := @. Central / Vc
91+
dv ~ @. LogNormal(log(cp), σ)
92+
end
93+
end
94+
95+
df = CSV.read("data/poppk2cpt.csv", DataFrame)
96+
pop = read_pumas(df)
97+
98+
params = (;
99+
tvcl=9.5,
100+
tvq=19,
101+
tvvc=67,
102+
tvvp=102,
103+
tvka=1.2,
104+
σ=0.83,
105+
C=float.(Matrix(I(5))),
106+
ω=[0.8, 0.1, 1.8, 2.0, 0.5]
107+
)
108+
109+
# just 2 subjects
110+
poppk2cpt_cp_fit = fit(
111+
poppk2cpt_cp,
112+
pop[1:2],
113+
params,
114+
Pumas.BayesMCMC(
115+
nsamples=200,
116+
nadapts=100,
117+
target_accept=0.6,
118+
)
119+
)
120+
121+
poppk2cpt_ncp_fit = fit(
122+
poppk2cpt_ncp,
123+
pop[1:2],
124+
params,
125+
Pumas.BayesMCMC(
126+
nsamples=200,
127+
nadapts=100,
128+
target_accept=0.6,
129+
)
130+
)
131+
132+
poppk2cpt_cp_tfit = Pumas.truncate(poppk2cpt_cp_fit; burnin=100)
133+
poppk2cpt_ncp_tfit = Pumas.truncate(poppk2cpt_ncp_fit; burnin=100)
134+
135+
# comparing ESS
136+
ess_cp = mean(ess(poppk2cpt_cp_tfit))
137+
ess_ncp = mean(ess(poppk2cpt_ncp_tfit))
138+
ess_ncp / ess_cp
139+
140+
# comparing Rhat
141+
rhat_cp = mean(rhat(poppk2cpt_cp_tfit))
142+
rhat_ncp = mean(rhat(poppk2cpt_ncp_tfit))
143+
rhat_cp / rhat_ncp

0 commit comments

Comments
 (0)