# Inter-Subject Variation (ISV)

One way to model random variability between individuals is to use a mixed effect model. With this approach, we assign a set of one or more random effects to every individual such that their model parameters (e.g. the clearance, `m[CL]`) can deviate from the population values.

The random effect, `r[CL_isv]` for example, is a realization of a random variable drawn from a probability distribution. Typically, this is a normal distribution with the mean fixed at zero and a variance that is estimated from the data, though other distributions are possible.

This is then combined with the population value to give an individualized value for the PK parameter. For example, we can use an additive model such that an individual’s pharmacokinetic parameters deviate from the population mean:

    m[CL] = f[CL] + r[CL_isv]

Additive models can also be used for parameters such as lag times when the exact time of a dose event is not known, or when a measurement has no meaningful zero reference point (like temperature).

Most physiological quantities, however, are constrained to be positive (e.g. clearances, volumes) such that an additive model can cause problems if `m[CL]` becomes negative. It is therefore common instead to impose a log-normal distribution over `m[CL]` by applying the additive model in a log-transformed space:

    m[LOG_CL] = log(f[CL]) + r[CL_isv]
    ...
    CL = exp(m[LOG_CL])

or, equivalently,

    m[CL] = f[CL] * exp(r[CL_isv])

## Data Synthesis with ISV

Note

See One Compartment Model with Absorption and Inter-subject Variance f[CL_isv]=0.2, One Compartment Model with Absorption and Inter-subject Variance f[CL_isv]=0.01 and One Compartment Model with Absorption and Inter-subject Variance f[CL_isv]=0.5 for the Tut Script used to generate results in this section.

We illustrate Inter Subject Variability (sometimes referred to as “Between Subject Variability”) using an example based on the one compartment model with absorption that was introduced earlier (One Compartment Model with Absorption).

Because we now want several individuals, we make three changes to the EFFECTS section of the script:

1. move values that vary between individuals (`c[ID]`, `c[AMT]` and time points `t[RESET]`, `t[DOSE]` and `t[OBS]`) from the POP level into a new level, ID.
2. add to the ID level an individual-specific random effect, `r[CL_isv]`, that is responsible for inter-subject variation in the model parameter CL.
3. add to the POP level a population-specific fixed effect, `f[CL_isv]`, that specifies the variance (i.e. the spread) of the random effects, `r[CL_isv]`.

    EFFECTS:
        POP: |
            f[KA] = 0.3
            f[CL] = 3
            f[V] = 20
            f[PNOISE_STD] = 0.1
            f[ANOISE_STD] = 0.05
            # new: true inter-subject variability
            f[CL_isv] = 0.2
        ID: |
            # new: 30 individuals for this population
            c[ID] = sequential(30)
            c[AMT] = 100.0
            t[RESET] = 0.0
            t[DOSE] = 1.0
            t[OBS] ~ unif(1.0, 50.0; 4)
            # new: inter-subject variability
            r[CL_isv] ~ norm(0, f[CL_isv])

Note

The ID level sits below POP to indicate that there should be a branch of the hierarchy created for every individual in the population.

During data synthesis, PoPy adds random variation between individuals by sampling realizations of `r[CL_isv]` from the probability distribution. These realizations of `r[CL_isv]` are then used in the MODEL_PARAMS section to add inter-subject variability to the model parameter, `m[CL]`.

    MODEL_PARAMS: |
        m[KA] = f[KA]
        # new: log-normally distributed ISV
        m[CL] = f[CL]*exp(r[CL_isv])
        m[V] = f[V]
        m[PNOISE_STD] = f[PNOISE_STD]
        m[ANOISE_STD] = f[ANOISE_STD]

The rest of the script (e.g. DERIVATIVES and PREDICTIONS) are the same as for a single individual.

This variation changes the shape of the predicted curves over the set of individuals in the population (Table 21).

Table 21 Population graphs with increasing ISV: (left) CL_isv=0.01; (centre) CL_isv=0.2; (right) CL_isv=0.5

## Naïve ISV Fit

Note

See the One Compartment Model with Absorption and no inter-subject Variance f[CL_isv]=0 for the Tut Script used to generate results in this section.

Given a dataset where there are 30 subjects with ISV, we first investigate the effect of excluding ISV from the model we fit.

We can do this without changing the data synthesis code (e.g. the MODEL_PARAMS section) by fixing `f[CL_isv]` at zero such that all deviations from the population prediction are accounted for under the residual error model.

    EFFECTS:
        POP: |
            f[KA] ~ unif(0.01, 1) 0.5
            f[CL] ~ unif(0.01, 10) 1
            f[V] ~ unif (0.01, 100) 15
            f[PNOISE_STD] ~ unif(0.001, 1) 0.2
            f[ANOISE_STD] ~ unif(0.001, 1) 0.2
            # new: assumed zero inter-subject variability
            f[CL_isv] = 0.0
        ID: |
            # new: inter-subject variability
            r[CL_isv] ~ norm(0, f[CL_isv])

After the fit, we see that the population parameters (i.e. the fixed effects) are poorly estimated. In particular, the noise levels `f[PNOISE_STD]` and `f[ANOISE_STD]` are far higher than the true values because they are responsible for capturing the variation that, in reality, is ISV rather than noise.

    f[KA] = 1.0000
    f[CL] = 2.4130
    f[V] = 28.3507
    f[PNOISE_STD] = 0.5950
    f[ANOISE_STD] = 0.1184
    f[CL_isv] = 0.0000

As a reference point, the final objective function value is

    -144.925451973

## Mixed Effect ISV Fit

Note

See the One Compartment Model with Absorption and Inter-subject Variance f[CL_isv]=0.2 for the Tut Script used to generate results in this section.

We now look at a mixed effects model that allows model parameters (and predictions) to be tailored to each individual by making the ISV variance, `f[CL_isv]`, a parameter to be optimized:

    EFFECTS:
        POP: |
            f[KA] ~ unif(0.01, 1) 0.5
            f[CL] ~ unif(0.01, 10) 1
            f[V] ~ unif (0.01, 100) 15
            f[PNOISE_STD] ~ unif(0.001, 1) 0.2
            f[ANOISE_STD] ~ unif(0.001, 1) 0.2
            # new: estimated inter-subject variability
            f[CL_isv] ~ unif(0.001, 1) 0.01
        ID: |
            # new: inter-subject variability
            r[CL_isv] ~ norm(0, f[CL_isv])

As a result, the population parameters are now much closer to the values used for data synthesis (shown above). In particular, we see that the noise parameters are much more accurate since the ISV can be accounted for using `f[CL_isv]` rather than the residual noise model.

    f[KA] = 1.0000
    f[CL] = 2.4774
    f[V] = 21.8885
    f[PNOISE_STD] = 0.2295
    f[ANOISE_STD] = 0.0372
    f[CL_isv] = 0.1278

For comparison, we can also see that the final objective function value is also far lower than that obtained without modelling ISV:

    -312.0721059

Variation between subjects is just one of many sources of randomness in population data. The next source we will look at is variation within a subject from one visit to another - Inter-Occasion Variation (IOV).