test_that("nonmem amt=0 evid=1 conversion test", {
one.compartment <- function() {
ini({
tka <- 0.45 # Log Ka
tcl <- 1 # Log Cl
tv <- 3.45 # Log V
eta.ka ~ 0.6
eta.cl ~ 0.3
eta.v ~ 0.1
add.sd <- 0.7
})
model({
ka <- exp(tka + eta.ka)
cl <- exp(tcl + eta.cl)
v <- exp(tv + eta.v)
d/dt(depot) = -ka * depot
d/dt(center) = ka * depot - cl / v * center
cp = center / v
cp ~ add(add.sd)
})
}
et <- rxode2::et(amt=0) %>% rxode2::et(1)
et$DV <- 100
conv <- bblDatToNonmem(one.compartment, et)
expect_equal(conv$EVID, c(2L, 0L))
})
test_that("pknca conversion keeps extra columns", {
one.compartment <- function() {
ini({
tka <- 0.45 # Log Ka
tcl <- 1 # Log Cl
tv <- 3.45 # Log V
eta.ka ~ 0.6
eta.cl ~ 0.3
eta.v ~ 0.1
add.sd <- 0.7
})
model({
ka <- exp(tka + eta.ka)
cl <- exp(tcl + eta.cl)
v <- exp(tv + eta.v)
d/dt(depot) = -ka * depot
d/dt(center) = ka * depot - cl / v * center
cp = center / v
cp ~ add(add.sd)
})
}
# Normal
et <- rxode2::et(amt=10) %>% rxode2::et(1)
et$DV <- 100
suppressMessages(dClean <- bblDatToPknca(one.compartment, et))
expect_named(dClean, c("obs", "dose"))
expect_equal(nrow(dClean$obs), 1)
expect_equal(nrow(dClean$dose), 1)
# Only dosing and only observation rows for some subjects
et <-
data.frame(
id = c(1, 2, 2, 3),
amt = c(10, 10, 0, 0),
evid = c(1, 1, 0, 0),
time = c(0, 0, 1, 1),
DV = 1
)
suppressWarnings(suppressMessages(
expect_message(
dClean <- bblDatToPknca(one.compartment, et),
regexp = "Dropping 1 observation rows with no doses for the subject with PKNCA estimation"
)
))
expect_named(dClean, c("obs", "dose"))
expect_equal(nrow(dClean$obs), 1)
expect_equal(nrow(dClean$dose), 1)
expect_equal(dClean$obs$id, 2)
expect_equal(dClean$dose$id, 2)
# Drop a whole subject if they use ADDL
et <-
data.frame(
id = c(1, 2, 1, 2),
time = c(0, 0, 1, 1),
amt=c(10, 10, NA, NA),
ii=c(1, NA, NA, NA),
addl=c(1, NA, NA, NA),
evid =c(1, 1, 0, 0),
DV = 1
)
suppressWarnings(suppressMessages(
expect_message(expect_message(
dClean <- bblDatToPknca(one.compartment, et),
regexp = "ADDL dosing not supported with PKNCA estimation, dropping subjects using ADDL: 1 rows"),
regexp = "Dropping 1 observation rows with no doses for the subject with PKNCA estimation"
)
))
expect_named(dClean, c("obs", "dose"))
expect_equal(nrow(dClean$obs), 1)
expect_equal(nrow(dClean$dose), 1)
expect_equal(dClean$obs$id, 2)
expect_equal(dClean$dose$id, 2)
# Drop right censored subject
et <-
data.frame(
amt=c(10, 10, NA, NA),
id=c(1L, 2L, 1L, 2L),
evid=c(1, 1, NA, NA),
time=c(0, 0, 1, 1),
cens=c(NA, NA, -1, NA),
DV=c(NA, NA, 1, 1)
)
suppressMessages(
expect_message(expect_message(
dClean <- bblDatToPknca(one.compartment, et),
regexp = "Right censoring and left censoring with a value above zero is not supported with PKNCA estimation, dropping subjects with those censoring types: 1 rows"),
regexp = "Dropping 1 dosing rows with no observations for the subject with PKNCA estimation"
)
)
expect_named(dClean, c("obs", "dose"))
expect_equal(nrow(dClean$obs), 1)
expect_equal(nrow(dClean$dose), 1)
expect_equal(dClean$obs$id, 2)
expect_equal(dClean$dose$id, 2)
# Drop left censored subject with LIMIT > 0
et <-
data.frame(
amt=c(10, 10, NA, NA),
id=c(1L, 2L, 1L, 2L),
evid=c(1, 1, NA, NA),
time=c(0, 0, 1, 1),
cens=c(NA, NA, 1, NA),
limit=c(NA, NA, 0.5, NA),
DV=c(NA, NA, 1, 1)
)
suppressMessages(
expect_message(expect_message(
dClean <- bblDatToPknca(one.compartment, et),
regexp = "Right censoring and left censoring with a value above zero is not supported with PKNCA estimation, dropping subjects with those censoring types: 1 rows"),
regexp = "Dropping 1 dosing rows with no observations for the subject with PKNCA estimation"
)
)
expect_named(dClean, c("obs", "dose"))
expect_equal(nrow(dClean$obs), 1)
expect_equal(nrow(dClean$dose), 1)
expect_equal(dClean$obs$id, 2)
expect_equal(dClean$dose$id, 2)
# Keep left censored subject with no LIMIT, convert DV to 0
et <-
data.frame(
amt=c(10, 10, NA, NA),
id=c(1L, 2L, 1L, 2L),
evid=c(1, 1, NA, NA),
time=c(0, 0, 1, 1),
cens=c(NA, NA, 1, NA),
DV=c(NA, NA, 1, 1)
)
suppressMessages(
expect_message(
dClean <- bblDatToPknca(one.compartment, et),
regexp = "Setting DV to zero for PKNCA estimation with left censoring: 1 rows"
)
)
expect_named(dClean, c("obs", "dose"))
expect_equal(nrow(dClean$obs), 2)
expect_equal(nrow(dClean$dose), 2)
expect_equal(dClean$obs$id, 1:2)
expect_equal(dClean$dose$id, 1:2)
expect_equal(dClean$obs$DV, 0:1)
# Keep left censored subject with zero LIMIT, convert DV to 0
et <-
data.frame(
amt=c(10, 10, NA, NA),
id=c(1L, 2L, 1L, 2L),
evid=c(1, 1, NA, NA),
time=c(0, 0, 1, 1),
cens=c(NA, NA, 1, NA),
limit=c(NA, NA, 0, NA),
DV=c(NA, NA, 1, 1)
)
suppressMessages(
expect_message(
dClean <- bblDatToPknca(one.compartment, et),
regexp = "Setting DV to zero for PKNCA estimation with left censoring: 1 rows"
)
)
expect_named(dClean, c("obs", "dose"))
expect_equal(nrow(dClean$obs), 2)
expect_equal(nrow(dClean$dose), 2)
expect_equal(dClean$obs$id, 1:2)
expect_equal(dClean$dose$id, 1:2)
expect_equal(dClean$obs$DV, 0:1)
# No dosing
et <- rxode2::et(amt=0) %>% rxode2::et(1)
et$DV <- 100
suppressMessages(expect_error(
bblDatToPknca(one.compartment, et),
regexp="no dosing rows (EVID = 1 or 4) detected",
fixed=TRUE
))
})
test_that("getStandardColNames", {
expect_equal(
getStandardColNames(data.frame(ID=1, DV=2, Time=3, CmT=4)),
c(id = "ID", time = "Time", amt = NA, rate = NA, dur = NA, evid = NA,
cmt = "CmT", ss = NA, ii = NA, addl = NA, dv = "DV", mdv = NA, dvid = NA,
cens = NA, limit = NA)
)
expect_error(
getStandardColNames(data.frame(ID=1, DV=2, Time=3, CmT=4, cmt=5)),
regexp = "Multiple data columns match cmt when converted to lower case"
)
})
test_that("invalid nonmem conversion", {
skip_if_not(file.exists("bad-nonmem-data-convert.qs"))
d <- qs::qread("bad-nonmem-data-convert.qs")
f <-
function() {
ini({
tpm1 <- c(log(0.0001),log(1))
tpm2 <- c(log(0.0001),log(5))
tpm3 <- c(log(0.0001),log(0.1))
tpm4 <- c(log(0.0001),log(5))
tpm5 <- c(log(0.0001), log(1), log(10))
tpm6 <- c(log(0.0001), log(0.1), log(1))
#
eta.pm1 ~ 0.1
eta.pm2 ~ 0.1
eta.pm6 ~ 0.1
eta.pm3 ~ 0.1
eta.pm4 ~ 0.1
#
eps.prop <- c(0,1)
})
model({
ipm1 <- exp(tpm1 + eta.pm1)
pm2 <- exp(tpm2 + eta.pm2)
pm5 <- exp(tpm5)
pm6 <- exp(tpm6 + eta.pm6)
pm3 <- exp(tpm3 + eta.pm3)
pm4 <- exp(tpm4 + eta.pm4)
#
tmevent <- tevent - 7
if(tmevent<0){tmevent = 0}
#
if(time>tmevent){
pm5=pm5
pm6=pm6
} else{
pm5=1
pm6=1
}
#
pm1 <- ipm1*pm5
pm8 <- pm1/pm2
pm9 <- pm3/pm2
pm99 <- pm3/pm4
#
pm7 = pm6
cp = (cent/pm2)*pm7
#
d/dt(cent) = -pm8*cp - pm9*cp + pm99*periph
d/dt(periph) = pm9*cp - pm99*periph
#
IPRED = log(cp)
IPRED ~ prop(eps.prop) | abc
})
}
d$tevent <- 0.5
expect_error(bblDatToNonmem(f, d), NA)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.