1) Introduction to HTTK

Miyuki Breen, Anna Kreutz, and John Wambaugh

June 15, 2021

Please send questions to

Set vignette options

R package knitr generates html and PDF documents from this RMarkdown file, Each bit of code that follows is known as a “chunk”. We start by telling knitr how we want our chunks to look.

knitr::opts_chunk$set(echo = TRUE, fig.width=5, fig.height=4)

Description

R package httk provides pre-made, chemical independent (“generic”) models and chemical-specific data for chemical toxicokinetics (“TK”) and in vitro-in vivo extrapolation (“IVIVE”) in bioinformatics, as described by Pearce et al. (2017). Chemical-specific in vitro data have been obtained from relatively high-throughput experiments. Both physiologically-based (“PBTK”) and empirical (for example, one compartment) “TK” models can be parameterized with the data provided for thousands of chemicals, multiple exposure routes, and various species. The models consist of systems of ordinary differential equations which are solved using compiled (C-based) code for speed. A Monte Carlo sampler is included, which allows for simulating human biological variability (Ring et al., 2017) and propagating parameter uncertainty (Wambaugh et al., 2019). Calibrated methods are included for predicting tissue:plasma partition coefficients and volume of distribution (Pearce et al., 2017). These functions and data provide a set of tools for IVIVE of high-throughput screening data (for example, Tox21, ToxCast) to real-world exposures via reverse dosimetry (also known as “RTK”) (Wetmore et al., 2015).

Introduction

Chemicals can be identified using name, CAS, or DTXSID (that is, a substance identifier for the Distributed Structure- Searchable Toxicity (DSSTox) database. Available chemical- specific information includes logP, MW, pKa, intrinsic clearance, partitioning. Calculations can be performed to derive chemical properties, TK parameters, or IVIVE values. Functions are also available to perform forward dosimetry using the various models. As functions are typed at the RStudio command line, available arguments are displayed, with additional help available through the “?” operator. Vignettes for the various available packages in httk are provided to give an overview of their respective capabilities. The aim of httk is to provide a readily accessible platform for working with HTTK models.

This material is from Breen et al. (2021) “High-throughput PBTK models for in vitro to in vivo extrapolation”

Getting Started

For an introduction to R, see Irizarry (2022) “Introduction to Data Science”: http://rafalab.dfci.harvard.edu/dsbook/getting-started.html

For an introduction to toxicokinetics, with examples in “httk”, see Ring (2021) in the “TAME Toolkit”: https://uncsrp.github.io/Data-Analysis-Training-Modules/toxicokinetic-modeling.html

Dependencies

Installing R package “httk”

install.packages("httk")

“Write Privileges” On Your Personal Computer.

 Depending on the account you are using and where you want to install the package on that computer, you may need “permission” from your local file system to install the package. See this help here:

<https://stackoverflow.com/questions/42807247/installing-package-cannot-open-file-permission-denied>

and here:

<https://support.microsoft.com/en-us/topic/general-problem-installing-any-r-package-0bf1f9ba-ead2-6335-46ec-190f6af75e44>

Delete all objects from memory:

It is a bad idea to let variables and other information from previous R sessions float around, so we first remove everything in the R memory.

rm(list=ls())

Load the HTTK data, models, and functions

library(httk)

# Check what version you are using 
packageVersion("httk")
## [1] '2.4.0'

Control run speed

Portions of this vignette use Monte Carlo sampling to simulate variability and propagate uncertainty. The more samples that are used, the more stable the results are (that is, the less likely they are to change if a different random sequence is used). However, the more samples that are used, the longer it takes to run. So, to speed up how fast these examples run, we specify here that we only want to use 25 samples, even though the actual httk default is 1000. Increase this number to get more stable (and accurate) results:

NSAMP <- 25

Suppressing Messages

Note that since in vitro-in vivo extrapolation (IVIVE) is built upon many, many assumptions, *httk** attempts to give many warning messages by default. These messages do not usually mean something is wrong, but are rather intended to make the user aware of the assumptions involved. However, they quickly grow annoying and can be turned off with the “suppress.messages=TRUE” argument. Proceed with caution…

css <- calc_analytic_css(chem.name = "Bisphenol A",
                  suppress.messages = FALSE)
## Warning in get_clint(dtxsid = dtxsid, chem.name = chem.name, chem.cas =
## chem.cas, : Clint is provided as a distribution.
## Warning in apply_clint_adjustment(Clint.point, Fu_hep = Fu_hep,
## suppress.messages = suppress.messages): Clint adjusted for in vitro
## partitioning (Kilford, 2008), see calc_hep_fu.
## Warning in get_fup(dtxsid = dtxsid, chem.name = chem.name, chem.cas = chem.cas,
## : Fraction unbound is provided as a distribution.
## Warning in apply_fup_adjustment(fup.point, fup.correction = fup.adjustment, :
## Fup adjusted for in vivo lipid partitioning (Pearce, 2017), see
## calc_fup_correction.
## Warning in available_rblood2plasma(chem.cas = chem.cas, species = species, :
## Human in vivo measured Rblood2plasma used.
## Warning in get_caco2(chem.cas = chem.cas, chem.name = chem.name, dtxsid =
## dtxsid, : Default value of 1.6 used for Caco2 permeability.
## Plasma concentration returned in uM units.
css <- calc_analytic_css(chem.name = "Bisphenol A",
                  suppress.messages = TRUE)

Examples

head(get_cheminfo(suppress.messages = TRUE))
## [1] "2971-36-0"  "94-75-7"    "94-82-6"    "90-43-7"    "1007-28-9" 
## [6] "71751-41-2"

Remove the head() function to get the full table

get_cheminfo(suppress.messages = TRUE)

Note that we use the R built-in function head() to show only the first five rows

head(get_cheminfo(info = "all", median.only=TRUE,suppress.messages = TRUE))
##                                                Compound        CAS
## 1 2,2-bis(4-hydroxyphenyl)-1,1,1-trichloroethane (hpte)  2971-36-0
## 2                                                 2,4-d    94-75-7
## 3                                                2,4-db    94-82-6
## 4                                        2-phenylphenol    90-43-7
## 5                                6-desisopropylatrazine  1007-28-9
## 6                                             Abamectin 71751-41-2
##          DTXSID  logP    MW pKa_Accept         pKa_Donor Human.Clint
## 1 DTXSID8022325 4.622 317.6       <NA>              8.33      136.50
## 2 DTXSID0020442 2.809 221.0       <NA>              2.42        0.00
## 3 DTXSID7024035 3.528 249.1       <NA>              3.11        0.00
## 4 DTXSID2021151 3.091 170.2       <NA>              9.35        0.00
## 5 DTXSID0037495 1.150 173.6       3.43              <NA>        0.00
## 6 DTXSID8023892 4.480 819.0       <NA> 12.47,13.17,13.80        5.24
##   Human.Clint.pValue Human.Funbound.plasma Human.Rblood2plasma
## 1          0.0000357              0.005000                  NA
## 2          0.1488000              0.040010                2.11
## 3          0.1038000              0.006623                  NA
## 4          0.1635000              0.041050                  NA
## 5          0.5387000              0.458800                  NA
## 6          0.0009170              0.066870                  NA
"80-05-7" %in% get_cheminfo(suppress.messages = TRUE)
## [1] TRUE
subset(get_cheminfo(info = "all",suppress.messages = TRUE), 
       Compound %in% c("A","B","C"))
##  [1] Compound              CAS                   DTXSID               
##  [4] logP                  MW                    pKa_Accept           
##  [7] pKa_Donor             Human.Clint           Human.Clint.pValue   
## [10] Human.Funbound.plasma Human.Rblood2plasma  
## <0 rows> (or 0-length row.names)
calc_mc_oral_equiv(0.1,
                   chem.cas = "34256-82-1",
                   species = "human",
                   samples = NSAMP,
                   suppress.messages = TRUE)
## Warning in get_caco2(chem.cas = chem.cas, chem.name = chem.name, dtxsid =
## dtxsid, : Clint is provided as a distribution.
## Warning in (function (chem.name = NULL, chem.cas = NULL, dtxsid = NULL, :
## calc_analytic_css deprecated argument daily.dose replaced with new argument
## dose, value given assigned to dose
## Human plasma concentration returned in uM units for 0.95 quantile.
##    95% 
## 0.1262
calc_mc_oral_equiv(0.1,
                   chem.cas = "99-71-8", 
                   species = "human",
                   samples = NSAMP,
                   suppress.messages = TRUE)
## Warning in get_caco2(chem.cas = chem.cas, chem.name = chem.name, dtxsid =
## dtxsid, : Default value of 1.6 used for Caco2 permeability.
## Warning in (function (chem.name = NULL, chem.cas = NULL, dtxsid = NULL, :
## calc_analytic_css deprecated argument daily.dose replaced with new argument
## dose, value given assigned to dose
## Human plasma concentration returned in uM units for 0.95 quantile.
##     95% 
## 0.02513
calc_tkstats(chem.cas = "34256-82-1",
             species = "rat",
             suppress.messages = TRUE)
## $AUC
## [1] 2.158
## 
## $peak
## [1] 0.5815
## 
## $mean
## [1] 0.07707
calc_tkstats(chem.cas = "962-58-3", 
             species = "rat",
             suppress.messages = TRUE)
## $AUC
## [1] 0.9342
## 
## $peak
## [1] 0.1998
## 
## $mean
## [1] 0.03336

Note that we use the R built-in function head() to show only the first five rows

head(solve_pbtk(chem.name = "bisphenol a", 
                plots = TRUE,
                days = 1,
                suppress.messages = TRUE))

##        time Agutlumen    Cgut    Cliver     Cven  Clung    Cart    Crest
## [1,] 0.0000     197.5  0.0000  0.000000 0.000000 0.0000 0.00000 0.000000
## [2,] 0.0001     197.3  0.1582  0.000479 0.000001 0.0000 0.00000 0.000000
## [3,] 0.0104     180.0 10.1300  3.063000 0.036390 0.2967 0.03130 0.007976
## [4,] 0.0208     164.1 13.6200  7.596000 0.102500 0.8846 0.09679 0.056220
## [5,] 0.0312     149.6 14.7600 11.110000 0.162000 1.4230 0.15740 0.149600
## [6,] 0.0416     136.3 14.9800 13.380000 0.206900 1.8320 0.20360 0.275500
##      Ckidney  Cplasma Atubules Ametabolized      AUC
## [1,]  0.0000 0.000000 0.000000     0.000000 0.000000
## [2,]  0.0000 0.000001 0.000000     0.000000 0.000000
## [3,]  0.3831 0.045780 0.000583     0.003302 0.000170
## [4,]  1.7530 0.128900 0.004221     0.018490 0.001074
## [5,]  3.2900 0.203700 0.011570     0.045260 0.002818
## [6,]  4.5510 0.260300 0.021980     0.080160 0.005247

my_data <- subset(get_cheminfo(info = "all",suppress.messages = TRUE), 
                  Compound %in% c("A","B","C"))
write.csv(my_data, file = "my_data.csv")

Mean and Median Fraction Unbound in Plasma

Create a data.frame with all the Fup values, we ask for model=“schmitt” since that model only needs fup, we ask for “median.only” because we don’t care about uncertainty intervals here:

library(httk)
fup.tab <- get_cheminfo(info="all",
                        median.only=TRUE,
                        model="schmitt",
                        suppress.messages = TRUE)
## Warning in get_cheminfo(info = "all", median.only = TRUE, model = "schmitt", :
## NAs introduced by coercion

Calculate the median, making sure to convert to numeric values:

median(as.numeric(fup.tab$Human.Funbound.plasma),na.rm=TRUE)
## [1] 0.13

Calculate the mean:

mean(as.numeric(fup.tab$Human.Funbound.plasma),na.rm=TRUE)
## [1] 0.2922278

Count how many non-NA values we have (should be the same as the number of rows in the table but just in case we ask for non NA values:

sum(!is.na(fup.tab$Human.Funbound.plasma))
## [1] 1706

User Notes

Help

help(httk)
help(package = httk)
vignette(package = "httk")
vignette("1_IntroToHTTK")