From a6eccd1d7ea1c4dd70ce82e902345aeb76e1b4f7 Mon Sep 17 00:00:00 2001 From: "Matthew L. Fidler" Date: Mon, 8 Jul 2024 20:58:46 -0500 Subject: [PATCH 1/7] Add mu2 blog --- content/blog/2024-07-08-mu2/index.Rmd | 117 +++++++++++++++++++++ content/blog/2024-07-08-mu2/index.html | 135 +++++++++++++++++++++++++ content/blog/2024-07-08-mu2/index.png | Bin 0 -> 21488 bytes 3 files changed, 252 insertions(+) create mode 100644 content/blog/2024-07-08-mu2/index.Rmd create mode 100644 content/blog/2024-07-08-mu2/index.html create mode 100644 content/blog/2024-07-08-mu2/index.png diff --git a/content/blog/2024-07-08-mu2/index.Rmd b/content/blog/2024-07-08-mu2/index.Rmd new file mode 100644 index 0000000..2f2ae34 --- /dev/null +++ b/content/blog/2024-07-08-mu2/index.Rmd @@ -0,0 +1,117 @@ +--- +title: nlmixr2/rxode2 mu referencing 2.0 +author: Matthew Fidler +date: '2024-07-08' +slug: [] +categories: [rxode2, nlmixr2] +tags: [mu] +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +library(nlmixr2) +library(rxode2) +``` + +This month, I will talk about about a new iteration of mu-referencing in nlmixr2, which I call mu2. + +## What is mu referencing in nlmixr2 + +mu-referencing is combining a fixed effect, random effect and possibly a covariate in the form: + +$$ +\theta_\mathsf{pop}+\eta_\mathsf{individual}+\theta_\mathsf{covariate}\times \mathsf{DataCovariate} +$$ + +Often they are placed in exponentials for these to be log-normally distributed like: + +$$ +\exp\left(\theta_\mathsf{pop}+\eta_\mathsf{individual}+\theta_\mathsf{covariate}\times \mathsf{DataCovariate}\right) +$$ + +In optimization routines like `saem`, these are switched out with a single parameter during optimization classically called $\phi$ in both NONMEM and Monolix. + +Once the best $\phi$ is found, then the population, individual and covariates can be found by linear regression of the individual $\phi$ values versus the information in the optimization. + +This linear model is important. + +In old versions of rxode2 and nlmixr2 the $\mathsf{DataCovariate}$ had to be in the dataset itself. This classic weight covariate adjustment: + +$$ +\exp\left(\theta_{Cl}+\eta_{Cl}\right)\times\left(\frac{WT}{70}\right)^{3/4} +$$ + +would have to written: + +$$ +\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+3/4\times\log\left(WT/70\right)\right) +$$ + +If you wanted to estimate the population parameter $3/4$ to see if it approaches the correct value you could with: + +$$ +\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+\theta_{Cl, \textsf{cov}}\times\mathsf{DataCovariate}\right) +$$ + +Where $$\mathsf{DataCovariate}$$ is defined in the data as $\log\left(WT/70\right)$. + +This is easy enough to do and adds stabilization. + +However, with mu referencing 2.0 you can simply use an additive expression to setup mu-referencing: + +$$ +\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+\theta_{Cl, \textsf{cov}}\times\log\left(WT/70\right)\right) +$$ + +This is a bit more convenient than creating a column in the dataset that does this conversion and less user-based intervention to make `nlmixr2` use linear models when it can. + +## Checking for mu2 referencing + +In `rxode2` / `nlmixr2` you can check to see if your version of nlmixr2 supports the mu2 referencing by evaluating the functional form: + +```{r muRef} +one.compartment <- function() { + ini({ + tka <- log(1.57); label("Ka") + tcl <- log(2.72); label("Cl") + tv <- log(31.5); label("V") + wt.cl <- 0.75; label("WT on CL") + eta.ka ~ 0.6 + eta.cl ~ 0.3 + eta.v ~ 0.1 + add.sd <- 0.7 + }) + # and a model block with the error specification and model specification + model({ + ka <- exp(tka + eta.ka) + cl <- exp(tcl + eta.cl + wt.cl*log(WT/70)) + 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) + }) +} + +one <- one.compartment() + +print(one) +``` + +If the mu2 referencing is supported it will show the following mu reference table: + +``` +── μ-referencing ($muRefTable): ── + theta eta level covariates +1 tka eta.ka id +2 tcl eta.cl id log(0.0142857142857143 * WT)*wt.cl +3 tv eta.v id +``` + +Here it shows the transformation that is used when creating the transformed data used for mu-based covariate modeling. In this case, we have `log(0.0142857142857143 * WT)`. It is a bit different than what is written because it is prepossessed by `symengine` and looks at the derivative with respect to the covariate parameter `wt.cl`. + +In general, I am excited by this new feature in nlmixr2. + +### Why the Pokemon icon? + +Why the icon for mu2 referencing? Every time I hear mu2 I think of the ultimate genetically modified Pokemon mewtwo. diff --git a/content/blog/2024-07-08-mu2/index.html b/content/blog/2024-07-08-mu2/index.html new file mode 100644 index 0000000..30b946f --- /dev/null +++ b/content/blog/2024-07-08-mu2/index.html @@ -0,0 +1,135 @@ +--- +title: nlmixr2/rxode2 mu referencing 2.0 +author: Matthew Fidler +date: '2024-07-08' +slug: [] +categories: [rxode2, nlmixr2] +tags: [mu] +--- + + + +

This month, I will talk about about a new iteration of mu-referencing in nlmixr2, which I call mu2.

+
+

What is mu referencing in nlmixr2

+

mu-referencing is combining a fixed effect, random effect and possibly a covariate in the form:

+

\[ +\theta_\mathsf{pop}+\eta_\mathsf{individual}+\theta_\mathsf{covariate}\times \mathsf{DataCovariate} +\]

+

Often they are placed in exponentials for these to be log-normally distributed like:

+

\[ +\exp\left(\theta_\mathsf{pop}+\eta_\mathsf{individual}+\theta_\mathsf{covariate}\times \mathsf{DataCovariate}\right) +\]

+

In optimization routines like saem, these are switched out with a single parameter during optimization classically called \(\phi\) in both NONMEM and Monolix.

+

Once the best \(\phi\) is found, then the population, individual and covariates can be found by linear regression of the individual \(\phi\) values versus the information in the optimization.

+

This linear model is important.

+

In old versions of rxode2 and nlmixr2 the \(\mathsf{DataCovariate}\) had to be in the dataset itself. This classic weight covariate adjustment:

+

\[ +\exp\left(\theta_{Cl}+\eta_{Cl}\right)\times\left(\frac{WT}{70}\right)^{3/4} +\]

+

would have to written:

+

\[ +\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+3/4\times\log\left(WT/70\right)\right) +\]

+

If you wanted to estimate the population parameter \(3/4\) to see if it approaches the correct value you could with:

+

\[ +\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+\theta_{Cl, \textsf{cov}}\times\mathsf{DataCovariate}\right) +\]

+

Where \[\mathsf{DataCovariate}\] is defined in the data as \(\log\left(WT/70\right)\).

+

This is easy enough to do and adds stabilization.

+

However, with mu referencing 2.0 you can simply use an additive expression to setup mu-referencing:

+

\[ +\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+\theta_{Cl, \textsf{cov}}\times\log\left(WT/70\right)\right) +\]

+

This is a bit more convenient than creating a column in the dataset that does this conversion and less user-based intervention to make nlmixr2 use linear models when it can.

+
+
+

Checking for mu2 referencing

+

In rxode2 / nlmixr2 you can check to see if your version of nlmixr2 supports the mu2 referencing by evaluating the functional form:

+
one.compartment <- function() {
+  ini({
+    tka <- log(1.57); label("Ka")
+    tcl <- log(2.72); label("Cl")
+    tv <- log(31.5); label("V")
+    wt.cl <- 0.75; label("WT on CL")
+    eta.ka ~ 0.6
+    eta.cl ~ 0.3
+    eta.v ~ 0.1
+    add.sd <- 0.7
+  })
+  # and a model block with the error specification and model specification
+  model({
+    ka <- exp(tka + eta.ka)
+    cl <- exp(tcl + eta.cl + wt.cl*log(WT/70))
+    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)
+  })
+}
+
+one <- one.compartment()
+
+print(one)
+
##  ── rxode2-based free-form 2-cmt ODE model ─────────────────────────────────────────────── 
+##  ── Initalization: ──  
+## Fixed Effects ($theta): 
+##       tka       tcl        tv     wt.cl    add.sd 
+## 0.4510756 1.0006319 3.4499875 0.7500000 0.7000000 
+## 
+## Omega ($omega): 
+##        eta.ka eta.cl eta.v
+## eta.ka    0.6    0.0   0.0
+## eta.cl    0.0    0.3   0.0
+## eta.v     0.0    0.0   0.1
+## 
+## States ($state or $stateDf): 
+##   Compartment Number Compartment Name
+## 1                  1            depot
+## 2                  2           center
+##  ── μ-referencing ($muRefTable): ──  
+##   theta    eta level                         covariates
+## 1   tka eta.ka    id                                   
+## 2   tcl eta.cl    id log(0.0142857142857143 * WT)*wt.cl
+## 3    tv  eta.v    id                                   
+## 
+##  ── Model (Normalized Syntax): ── 
+## function() {
+##     ini({
+##         tka <- 0.451075619360217
+##         label("Ka")
+##         tcl <- 1.00063188030791
+##         label("Cl")
+##         tv <- 3.44998754583159
+##         label("V")
+##         wt.cl <- 0.75
+##         label("WT on CL")
+##         add.sd <- c(0, 0.7)
+##         eta.ka ~ 0.6
+##         eta.cl ~ 0.3
+##         eta.v ~ 0.1
+##     })
+##     model({
+##         ka <- exp(tka + eta.ka)
+##         cl <- exp(tcl + eta.cl + wt.cl * log(WT/70))
+##         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)
+##     })
+## }
+

If the mu2 referencing is supported it will show the following mu reference table:

+
── μ-referencing ($muRefTable): ──  
+  theta    eta level                         covariates
+1   tka eta.ka    id                                   
+2   tcl eta.cl    id log(0.0142857142857143 * WT)*wt.cl
+3    tv  eta.v    id                                   
+

Here it shows the transformation that is used when creating the transformed data used for mu-based covariate modeling. In this case, we have log(0.0142857142857143 * WT). It is a bit different than what is written because it is prepossessed by symengine and looks at the derivative with respect to the covariate parameter wt.cl.

+

In general, I am excited by this new feature in nlmixr2.

+
+

Why the Pokemon icon?

+

Why the icon for mu2 referencing? Every time I hear mu2 I think of the ultimate genetically modified Pokemon mewtwo.

+
+
diff --git a/content/blog/2024-07-08-mu2/index.png b/content/blog/2024-07-08-mu2/index.png new file mode 100644 index 0000000000000000000000000000000000000000..88e0a8a4e82b654d563cebddb16ae2ae8dfe6446 GIT binary patch literal 21488 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 Date: Mon, 8 Jul 2024 21:02:33 -0500 Subject: [PATCH 2/7] Move mewtwo --- .../blog/2024-07-08-mu2/{index.png => featured.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename content/blog/2024-07-08-mu2/{index.png => featured.png} (100%) diff --git a/content/blog/2024-07-08-mu2/index.png b/content/blog/2024-07-08-mu2/featured.png similarity index 100% rename from content/blog/2024-07-08-mu2/index.png rename to content/blog/2024-07-08-mu2/featured.png From 1561a5a68baa50c825e506ee6205769b3b1bbcf0 Mon Sep 17 00:00:00 2001 From: "Matthew L. Fidler" Date: Mon, 8 Jul 2024 21:05:07 -0500 Subject: [PATCH 3/7] Update with link to source --- content/blog/2024-07-08-mu2/index.Rmd | 13 ++++++++----- content/blog/2024-07-08-mu2/index.html | 11 +++++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/content/blog/2024-07-08-mu2/index.Rmd b/content/blog/2024-07-08-mu2/index.Rmd index 2f2ae34..d1f88ae 100644 --- a/content/blog/2024-07-08-mu2/index.Rmd +++ b/content/blog/2024-07-08-mu2/index.Rmd @@ -100,12 +100,12 @@ print(one) If the mu2 referencing is supported it will show the following mu reference table: -``` -── μ-referencing ($muRefTable): ── +``` +── μ-referencing ($muRefTable): ── theta eta level covariates -1 tka eta.ka id +1 tka eta.ka id 2 tcl eta.cl id log(0.0142857142857143 * WT)*wt.cl -3 tv eta.v id +3 tv eta.v id ``` Here it shows the transformation that is used when creating the transformed data used for mu-based covariate modeling. In this case, we have `log(0.0142857142857143 * WT)`. It is a bit different than what is written because it is prepossessed by `symengine` and looks at the derivative with respect to the covariate parameter `wt.cl`. @@ -114,4 +114,7 @@ In general, I am excited by this new feature in nlmixr2. ### Why the Pokemon icon? -Why the icon for mu2 referencing? Every time I hear mu2 I think of the ultimate genetically modified Pokemon mewtwo. +Why the icon for mu2 referencing? Every time I hear mu2 I think of the +ultimate genetically modified Pokemon +[mewtwo](https://goofy-legends-gl.fandom.com/wiki/Mewtwo) (which is a +link to where the image comes from). diff --git a/content/blog/2024-07-08-mu2/index.html b/content/blog/2024-07-08-mu2/index.html index 30b946f..73fd1f9 100644 --- a/content/blog/2024-07-08-mu2/index.html +++ b/content/blog/2024-07-08-mu2/index.html @@ -121,15 +121,18 @@

Checking for mu2 referencing

## }) ## }

If the mu2 referencing is supported it will show the following mu reference table:

-
── μ-referencing ($muRefTable): ──  
+
── μ-referencing ($muRefTable): ──
   theta    eta level                         covariates
-1   tka eta.ka    id                                   
+1   tka eta.ka    id
 2   tcl eta.cl    id log(0.0142857142857143 * WT)*wt.cl
-3    tv  eta.v    id                                   
+3 tv eta.v id

Here it shows the transformation that is used when creating the transformed data used for mu-based covariate modeling. In this case, we have log(0.0142857142857143 * WT). It is a bit different than what is written because it is prepossessed by symengine and looks at the derivative with respect to the covariate parameter wt.cl.

In general, I am excited by this new feature in nlmixr2.

Why the Pokemon icon?

-

Why the icon for mu2 referencing? Every time I hear mu2 I think of the ultimate genetically modified Pokemon mewtwo.

+

Why the icon for mu2 referencing? Every time I hear mu2 I think of the +ultimate genetically modified Pokemon +mewtwo (which is a +link to where the image comes from).

From 4f87875b46bdd45e8d8b7647ea79b948e91ee023 Mon Sep 17 00:00:00 2001 From: "Matthew L. Fidler" Date: Mon, 8 Jul 2024 21:07:48 -0500 Subject: [PATCH 4/7] Expand on why linear models are important --- content/blog/2024-07-08-mu2/index.Rmd | 7 +++++-- content/blog/2024-07-08-mu2/index.html | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/content/blog/2024-07-08-mu2/index.Rmd b/content/blog/2024-07-08-mu2/index.Rmd index d1f88ae..8f51575 100644 --- a/content/blog/2024-07-08-mu2/index.Rmd +++ b/content/blog/2024-07-08-mu2/index.Rmd @@ -33,9 +33,12 @@ In optimization routines like `saem`, these are switched out with a single param Once the best $\phi$ is found, then the population, individual and covariates can be found by linear regression of the individual $\phi$ values versus the information in the optimization. -This linear model is important. +This linear model adds important stability and speed when determining +these parameters in the mu-expression. (It also adds rules like they +must not be time-varying for instance). -In old versions of rxode2 and nlmixr2 the $\mathsf{DataCovariate}$ had to be in the dataset itself. This classic weight covariate adjustment: +In old versions of rxode2 and nlmixr2 the $\mathsf{DataCovariate}$ had +to be in the dataset itself. This classic weight covariate adjustment: $$ \exp\left(\theta_{Cl}+\eta_{Cl}\right)\times\left(\frac{WT}{70}\right)^{3/4} diff --git a/content/blog/2024-07-08-mu2/index.html b/content/blog/2024-07-08-mu2/index.html index 73fd1f9..8eb63dd 100644 --- a/content/blog/2024-07-08-mu2/index.html +++ b/content/blog/2024-07-08-mu2/index.html @@ -22,8 +22,11 @@

What is mu referencing in nlmixr2

\]

In optimization routines like saem, these are switched out with a single parameter during optimization classically called \(\phi\) in both NONMEM and Monolix.

Once the best \(\phi\) is found, then the population, individual and covariates can be found by linear regression of the individual \(\phi\) values versus the information in the optimization.

-

This linear model is important.

-

In old versions of rxode2 and nlmixr2 the \(\mathsf{DataCovariate}\) had to be in the dataset itself. This classic weight covariate adjustment:

+

This linear model adds important stability and speed when determining +these parameters in the mu-expression. (It also adds rules like they +must not be time-varying for instance).

+

In old versions of rxode2 and nlmixr2 the \(\mathsf{DataCovariate}\) had +to be in the dataset itself. This classic weight covariate adjustment:

\[ \exp\left(\theta_{Cl}+\eta_{Cl}\right)\times\left(\frac{WT}{70}\right)^{3/4} \]

From ca3368a266341b01a85a3f5ef8304cc44a2dc446 Mon Sep 17 00:00:00 2001 From: "Matthew L. Fidler" Date: Mon, 8 Jul 2024 21:11:06 -0500 Subject: [PATCH 5/7] Update with why it is exciting to me --- content/blog/2024-07-08-mu2/index.Rmd | 13 ++++++++++--- content/blog/2024-07-08-mu2/index.html | 11 +++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/content/blog/2024-07-08-mu2/index.Rmd b/content/blog/2024-07-08-mu2/index.Rmd index 8f51575..447ea36 100644 --- a/content/blog/2024-07-08-mu2/index.Rmd +++ b/content/blog/2024-07-08-mu2/index.Rmd @@ -111,9 +111,16 @@ If the mu2 referencing is supported it will show the following mu reference tabl 3 tv eta.v id ``` -Here it shows the transformation that is used when creating the transformed data used for mu-based covariate modeling. In this case, we have `log(0.0142857142857143 * WT)`. It is a bit different than what is written because it is prepossessed by `symengine` and looks at the derivative with respect to the covariate parameter `wt.cl`. - -In general, I am excited by this new feature in nlmixr2. +Here it shows the transformation that is used when creating the +transformed data used for mu-based covariate modeling. In this case, +we have `log(0.0142857142857143 * WT)`. It is a bit different than +what is written because it is prepossessed by `symengine` and looks at +the derivative with respect to the covariate parameter `wt.cl`. + +In general, I am excited by this new feature in nlmixr2 because it +adds a new level of simplicity to user-based models and more often +detects mu-referenced code when it may not have been detected in the +past. ### Why the Pokemon icon? diff --git a/content/blog/2024-07-08-mu2/index.html b/content/blog/2024-07-08-mu2/index.html index 8eb63dd..a0d68fb 100644 --- a/content/blog/2024-07-08-mu2/index.html +++ b/content/blog/2024-07-08-mu2/index.html @@ -129,8 +129,15 @@

Checking for mu2 referencing

1 tka eta.ka id 2 tcl eta.cl id log(0.0142857142857143 * WT)*wt.cl 3 tv eta.v id -

Here it shows the transformation that is used when creating the transformed data used for mu-based covariate modeling. In this case, we have log(0.0142857142857143 * WT). It is a bit different than what is written because it is prepossessed by symengine and looks at the derivative with respect to the covariate parameter wt.cl.

-

In general, I am excited by this new feature in nlmixr2.

+

Here it shows the transformation that is used when creating the +transformed data used for mu-based covariate modeling. In this case, +we have log(0.0142857142857143 * WT). It is a bit different than +what is written because it is prepossessed by symengine and looks at +the derivative with respect to the covariate parameter wt.cl.

+

In general, I am excited by this new feature in nlmixr2 because it +adds a new level of simplicity to user-based models and more often +detects mu-referenced code when it may not have been detected in the +past.

Why the Pokemon icon?

Why the icon for mu2 referencing? Every time I hear mu2 I think of the From 55bbfb4b9711a58e9e7aa0c6fc5b5e1dae563f5c Mon Sep 17 00:00:00 2001 From: "Matthew L. Fidler" Date: Tue, 9 Jul 2024 08:05:16 -0500 Subject: [PATCH 6/7] Update equations --- content/blog/2024-07-08-mu2/index.Rmd | 37 +++++++++++--------------- content/blog/2024-07-08-mu2/index.html | 32 ++++++++-------------- 2 files changed, 26 insertions(+), 43 deletions(-) diff --git a/content/blog/2024-07-08-mu2/index.Rmd b/content/blog/2024-07-08-mu2/index.Rmd index 447ea36..79045e8 100644 --- a/content/blog/2024-07-08-mu2/index.Rmd +++ b/content/blog/2024-07-08-mu2/index.Rmd @@ -33,12 +33,9 @@ In optimization routines like `saem`, these are switched out with a single param Once the best $\phi$ is found, then the population, individual and covariates can be found by linear regression of the individual $\phi$ values versus the information in the optimization. -This linear model adds important stability and speed when determining -these parameters in the mu-expression. (It also adds rules like they -must not be time-varying for instance). +This linear model adds important stability and speed when determining these parameters in the mu-expression. (It also adds rules like they must not be time-varying for instance). -In old versions of rxode2 and nlmixr2 the $\mathsf{DataCovariate}$ had -to be in the dataset itself. This classic weight covariate adjustment: +In old versions of rxode2 and nlmixr2 the $\mathsf{DataCovariate}$ had to be in the dataset itself. This classic weight covariate adjustment: $$ \exp\left(\theta_{Cl}+\eta_{Cl}\right)\times\left(\frac{WT}{70}\right)^{3/4} @@ -47,16 +44,22 @@ $$ would have to written: $$ -\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+3/4\times\log\left(WT/70\right)\right) +\exp\left(\theta_{Cl}+\eta_{Cl} + 3/4\times\log\left(\frac{WT}{70}\right)\right) $$ If you wanted to estimate the population parameter $3/4$ to see if it approaches the correct value you could with: $$ -\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+\theta_{Cl, \textsf{cov}}\times\mathsf{DataCovariate}\right) +\exp\left(\theta_{Cl}+\eta_{Cl} + \theta_{Cl, \textsf{cov}}\times\mathsf{DataCovariate}\right) $$ -Where $$\mathsf{DataCovariate}$$ is defined in the data as $\log\left(WT/70\right)$. +Where + +$$ + +\mathsf{DataCovariate} =\log\left(\frac{WT}{70}\right) + +$$ This is easy enough to do and adds stabilization. @@ -103,7 +106,7 @@ print(one) If the mu2 referencing is supported it will show the following mu reference table: -``` +``` ── μ-referencing ($muRefTable): ── theta eta level covariates 1 tka eta.ka id @@ -111,20 +114,10 @@ If the mu2 referencing is supported it will show the following mu reference tabl 3 tv eta.v id ``` -Here it shows the transformation that is used when creating the -transformed data used for mu-based covariate modeling. In this case, -we have `log(0.0142857142857143 * WT)`. It is a bit different than -what is written because it is prepossessed by `symengine` and looks at -the derivative with respect to the covariate parameter `wt.cl`. +Here it shows the transformation that is used when creating the transformed data used for mu-based covariate modeling. In this case, we have `log(0.0142857142857143 * WT)`. It is a bit different than what is written because it is prepossessed by `symengine` and looks at the derivative with respect to the covariate parameter `wt.cl`. -In general, I am excited by this new feature in nlmixr2 because it -adds a new level of simplicity to user-based models and more often -detects mu-referenced code when it may not have been detected in the -past. +In general, I am excited by this new feature in nlmixr2 because it adds a new level of simplicity to user-based models and more often detects mu-referenced code when it may not have been detected in the past. ### Why the Pokemon icon? -Why the icon for mu2 referencing? Every time I hear mu2 I think of the -ultimate genetically modified Pokemon -[mewtwo](https://goofy-legends-gl.fandom.com/wiki/Mewtwo) (which is a -link to where the image comes from). +Why the icon for mu2 referencing? Every time I hear mu2 I think of the ultimate genetically modified Pokemon [mewtwo](https://goofy-legends-gl.fandom.com/wiki/Mewtwo) (which is a link to where the image comes from). diff --git a/content/blog/2024-07-08-mu2/index.html b/content/blog/2024-07-08-mu2/index.html index a0d68fb..b7beaaa 100644 --- a/content/blog/2024-07-08-mu2/index.html +++ b/content/blog/2024-07-08-mu2/index.html @@ -22,23 +22,23 @@

What is mu referencing in nlmixr2

\]

In optimization routines like saem, these are switched out with a single parameter during optimization classically called \(\phi\) in both NONMEM and Monolix.

Once the best \(\phi\) is found, then the population, individual and covariates can be found by linear regression of the individual \(\phi\) values versus the information in the optimization.

-

This linear model adds important stability and speed when determining -these parameters in the mu-expression. (It also adds rules like they -must not be time-varying for instance).

-

In old versions of rxode2 and nlmixr2 the \(\mathsf{DataCovariate}\) had -to be in the dataset itself. This classic weight covariate adjustment:

+

This linear model adds important stability and speed when determining these parameters in the mu-expression. (It also adds rules like they must not be time-varying for instance).

+

In old versions of rxode2 and nlmixr2 the \(\mathsf{DataCovariate}\) had to be in the dataset itself. This classic weight covariate adjustment:

\[ \exp\left(\theta_{Cl}+\eta_{Cl}\right)\times\left(\frac{WT}{70}\right)^{3/4} \]

would have to written:

\[ -\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+3/4\times\log\left(WT/70\right)\right) +\exp\left(\theta_{Cl}+\eta_{Cl} + 3/4\times\log\left(\frac{WT}{70}\right)\right) \]

If you wanted to estimate the population parameter \(3/4\) to see if it approaches the correct value you could with:

\[ -\exp\left(\theta_{Cl}+\eta_{Cl} + \frac{WT}{70}+\theta_{Cl, \textsf{cov}}\times\mathsf{DataCovariate}\right) +\exp\left(\theta_{Cl}+\eta_{Cl} + \theta_{Cl, \textsf{cov}}\times\mathsf{DataCovariate}\right) \]

-

Where \[\mathsf{DataCovariate}\] is defined in the data as \(\log\left(WT/70\right)\).

+

Where

+

$$

+

=()

+

$$

This is easy enough to do and adds stabilization.

However, with mu referencing 2.0 you can simply use an additive expression to setup mu-referencing:

\[ @@ -129,20 +129,10 @@

Checking for mu2 referencing

1 tka eta.ka id 2 tcl eta.cl id log(0.0142857142857143 * WT)*wt.cl 3 tv eta.v id -

Here it shows the transformation that is used when creating the -transformed data used for mu-based covariate modeling. In this case, -we have log(0.0142857142857143 * WT). It is a bit different than -what is written because it is prepossessed by symengine and looks at -the derivative with respect to the covariate parameter wt.cl.

-

In general, I am excited by this new feature in nlmixr2 because it -adds a new level of simplicity to user-based models and more often -detects mu-referenced code when it may not have been detected in the -past.

+

Here it shows the transformation that is used when creating the transformed data used for mu-based covariate modeling. In this case, we have log(0.0142857142857143 * WT). It is a bit different than what is written because it is prepossessed by symengine and looks at the derivative with respect to the covariate parameter wt.cl.

+

In general, I am excited by this new feature in nlmixr2 because it adds a new level of simplicity to user-based models and more often detects mu-referenced code when it may not have been detected in the past.

Why the Pokemon icon?

-

Why the icon for mu2 referencing? Every time I hear mu2 I think of the -ultimate genetically modified Pokemon -mewtwo (which is a -link to where the image comes from).

+

Why the icon for mu2 referencing? Every time I hear mu2 I think of the ultimate genetically modified Pokemon mewtwo (which is a link to where the image comes from).

From 67d3b83678882cc8b71e8bc74588d8dea13e7974 Mon Sep 17 00:00:00 2001 From: "Matthew L. Fidler" Date: Tue, 9 Jul 2024 08:07:18 -0500 Subject: [PATCH 7/7] Fix spacing for index render --- content/blog/2024-07-08-mu2/index.Rmd | 4 +--- content/blog/2024-07-08-mu2/index.html | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/content/blog/2024-07-08-mu2/index.Rmd b/content/blog/2024-07-08-mu2/index.Rmd index 79045e8..7b23a40 100644 --- a/content/blog/2024-07-08-mu2/index.Rmd +++ b/content/blog/2024-07-08-mu2/index.Rmd @@ -56,9 +56,7 @@ $$ Where $$ - \mathsf{DataCovariate} =\log\left(\frac{WT}{70}\right) - $$ This is easy enough to do and adds stabilization. @@ -106,7 +104,7 @@ print(one) If the mu2 referencing is supported it will show the following mu reference table: -``` +``` ── μ-referencing ($muRefTable): ── theta eta level covariates 1 tka eta.ka id diff --git a/content/blog/2024-07-08-mu2/index.html b/content/blog/2024-07-08-mu2/index.html index b7beaaa..79e3489 100644 --- a/content/blog/2024-07-08-mu2/index.html +++ b/content/blog/2024-07-08-mu2/index.html @@ -36,9 +36,9 @@

What is mu referencing in nlmixr2

\exp\left(\theta_{Cl}+\eta_{Cl} + \theta_{Cl, \textsf{cov}}\times\mathsf{DataCovariate}\right) \]

Where

-

$$

-

=()

-

$$

+

\[ +\mathsf{DataCovariate} =\log\left(\frac{WT}{70}\right) +\]

This is easy enough to do and adds stabilization.

However, with mu referencing 2.0 you can simply use an additive expression to setup mu-referencing:

\[