Title: | In Vitro in Vivo Correlation Linear Level "A" |
---|---|
Description: | It is devoted to the IVIVC linear level A with numerical deconvolution method. The latter is working for inequal and incompatible timepoints between impulse and response curves. A numerical convolution method is also available. Application domains include pharamaceutical industry QA/QC and R&D together with academic research. |
Authors: | Aleksander Mendyk <[email protected]>, with contributions from Sebastian Polak <mfpolak@@cyf-kr.edu.pl>. |
Maintainer: | Aleksander Mendyk <[email protected]> |
License: | GPL (>= 3) |
Version: | 0.9.1 |
Built: | 2024-12-14 06:35:22 UTC |
Source: | CRAN |
This package performs linear iv vitro in vivo correlation of linear level A. It provides numerical convolution/deconvolution procedures with unequal time steps and no assumptions about the function shapes.
Package: | Rivivc |
Type: | Package |
Version: | 0.9 |
Date: | 2012-10-03 |
License: | GPLv3 |
Aleksander Mendyk and Sebastian Polak
Maintainer: Aleksander Mendyk <[email protected]>
Langenbucher (2003) F. Handling of computational in vitro/in vivo correlation problems by Microsoft Excel: III. Convolution and deconvolution. Eur J Pharm Biopharm. 56, 429-37.
This data set gives the time and concentration of the hypothetical drug after its intravenous administration. This is the simulated data set.
data(impulse)
data(impulse)
matrix
This data set gives the time and cumulative amount of the hypothetical drug absorbed. It is also used as in vitro dissolution for Rivivc example of IVIVC level A. This is the simulated data set.
data(input)
data(input)
matrix
Performs numerical convolution independent of the sampling points but requiring the same timescale of the input and impulse profiles.
NumConv(impulse.matrix,input.matrix,conv.timescale = NULL, explicit.interpolation = 1000)
NumConv(impulse.matrix,input.matrix,conv.timescale = NULL, explicit.interpolation = 1000)
impulse.matrix |
matrix of the PK profile after the drug intravenous (i.v.) administration |
input.matrix |
cumulative in vivo absorption profile |
conv.timescale |
a timescale of convolution defined either as a whole vector with specific timepoints |
explicit.interpolation |
sampling accuracy used by the interpolation method to find the same timepoints for input and impulse profiles |
Output values are:
$par |
convolved time profile based on the original timescale |
$par_explicit |
provides convolution with the explicit interpolation |
Aleksander Mendyk and Sebastian Polak
require(Rivivc) require(graphics) #i.v. data data("impulse") #p.o. PK profile data("resp") #in vitro dissolution for correlation purposes data("input") #preparing data matrices input_mtx<-as.matrix(input) impulse_mtx<-as.matrix(impulse) resp_mtx<-as.matrix(resp) #setting interpolation accuracy accur_explic<-1000 #run convolution result<-NumConv(impulse_mtx,input_mtx,explicit.interp=accur_explic) print("Raw results") print(result$par) print("Raw results explicit") print(result$par_explicit) dev.new() plot(resp_mtx) lines(result$par, type="l", col="blue") dev.new() plot(resp_mtx) lines(result$par_explicit, type="l", col="blue")
require(Rivivc) require(graphics) #i.v. data data("impulse") #p.o. PK profile data("resp") #in vitro dissolution for correlation purposes data("input") #preparing data matrices input_mtx<-as.matrix(input) impulse_mtx<-as.matrix(impulse) resp_mtx<-as.matrix(resp) #setting interpolation accuracy accur_explic<-1000 #run convolution result<-NumConv(impulse_mtx,input_mtx,explicit.interp=accur_explic) print("Raw results") print(result$par) print("Raw results explicit") print(result$par_explicit) dev.new() plot(resp_mtx) lines(result$par, type="l", col="blue") dev.new() plot(resp_mtx) lines(result$par_explicit, type="l", col="blue")
Numerical deconvolution method based on the convolution and the optim()
BFGS method to find in vivo absorption profile through the convolution approach. The function works iteratively with the cumulative in vivo absorption profile optimization performed by the BFGS method in regard to the convolved PK profile and its proximity to the real known p.o. profile.
NumDeconv(impulse.matrix,resp.matrix,dose_iv=NULL,dose_po=NULL, deconv.timescale = NULL, explicit.interpolation = 20, implicit.interpolation = 10, optim.maxit = 200)
NumDeconv(impulse.matrix,resp.matrix,dose_iv=NULL,dose_po=NULL, deconv.timescale = NULL, explicit.interpolation = 20, implicit.interpolation = 10, optim.maxit = 200)
impulse.matrix |
matrix of the PK profile after the drug intravenous (i.v.) administration |
resp.matrix |
PK profile after oral (p.o.) administration of the drug |
dose_iv |
drug dose after i.v. administration; not obligatory but if provided must be in the same units like the dose p.o. |
dose_po |
drug dose after p.o. administration; not obligatory but if provided must be in the same units like the dose i.v. |
deconv.timescale |
a timescale of deconvolution defined either as a whole vector with specific timepoints |
explicit.interpolation |
deconvolution explicit interpolation parameter, namely number of the curve interpolation points used directly by the |
implicit.interpolation |
implicit interpolation - a factor multiplying |
optim.maxit |
maximum number of iterations used by |
This method is an empirical approach to the deconvolution method with minimum mechanistic assumptions. Yet the latter involve kinetics linearity when the doses of i.v. and p.o. are different, thus the i.v. profile is scaled by multiplication with the factor of dose_po/dose_iv
. It is also important to know that large values of explicit and/or implicit accuracy lead to the long execution times. The recommended values are explicit = 20
and implicit = 10
, however this is only a rule of thumb used here. When looking for higher accuracy it is advisable to increase implicit interpolation prior to the explicit.
Three matrices are returned at the output of the function:
$par |
represents original timescale provided at the input |
$par_explicit |
provides deconvolution with the explicit interpolation |
$par_implicit |
provides deconvolution with the implicit interpolation |
Aleksander Mendyk and Sebastian Polak
require(Rivivc) require(graphics) #i.v. data data("impulse") #p.o. PK profile data("resp") #in vitro dissolution for correlation purposes data("input") #preparing data matrices input_mtx<-as.matrix(input) impulse_mtx<-as.matrix(impulse) resp_mtx<-as.matrix(resp) #setting accuracy for both interpolation modes accur_explic<-10 accur_implic<-5 #for deconvolution result<-NumDeconv(impulse_mtx,resp_mtx,explicit.interp=accur_explic,implicit.interp=accur_implic) print("Raw results") print(result$par) print("Explicit interpolation") print(result$par_explicit) print("Implicit interpolation") print(result$par_implicit) #let's compare the deconvolved curve with known input dev.new() plot(input_mtx) lines(result$par, type="l", col="blue")
require(Rivivc) require(graphics) #i.v. data data("impulse") #p.o. PK profile data("resp") #in vitro dissolution for correlation purposes data("input") #preparing data matrices input_mtx<-as.matrix(input) impulse_mtx<-as.matrix(impulse) resp_mtx<-as.matrix(resp) #setting accuracy for both interpolation modes accur_explic<-10 accur_implic<-5 #for deconvolution result<-NumDeconv(impulse_mtx,resp_mtx,explicit.interp=accur_explic,implicit.interp=accur_implic) print("Raw results") print(result$par) print("Explicit interpolation") print(result$par_explicit) print("Implicit interpolation") print(result$par_implicit) #let's compare the deconvolved curve with known input dev.new() plot(input_mtx) lines(result$par, type="l", col="blue")
This data set gives the time and concentration of the hypothetical drug after its oral administration. This is the simulated data set.
data(resp)
data(resp)
matrix
This is the major function to be called where numerical convolution ad/or deconvolution might be used for a linear in vitro in vivo correlation level A. It performes either numerical convolution via /codeNumConv() or deconvolution via /codeNumDeconv() and correlates their results with the known.data object via linear regression lm()
. If you just want raw results of convolution/deconvolution then call explicitely NumConv
or link{NumDeconv}
RivivcA(known.data, impulse.data, second.profile.data,dose_iv=NULL,dose_po=NULL, mode = "deconv", explicit.interp = 20, implicit.interp = 10, optimization.maxit = 200)
RivivcA(known.data, impulse.data, second.profile.data,dose_iv=NULL,dose_po=NULL, mode = "deconv", explicit.interp = 20, implicit.interp = 10, optimization.maxit = 200)
known.data |
the data matrix to be correlated with; depending on the state of the |
impulse.data |
matrix of the PK profile after the drug i.v. administration |
second.profile.data |
matrix of the second PK profile; depending on the |
dose_iv |
drug dose after i.v. administration; not obligatory but if provided must be in the same units like the dose p.o. |
dose_po |
drug dose after p.o. administration; not obligatory but if provided must be in the same units like the dose i.v. |
mode |
represents the method used here; two states are allowed: |
explicit.interp |
convolution and deconvolution explicit interpolation parameter, namely number of the curve interpolation points |
implicit.interp |
implicit interpolation - a factor multiplying |
optimization.maxit |
maximum number of iterations used by |
The function represents either convolution or deconvolution data together with linear regression of the above functions outputs and known data supplied as a parameter. Please bear in mind that NumDeconv() procedure is iterative and therefore depending on the parameters might require substantial amount of time to converge. Please refer to the NumDeconv
description.
$regression |
returns a whole object of the linear regression - a result from the |
$numeric |
returns results from |
Aleksander Mendyk and Sebastian Polak
require(Rivivc) require(graphics) #i.v. data data("impulse") #p.o. PK profile data("resp") #in vitro dissolution for correlation purposes data("input") #preparing data matrices input_mtx<-as.matrix(input) impulse_mtx<-as.matrix(impulse) resp_mtx<-as.matrix(resp) #setting accuracy accur_explic<-20 accur_implic<-5 #run deconvolution result<-RivivcA(input_mtx,impulse_mtx,resp_mtx, explicit.interp=accur_explic,implicit.interp=accur_implic) summary(result$regression) print("Raw results of deconvolution") print(result$numeric$par) predicted<-predict(result$regression) deconvolved_data<-unname(predicted) orig_data<-input_mtx[,2] dev.new() plot(orig_data,result$numeric$par[,2]) lines(orig_data,deconvolved_data, type="l", col="blue") dev.new() plot(input_mtx) lines(result$numeric$par, type="l", col="blue")
require(Rivivc) require(graphics) #i.v. data data("impulse") #p.o. PK profile data("resp") #in vitro dissolution for correlation purposes data("input") #preparing data matrices input_mtx<-as.matrix(input) impulse_mtx<-as.matrix(impulse) resp_mtx<-as.matrix(resp) #setting accuracy accur_explic<-20 accur_implic<-5 #run deconvolution result<-RivivcA(input_mtx,impulse_mtx,resp_mtx, explicit.interp=accur_explic,implicit.interp=accur_implic) summary(result$regression) print("Raw results of deconvolution") print(result$numeric$par) predicted<-predict(result$regression) deconvolved_data<-unname(predicted) orig_data<-input_mtx[,2] dev.new() plot(orig_data,result$numeric$par[,2]) lines(orig_data,deconvolved_data, type="l", col="blue") dev.new() plot(input_mtx) lines(result$numeric$par, type="l", col="blue")