Learn R Programming

expirest (version 0.1.5)

expirest_osle: Ordinary shelf life estimation (osle)

Description

Based on a linear regression model fitted to a stability data set the function expirest_osle() estimates the shelf life, or retest period, following the ICH Q1E guideline. The abbreviation “osle” stands for “ordinary shelf life estimation”.

Usage

expirest_osle(
  data,
  response_vbl,
  time_vbl,
  batch_vbl,
  sl,
  sl_sf,
  srch_range,
  alpha = 0.05,
  alpha_pool = 0.25,
  xform = c("no", "no"),
  shift = c(0, 0),
  sf_option = "loose",
  ivl = "confidence",
  ivl_type = "one.sided",
  ivl_side = "lower",
  ...
)

Value

An object of class ‘expirest_osle’ is returned, containing the following elements:

Data

Data frame of the original data including new columns with transformed variables, if applicable.

Parameters

A list of the parameters with the elements alpha, alpha.pool, ivl, ivl.type and ivl.side.

Variables

A list of the variable names, i.e. the original names of batch_vbl, time_vbl and response_vbl and, if applicable, of the transformed variables.

Model.Type

A list of five elements specifying which model, based on the ANCOVA analysis, suits best. The first element (type.spec) is a numeric vector of length 2 specifying the best model accepted at the significance level of 0.25. The first number represents the decision on the intercept and the second on the slope, where 1 stands for “common” and 2 stands for “different”. The second element (type.acronym) is an acronym representing the first item.

Models

A list of four elements named cics, dics, dids and individual. The first three elements contain the ‘lm’ objects of the “common intercept / common slope” (cics), “different intercept / common slope” (dics) and “different intercept / different slope” (dids) models. The fourth element is a list of the ‘lm’ objects of the models obtained from fitting the data of each batch individually.

AIC

A numeric named vector of the Akaike Information Criterion (AIC) values of each of the three fitted models.

BIC

A numeric named vector of the Bayesian Information Criterion (BIC) values of each of the three fitted models.

wc.icpt

A numeric value of the worst case intercept.

wc.batch

A numeric value of the worst case batch. In case of the dids model type, the estimation is done using the models obtained from fitting the data of each batch individually.

Limits

A list of all limits.

Intercepts

A list of the intercepts of the three fitted models.

POI

A numeric named vector of the POI values of each of the three fitted models. In case of the dids model type, the estimation is done using the models obtained from fitting the data of each batch individually.

Arguments

data

A data frame with the columns specified by response_vbl, time_vbl and batch_vbl.

response_vbl

A character string specifying the response variable name that must be a column of data.

time_vbl

A character string specifying the time variable name that must be a column of data.

batch_vbl

A character string specifying the column in data with the grouping information (i.e. a factorial variable) for the differentiation of the observations of the different batches.

sl

A numeric value or a numeric vector of length 2 specifying the specification limit or limits. If a vector is provided it must be of the form c(lower limit, upper limit).

sl_sf

A positive integer or a vector of positive integers specifying the number of “significant figures” (sf) of sl. It must have the same length as sl.

srch_range

A vector of length 2 specifying the end-points of the (time) range that is supposed to contain the shelf life or retest period.

alpha

A numeric value between 0 and 1 specifying the significance level for the calculation of confidence or prediction intervals. The default is 0.05.

alpha_pool

A numeric value between 0 and 1 specifying the type I error rate for the test of the poolability of the batches. The default is 0.25, following ICH Q1E guideline. The value should not be changed unless supported by well-founded reasons.

xform

A vector of two character strings specifying the transformation of the response and the time variable. The default is “no” transformation, i.e. c("no", "no"), where the first element specifies the transformation of the \(x\) variable and the second element the transformation of the \(y\) variable. Valid alternatives for \(x\) and/or \(y\) variable transformation are "log" (natural logarithm), "sqrt" (square root) and "sq" (square).

shift

A vector of two values which will be added to the variables \(x\) and/or \(y\) before they are transformed as specified by the xform parameter, where the first element will be added to the \(x\) variable and the second element to the \(y\) variable. The purpose is to prevent an undefined state which could arise when variables with values of \(\leq 0\) are log or square root transformed. The default is c(0, 0).

sf_option

A character string specifying if the limits (rl or sl) should be regarded as “tight” or “loose”, i.e. either "tight" or "loose", respectively. The option "tight" means that the limits are rounded to the specified number of significant figures specified by the parameters rl_sf and sl_sf. In case of the option "loose" the limits are rounded to the specified number of significant figures (\(n\)), followed by the subtraction of \(1\) from the \(n^{th}\) digit and addition of \(5\) to the \((n + 1)^{th}\) digit if ivl_side is "lower", or followed by the addition of \(4\) to the \((n + 1)^{th}\) digit if ivl_side is "upper".

ivl

A character string of either "confidence" or "prediction", i.e. specifying the type of interval of interest. The default is "confidence".

ivl_type

A character string specifying if a “one sided” or a “two sided” interval should be calculated, i.e. either "one.sided" or "two.sided", respectively. The default is "one.sided".

ivl_side

A character string specifying if the “upper” or the “lower” limit is the relevant limit, i.e. either "upper" or "lower", respectively. The default is "lower".

...

Additional named or unnamed arguments passed on to uniroot().

Checking batch poolability

According to ICH Q1E guideline, construction of the 95% confidence interval on the basis of the combined data of all test batches is allowed only if it has been confirmed by aid of a statistical test whether the regression lines from the different batches have a common slope and a common intercept. A significance level of alpha_pool = 0.25 has to be used for both batch-related terms, and the test of the slopes has to precede the test of the intercepts. From these tests, three possible models may be appropriate, i.e.

  • a common intercept / common slope model (cics),

  • a different intercept / common slope model (dics) or

  • a different intercept / different slope model (dids).

The common intercept / different slope model is not of practical relevance because the corresponding model is missing an effect. If the slopes are significantly different, there is no point comparing intercepts.

These requirements can be checked by aid of an “ANalysis of COVAriance” (ANCOVA) including the batch variable as interaction term. The full ANCOVA model simultaneously tests all the effects, and non-significant effects can be identified and removed for fitting of the final regression model that is used for the estimation of the shelf life or retest period.

The significance level (alpha_pool = 0.25, Type I error) is used to increase the power of the test to detect cases where the data should not be pooled. Setting alpha_pool = 0.25 decreases the probability of incorrectly concluding that stability data from multiple batches can be pooled. On the other hand, though, it increases the probability of using a single batch to determine expiry when pooling batches would be more appropriate.

Details

According to ICH Q1E guideline, “an appropriate approach to retest period or shelf life estimation is to analyse a quantitative attribute by determining the earliest time at which the 95 percent confidence limit for the mean intersects the proposed acceptance criterion” (in this package, this point is called the “point of intersection” (POI)). Furthermore, it says that “for an attribute known to increase with time, the upper one-sided 95 percent confidence limit should be compared to the acceptance criterion. For an attribute that can either increase or decrease, or whose direction of change is not known, two-sided 95 percent confidence limits should be calculated and compared to the upper and lower acceptance criteria.” With respect to the number of batches to be included in the analysis it says that “the retest period or shelf life is generally estimated based on the stability data from a minimum of three batches.

Before performing the retest period or shelf life estimation the most suitable model should be determined. It should particularly be verified if data of all test batches are poolable or not. Details on this are described in section “Checking batch poolability” below.

References

International Council for Harmonisation of Technical Requirements for Registration of Pharmaceuticals for Human (ICH), Harmonised Tripartite Guideline, Evaluation of Stability Data Q1E, step 4, February 2003 (CPMP/ICH/420/02).

See Also

expirest_wisle, find_poi, uniroot, lm, AIC, BIC.

Examples

Run this code
# Potency stability data (in % of label claim (LC)) of five batches of a drug
# product obtained over a 24 months period:
str(exp1)

# 'data.frame':	53 obs. of  3 variables:
# $ Batch  : Factor w/ 6 levels "b2","b3","b4",..: 1 1 1 1 1 1 1 1 1 1 ...
# $ Month  : num  0 1 3 3 6 6 12 12 24 24 ...
# $ Potency: num  101 101.3 99.8 99.2 99.5 ...

# Successful estimations
res1 <-
  expirest_osle(data = exp1[exp1$Batch %in% c("b2", "b5", "b7"), ],
                response_vbl = "Potency", time_vbl = "Month",
                batch_vbl = "Batch", sl = 95, sl_sf = 3, srch_range = c(0, 500))
res1$Model.Type
res1$POI

# Expected results in res1$Model.Type
# $type.spec
# common.icpt  common.slp
#           1           1
#
# $type.acronym
# [1] "cics"

# Expected results in res1$POI
#     cics     dics     dids
# 26.22410 24.80030 23.34184

res2 <-
  expirest_osle(data = exp1[exp1$Batch %in% c("b4", "b5", "b8"), ],
                response_vbl = "Potency", time_vbl = "Month",
                batch_vbl = "Batch", sl = 95, sl_sf = 3, srch_range = c(0, 500))
res2$Model.Type
res2$POI

# Expected results in res2$Model.Type
# $type.spec
# common.icpt  common.slp
#           0           0
#
# $type.acronym
# [1] "dids"

# Expected results in res2$POI
#     cics     dics     dids
# 28.12518 22.47939 15.96453

# Moisture stability data (% (w/w)) of three batches of a drug product obtained
# over a 24 months period:
str(exp3)

# 'data.frame':	33 obs. of  3 variables:
# $ Batch   : Factor w/ 3 levels "b1","b2","b3": 1 1 1 1 1 1 1 1 1 1 ...
# $ Month   : num  0 1 2 3 3 6 6 12 12 24 ...
# $ Moisture: num  2.2 1.7 3.32 2.76 2.43 ...

# Unsuccessful estimations
# Intervals are wider than the specification limits (no intersection)
res3 <-
  expirest_osle(
    data = exp3, response_vbl = "Moisture", time_vbl = "Month",
    batch_vbl = "Batch", sl = 1.5, sl_sf = 2, srch_range = c(0, 500),
    sf_option = "tight", ivl = "prediction", ivl_type = "two.sided",
    ivl_side = "lower")
res3$POI

# (Expected) results in res3$POI
# cics dics dids
#   NA   NA   NA

# Estimation may also fail because of an inappropriate 'srch-range' setting.
res4 <-
  expirest_osle(data = exp1[exp1$Batch %in% c("b2", "b5", "b7"), ],
                response_vbl = "Potency", time_vbl = "Month",
                batch_vbl = "Batch", sl = 95, sl_sf = 3, srch_range = c(0, 5))
res4$POI

# (Expected) results in res4$POI
# cics dics dids
#   NA   NA   NA

Run the code above in your browser using DataLab