Individual Parameters
The [individual_parameters] block defines how population parameters (theta), random effects (eta), and covariates combine to produce individual PK parameters.
Syntax
PARAM = expression
Each line assigns a PK parameter using an arithmetic expression that can reference:
- Theta parameters -- names defined in
[parameters](e.g.,TVCL,TVV) - Eta random effects -- names defined as omega parameters (e.g.,
ETA_CL,ETA_V) - Covariates -- column names from the data file (e.g.,
WT,CRCL) - Constants -- numeric literals (e.g.,
70,0.75)
Supported Operators and Functions
| Operator/Function | Example |
|---|---|
+, -, *, / | TVCL * WT / 70 |
^ (power) | (WT/70)^0.75 |
exp() | exp(ETA_CL) |
log(), ln() | log(TVCL) |
sqrt() | sqrt(WT) |
abs() | abs(ETA_CL) |
| Parentheses | TVCL * (WT/70)^0.75 |
Comparisons (in if conditions) | WT > 70, SEX == 1, AGE != 0 |
Logical (in if conditions) | && (and), || (or), ! (not) |
| Inline conditional | if (SEX == 1) TVCL * 1.5 else TVCL |
Conditional Logic (if / else)
Two forms are supported and may be combined freely.
Block form
[individual_parameters]
if (WT > 70) {
CL = TVCL * (WT / 70)^0.75 * exp(ETA_CL)
} else if (SEX == 1) {
CL = TVCL * 1.2 * exp(ETA_CL)
} else {
CL = TVCL * exp(ETA_CL)
}
V = TVV * exp(ETA_V)
The block form is appropriate when the body contains multiple statements or
when several alternative branches are needed. Conditions support comparison
operators (<, <=, >, >=, ==, !=) and logical operators (&&,
||, !); parentheses group sub-conditions.
Inline (ternary) form
[individual_parameters]
CL = if (SEX == 1) TVCL * 1.5 else TVCL
V = TVV * exp(ETA_V)
The inline form produces a value and can appear anywhere an expression is
allowed. Both then and else branches are required.
Interaction with mu-referencing
When the assignment to a parameter is wrapped in an if block, the
(ETA → THETA) relationship is no longer unconditional, so ferx skips
mu-reference detection for that parameter. Unconditional assignments in the
same block continue to be detected normally.
Tip: if you want mu-referencing for a covariate-adjusted parameter, keep the assignment unconditional and bury the conditional inside the covariate term (e.g.
CL = TVCL * (if (WT > 70) (WT / 70)^0.75 else 1.0) * exp(ETA_CL)).
Common Parameterizations
Exponential (log-normal) random effects
The standard approach for PK parameters that must be positive:
[individual_parameters]
CL = TVCL * exp(ETA_CL)
V = TVV * exp(ETA_V)
KA = TVKA * exp(ETA_KA)
Allometric scaling with covariates
[individual_parameters]
CL = TVCL * (WT/70)^0.75 * exp(ETA_CL)
V = TVV * (WT/70)^1.0 * exp(ETA_V)
Estimated covariate effects
Use additional theta parameters for covariate coefficients:
[parameters]
theta TVCL(0.134, 0.001, 10.0)
theta THETA_WT(0.75, 0.01, 2.0)
theta THETA_CRCL(0.5, 0.01, 2.0)
[individual_parameters]
CL = TVCL * (WT/70)^THETA_WT * (CRCL/100)^THETA_CRCL * exp(ETA_CL)
Logit-normal bioavailability
Use inv_logit(logit(THETA_F) + ETA_F) to constrain bioavailability to (0, 1).
The starting value for THETA_F is set directly on the (0, 1) scale — whatever
fraction you specify is what the optimiser uses as the typical F:
[parameters]
theta THETA_F(0.70, 0.001, 0.999) # typical bioavailability = 70%
omega ETA_F ~ 0.10 # BSV on the logit scale
[individual_parameters]
F = inv_logit(logit(THETA_F) + ETA_F)
- When
ETA_F = 0,F_i = THETA_Fexactly (the logit and inv_logit cancel). ETA_Fshifts each individual's F on the logit scale, symmetrically around the typical value.- The estimated
THETA_Fin the output is directly interpretable as the typical bioavailability. omega ETA_Fis variance on the logit scale — not the variance of F itself.
The alternative form inv_logit(THETA_F + ETA_F) is also supported, where
THETA_F is on the logit scale (e.g., logit(0.70) ≈ 0.847). This is
less readable but may be useful when comparing with NONMEM models.
Automatic MU-referencing
When a line matches one of the patterns
PARAM = THETA * exp(ETA) # multiplicative / log-normal
PARAM = THETA * <anything> * exp(ETA) # multiplicative with covariate terms
PARAM = exp(log(THETA) + ETA) # canonical MU form
PARAM = THETA + ETA # additive
ferx records the (ETA → THETA) mapping and uses it to re-centre the inner-loop ETA search at each outer iteration — reproducing NONMEM / nlmixr2's MU-referencing behaviour without requiring you to write an explicit MU_i line. See the FAQ for details on which patterns are and are not detected, and for the mu_referencing = false escape hatch.
Covariate Detection
Any uppercase identifier in the expression that does not match a theta name or eta name is automatically treated as a covariate. The covariate value is read from the corresponding column in the data file.
For example, in CL = TVCL * (WT/70)^0.75 * exp(ETA_CL):
TVCLmatches a theta parameterETA_CLmatches an omega parameterWTmatches neither, so it is treated as a covariate column
PK Parameter Names
The parameter names on the left side of each assignment must map to recognized PK parameter names:
| Name | PK Parameter |
|---|---|
CL | Clearance |
V or V1 | Volume of distribution (central compartment) |
Q | Intercompartmental clearance |
V2 | Peripheral volume |
KA | Absorption rate constant |
F | Bioavailability (default 1.0 if omitted) |
For ODE models, the parameter names are user-defined and passed as a flat vector to the ODE right-hand side function.