Description
Description
About
Welcome to the UCSF TB-Lesion tool developed by Savic Labs in support of the CPTR program funded by the Bill and Melinda Gates Foundation. This tool allows simulations of the time course of drug concentrations in specific lesions during drug treatment of TB. All simulations are based on a non-linear mixed effects model based on data from clinical trial NCT00816426. More information on the methods used are available at http://journals.plos.org/plosmedicine/article?id=10.1371/journal.pmed.1002773
Some notes on use of this app:
1. Interfaces for Patient PK and Lesion PK is provided and can be switched from the left menu.
2. The Patient PK tab allows for simulation of different drug dosing in two patients, one with cavity and one without to compare their expected PK.
3. The Lesion PK tab simulates PK profiles for each individual lesion over 30 days.
4. The Patient Adherence tab simulates random patterns of adherence and its effect on steady-state levels.
5. The Multi-Drug comparison tab simulates drug onboard windows for multiple drugs as a percentage of coverage.
Please note that this tool is a research tool for TB experts. Do not use this tool to inform individual treatment decisions.Description
Patient and Therapy Settings
Patient without cavity
Exposure
Patient with cavity
Exposure
Description
Drug 1
Drug 2
Drug 3
Drug 4
Lesion Pharmacokinetics
Acknowledgements
This work was carried out with funding from US National Institutes of Health (NIH) grants R01AI106398-01 and R01AI111967, grant OPP1066499 from the Bill and Melinda Gates Foundation, the Intramural Research Program of the NIH National Institute of Allergy and Infectious Diseases (C.E.B.), the Critical Path to TB Drug Regimens (CPTR) Initiative, Bill and Melinda Gates Foundation, grants OPP1031105 and Grand Challenges in Global Health-11, and funding from the Korean Centers for Disease Control of the Korean Ministry of Health and Welfare to the International Tuberculosis Research Center.
We would also like to thank Klaus Romero and Alexander Berg from the Critical Path to TB Drug Regimens Initiative (CPTR) for their valuable discussion and support throughout this project.
Citation
The paper is freely available for anyone to read, download, and distribute.
To cite any of the results or code used from this website, please cite the original paper;
Strydom N, Gupta SV, Fox WS, Via LE, Bang H, Lee M, et al. (2019) Tuberculosis drugs’ distribution and emergence of resistance in patient’s lung lesions: A mechanistic model and tool for regimen and dose optimization. PLoS Med 16(4): e1002773. https://doi.org/10.1371/journal. pmed.1002773
model.txt
; l = Lung, l2 = Necrotic Nodule, l3 = Closed nodule caseum ; l4 = caseous fibrotic, l5 = cavity caseum ; l6 = cavity wall, l7 = fibrotic tissue ;l8 = small nodule, l9 = fungal ball [LONGITUDINAL] input = { ka, Cl, V, Q2, V2, tg, kpl2, rpl2, kpl1, rpl1, kpl3, rpl3, kpl4, rpl4, kpl5, rpl5, kpl6, rpl6, kpl7, rpl7, kpl8, rpl8, kpl9, rpl9, bc, ac, b1, b2, b3, b4, b5, b6, b7, b8, b9} PK : depot(type = 1, target = Ad, Tlag = tg) EQUATION: ; ODE's for all compartments ddt_Ad = -ka * Ad ddt_Ac = ka * Ad - Cl * Ac/V - Q2 * (Ac/V - Ap/V2) ddt_Ap = Q2 * (Ac/V - Ap/V2) ddt_Al1 = kpl1 * ((rpl1*Ac/V) - Al1) ddt_Al2 = kpl2 * ((rpl2*Ac/V) - Al2) ddt_Al3 = kpl3 * ((rpl3*Ac/V) - Al3) ddt_Al4 = kpl4 * ((rpl4*Ac/V) - Al4) ddt_Al5 = kpl5 * ((rpl5*Ac/V) - Al5) ddt_Al6 = kpl6 * ((rpl6*Ac/V) - Al6) ddt_Al7 = kpl7 * ((rpl7*Ac/V) - Al7) ddt_Al8 = kpl8 * ((rpl8*Ac/V) - Al8) ddt_Al9 = kpl9 * ((rpl9*Ac/V) - Al9) ; check if AUC output matches with function ddt_CcAUC = Ac ddt_L1AUC = Al1 ddt_L2AUC = Al2 ddt_L3AUC = Al3 ddt_L4AUC = Al4 ddt_L5AUC = Al5 ddt_L6AUC = Al6 ddt_L7AUC = Al7 ddt_L8AUC = Al8 ddt_L9AUC = Al9 ; Plasma concentrations Cc = Ac/V ; Lesion concentrations L1 = Al1 L2 = Al2 L3 = Al3 L4 = Al4 L5 = Al5 L6 = Al6 L7 = Al7 L8 = Al8 L9 = Al9 CcA = CcAUC L1A = L1AUC L2A = L2AUC L3A = L3AUC L4A = L4AUC L5A = L5AUC L6A = L6AUC L7A = L7AUC L8A = L8AUC L9A = L9AUC ; Error model gcp = bc * Cc ; proportional error on plasma concentration gca = ac + Cc ; additive error on plasma concentration g1 = b1 * L1 ; proportional error on L1 concentration g2 = b2 * L2 ; proportional error on L2 concentration g3 = b3 * L3 ; proportional error on L3 concentration g4 = b4 * L4 ; proportional error on L4 concentration g5 = b5 * L5 ; proportional error on L5 concentration g6 = b6 * L6 ; proportional error on L6 concentration g7 = b7 * L7 ; proportional error on L7 concentration g8 = b8 * L8 ; proportional error on L8 concentration g9 = b9 * L9 ; proportional error on L9 concentration DEFINITION: y1 = {distribution = normal, prediction = Cc, sd = gcp} y2 = {distribution = normal, prediction = Cc, sd = gca} y3 = {distribution = normal, prediction = L1, sd = g1} y4 = {distribution = normal, prediction = L2, sd = g2} y5 = {distribution = normal, prediction = L3, sd = g3} y6 = {distribution = normal, prediction = L4, sd = g4} y7 = {distribution = normal, prediction = L5, sd = g5} y8 = {distribution = normal, prediction = L6, sd = g6} y9 = {distribution = normal, prediction = L7, sd = g7} y10 = {distribution = normal, prediction = L8, sd = g8} y11 = {distribution = normal, prediction = L9, sd = g9} [INDIVIDUAL] input={ ka_pop, omega_ka, Cl_pop, omega_Cl, V_pop, omega_V, Q2_pop, omega_Q2, V2_pop, omega_V2, tg_pop, omega_tg, rpl1_pop, omega_rpl1, rpl2_pop, omega_rpl2, rpl3_pop, omega_rpl3, rpl4_pop, omega_rpl4, rpl5_pop, omega_rpl5, rpl6_pop, omega_rpl6, rpl7_pop, omega_rpl7, rpl8_pop, omega_rpl8, rpl9_pop, omega_rpl9} DEFINITION: ;Omega ka = {distribution = lognormal, prediction = ka_pop, sd = omega_ka} Cl = {distribution = lognormal, prediction = Cl_pop, sd = omega_Cl} V = {distribution = lognormal, prediction = V_pop, sd= omega_V} Q2 = {distribution = lognormal, prediction = Q2_pop, sd = omega_Q2} V2 = {distribution = lognormal, prediction = V2_pop, sd = omega_V2} tg = {distribution = lognormal, prediction = tg_pop, sd = omega_tg} rpl1 = {distribution = lognormal, prediction = rpl1_pop, sd = omega_rpl1} rpl2 = {distribution = lognormal, prediction = rpl2_pop, sd = omega_rpl2} rpl3 = {distribution = lognormal, prediction = rpl3_pop, sd = omega_rpl3} rpl4 = {distribution = lognormal, prediction = rpl4_pop, sd = omega_rpl4} rpl5 = {distribution = lognormal, prediction = rpl5_pop, sd = omega_rpl5} rpl6 = {distribution = lognormal, prediction = rpl6_pop, sd = omega_rpl6} rpl7 = {distribution = lognormal, prediction = rpl7_pop, sd = omega_rpl7} rpl8 = {distribution = lognormal, prediction = rpl8_pop, sd = omega_rpl8} rpl9 = {distribution = lognormal, prediction = rpl9_pop, sd = omega_rpl9}
ui.R
#Libraries------- library(shinydashboard) #Sidebar--------- sidebar <- dashboardSidebar( hr(), sidebarMenu( id="tabs", menuItem("About", tabName = "about", icon = icon("graduation-cap")), menuItem("Patient PK", tabName = "summary", icon = icon("user"), selected = TRUE), menuItem("All lesions", tabName = "plot", icon = icon("area-chart")), menuItem("Patient Adherence", tabName = "Adh", icon = icon("calendar")), menuItem("Multi-drug comparison", tabName = "Multi", icon = icon("align-center")), menuItem("Acknowledgements", tabName = "Ack", icon = icon("handshake")), menuItem("Citation", tabName = "Cite", icon = icon("link")), menuItem("Codes", icon = icon("file-text-o"), menuSubItem("Parameters", tabName = "params", icon = icon("angle-right")), menuSubItem("Mlxtran", tabName = "mlxtran", icon = icon("angle-right")), menuSubItem("ui.R", tabName = "ui", icon = icon("angle-right")), menuSubItem("server.R", tabName = "server", icon = icon("angle-right"))) ), hr(), fluidRow( column(1), column(9, fluidRow( tags$head( tags$link(rel = "stylesheet", type = "text/css", href = "boxes.css") ), tags$head(tags$link(rel="shortcut icon", href="favicon.ico")), tags$style(type="text/css", ".shiny-output-error { visibility: hidden; }", ".shiny-output-error:before { visibility: hidden; }" ) ), hr(), radioButtons("ilog", "scale", c("linear" = FALSE,"log" = TRUE), inline=TRUE), radioButtons("yaxis", "y-axis", c("fixed" = 'fixed', "free" = "free_y"), inline=TRUE), br() ) ), hr() ) #Body----- ##Lesion PK------ body <- dashboardBody( tabItems( tabItem(tabName = "plot", fluidRow( box(title = "Description", width = 12, collapsible = T, "The simulated concentration-time profiles are represented by a solid black line to represent the median (typical) patient at steady state, with the shaded light blue area representing the 95% prediction interval of 100 patients simulated. The drug, amount and frequency of dosing can be changed in the left panel", collapsed = T, status = 'primary', solidHeader = T, footer = a("https://doi.org/10.1371/journal. pmed.1002773", href="https://doi.org/10.1371/journal. pmed.1002773")), selectInput("lesion", label = "Lesion summary", choices = c('Plasma', 'Lung', 'Cavity wall','Small nodule','Caseum from cavity','Closed nodule caseum','Caseous fibrotic nodule','Necrotic nodule', 'Fibrotic tissue', 'Fungal ball')), # AUC valueBox infoBoxOutput("aucBox"), # Cmax valueBox infoBoxOutput("cmaxBox"), # Time below MIC valueBox infoBoxOutput("tmicBox"), box(width = 3, height=750, selectInput("Drug", label = "Drug", choices = c('RIF', 'INH', 'PZA', 'MFX', 'CFZ','KAN', 'LZD')), numericInput("amount1",label="Amount (mg)", value=600), numericInput("ii1", label="Dosing interval (hrs)",value=24), numericInput("mic1", label="MIC (mg/L)",value=1) ), box(width = 9, height=750, #tags$head(tags$style(".rightAlign{float:right;}")), #"Show concentration profiles for day #:", #plotOutput("timePlot", height = 40), #box(sliderInput("day1", label = '',value=30, min = 0, max = 30, step = 1), width = "100%"), plotOutput("lesion_plot", height = 750) ) ) ), ##Adherence PK------ tabItem(tabName = "Adh", box(title = "Description", width = 12, collapsible = T, "The simulated concentration-time profiles are shown by a solid black line and represent a median (typical) patient. Patient adherence can be changed and results in random missed days in the dosing schedule. A 30 day simulation is performed and the graph below can be used to zoom in on specific days. The drug, amount and frequency of dosing can be changed in the left panel", collapsed = T, status = 'primary', solidHeader = T, footer = a("https://doi.org/10.1371/journal. pmed.1002773", href="https://doi.org/10.1371/journal. pmed.1002773")), fluidRow( tags$style(HTML(".js-irs-1 .irs-single, .js-irs-1 .irs-bar-edge, .js-irs-1 .irs-bar {background: none; border-top: none ; border-bottom: none ;}")), box(width = 3, height=750, selectInput("Drug1", label = "Drug", choices = c('RIF', 'INH', 'PZA', 'MFX', 'CFZ','KAN', 'LZD')), numericInput("amount_Adh",label="Amount (mg)",value=600), numericInput("ii_Adh", label="Dosing interval (hrs)",value=24), numericInput("mic_Adh", label="MIC (mg/L)",value=1), sliderInput("adh1", label="% Adherence",value=90, min = 10, max = 100, step = 10) ), box(width = 9, height=750, tags$head(tags$style(".rightAlign{float:right;}")), "Show concentration profiles for day #:", plotOutput("timePlot", height = 40), box(sliderInput("day1", label = '',value=1, min = 0, max = 30, step = 1), width = "100%"), plotOutput("Adh_plot", height = 520) ) ) ), ##About Section------ tabItem(tabName = "about", box( width = 4,collapsible = FALSE, solidHeader = TRUE, title="About", includeHTML("about.html") ), box(height=600,collapsible = FALSE,width=8,imageOutput("myImage") ) ), ##Patient PK------ tabItem(tabName = "summary", box(title = "Description", width = 12, collapsible = T, "Two steady state scenarios are shown for a patient that has no caseous lesions and a patient that does. The solid black line represents the median (typical) patient and the red line represents a patient with lower exposure according to the determined population variability of the selected drug. The drug, amount and frequency of dosing can be changed in the left panel", collapsed = T, status = 'primary', solidHeader = T, footer = a("https://doi.org/10.1371/journal.pmed.1002773", href="https://doi.org/10.1371/journal.pmed.1002773")), box(title = "Patient and Therapy Settings", status = 'primary', width = 2, height = 600, checkboxGroupInput("percentile", label = "Patient profile for exposure", choiceNames = list(HTML('<span class="foo black"></span>Typical exposure'), HTML('<span class="foo red"></span>Low exposure')), choiceValues = c('Typical exposure', 'Low exposure'), selected=c('Typical exposure', 'Low exposure'),inline = F), selectInput("adh2", label="Missed doses", choices = c('0' = 696, '1' = 672, '2' = 648)), selectInput("Drug2", label = "Drug", choices = c('RIF', 'INH', 'PZA', 'MFX', 'CFZ','KAN', 'LZD')), selectInput("amount2", "Amount (mg)", c("600" = 600.0001,"900" = 900, "1200" = 1200), selected = "600"), radioButtons("ii2", "Frequency", c("Daily" = 24, "Twice Daily" = 12), inline=FALSE), numericInput("mic2", label = "MIC (mg/L)",value=1) ), box(title = 'Patient without cavity', width = 5, height = 600, solidHeader = TRUE, status = 'warning', plotOutput("plot2", height = 300),box(title = 'Exposure', #htmlOutput('lung'), tableOutput('table2'), width = 50, status = "warning")), box(title = 'Patient with cavity', width = 5, height = 600, solidHeader = TRUE, status = 'danger', plotOutput("plot3", height = 300), box(title = 'Exposure', #htmlOutput('cavity'), tableOutput('table3'), width = 50, status = "danger")) ), ##Multi Drug Comparison------ tabItem(tabName = "Multi", fluidRow( box(title = "Description", width = 12, collapsible = T, "The number of drugs above MIC over time at steady state over a 24h dosing interval are shown as colored blocks of an ideal drug present grid. Each colored block represents one hour that a drug is above the MIC. The drugs are stacked for each hour with different colors representing the drugs selected in their respective panels. Empty squares show no drug on board and the resulting percentage coverage of the grid is displayed below the lesion name. A typical and low exposure patient's coverage shown in the different tabs", collapsed = T, status = 'primary', solidHeader = T, footer = a("https://doi.org/10.1371/journal. pmed.1002773", href="https://doi.org/10.1371/journal. pmed.1002773")), box(title = "Drug 1", status = "danger", solidHeader = TRUE, width = 2, height = 400, selectInput("Multi_Drug1", label = "Drug", choices = c('None', 'RIF', 'INH', 'PZA', 'MFX', 'CFZ','KAN', 'LZD'), selected = 'RIF'), selectInput("Multi_amount1", "Amount (mg)", c(600,900,1200), selected = 600), radioButtons("Multi_ii1", "Frequency", c("Daily" = 24, "Twice Daily" = 12), inline=T), numericInput("Multi_mic1", label="MIC (mg/L)",value=1) ), box(title = "Drug 2", width = 2, height = 400,#background = "black", selectInput("Multi_Drug2", label = "Drug", choices = c('None', 'RIF', 'INH', 'PZA', 'MFX', 'CFZ','KAN', 'LZD'), selected = 'INH'), selectInput("Multi_amount2", "Amount (mg)", c(300,600,900), selected = 300), radioButtons("Multi_ii2", "Frequency", c("Daily" = 24, "Twice Daily" = 12), inline=T), numericInput("Multi_mic2", label="MIC (mg/L)",value=0.1) ), box(title = "Drug 3", status = "primary",solidHeader = TRUE, width = 2, height = 400, selectInput("Multi_Drug3", label = "Drug", choices = c('None', 'RIF', 'INH', 'PZA', 'MFX', 'CFZ','KAN', 'LZD'), selected = 'PZA'), selectInput("Multi_amount3", "Amount (mg)", c(1500,3000,4500), selected = 600), radioButtons("Multi_ii3", "Frequency", c("Daily" = 24, "Twice Daily" = 12), inline=T), numericInput("Multi_mic3", label="MIC (mg/L)",value=12.5) ), box(title = "Drug 4", status = "warning",solidHeader = TRUE, width = 2, height = 400, selectInput("Multi_Drug4", label = "Drug", choices = c('None', 'RIF', 'INH', 'PZA', 'MFX', 'CFZ','KAN', 'LZD'), selected = 'None'), selectInput("Multi_amount4", "Amount (mg)", c(0), selected = 0), radioButtons("Multi_ii4", "Frequency", c("Daily" = 24, "Twice Daily" = 12), inline=T), numericInput("Multi_mic4", label="MIC (mg/L)",value=0) ), box(title = "Lesion Pharmacokinetics", solidHeader = TRUE, width = 4, height = 400, selectInput("Multi_Drug5", label = "Drug", choices = c('Drug 1', 'Drug 2', 'Drug 3', 'Drug 4'), selected = 'Drug 1'), checkboxInput("legend", label = "Legend", value = T), plotOutput("LesionPK") ), tabBox(tabPanel(title = "Typical", plotOutput("multiFacet1")), tabPanel(title = 'Low exposure', plotOutput('multiFacet2')), height = 600, width = 12) ) ), ##Acknowledgement Section------ tabItem(tabName = "Ack", box( width = 12,collapsible = FALSE, solidHeader = TRUE, title="Acknowledgements", "We are grateful to the subjects who enrolled in the study; Y. Kim, M.S. Kong, Y. Cai, J. Gonzales and L. Goldfeder; and the clinical teams at the three Korean centers (Asan Medical Centre, Pusan National University Hospital, and the National Medical Center) for their efforts in making the study a success.", br(), "This work was carried out with funding from US National Institutes of Health (NIH) grants R01AI106398-01 and R01AI111967, grant OPP1066499 from the Bill and Melinda Gates Foundation, the Intramural Research Program of the NIH National Institute of Allergy and Infectious Diseases (C.E.B.), the Critical Path to TB Drug Regimens (CPTR) Initiative, Bill and Melinda Gates Foundation, grants OPP1031105 and Grand Challenges in Global Health-11, and funding from the Korean Centers for Disease Control of the Korean Ministry of Health and Welfare to the International Tuberculosis Research Center.", br(), "We would also like to thank Klaus Romero and Alexander Berg from the Critical Path to TB Drug Regimens Initiative (CPTR) for their valuable discussion and support throughout this project.") ), ##Citation Section------ tabItem(tabName = "Cite", box( width = 12,collapsible = FALSE, solidHeader = TRUE, title="Citation", "Full methodology and results of this project was published in ", a("PLOS Medicine", href="http://journals.plos.org/plosmedicine/article?id=10.1371/journal.pmed.1002773"),".", br(), "The paper is freely available for anyone to read, download, and distribute.", br(), "To cite any of the results or code used from this website, please cite the original paper;", br(), "Strydom N, Gupta SV, Fox WS, Via LE, Bang H, Lee M, et al. (2019) Tuberculosis drugs’ distribution and emergence of resistance in patient’s lung lesions: A mechanistic model and tool for regimen and dose optimization. PLoS Med 16(4): e1002773.", a("https://doi.org/10.1371/journal. pmed.1002773", href="https://doi.org/10.1371/journal. pmed.1002773") ) ), ##General item tabs------ tabItem(tabName = "params", box(solidHeader = TRUE, title="", tableOutput('tbl1') ) ), tabItem(tabName = "mlxtran", box( width = NULL, solidHeader = TRUE, title="model.txt", pre(includeText("model.txt")) ) ), tabItem(tabName = "ui", box( width = NULL, solidHeader = TRUE, title="ui.R", pre(includeText("ui.R")) ) ), tabItem(tabName = "server", box( width = NULL, solidHeader = TRUE, title="server.R", pre(includeText("server.R")) ) ) ) ) dashboardPage( dashboardHeader(title = "TB Lesions"), sidebar, body )
server.R
library("mlxR") library("ggplot2") library("gridExtra") library("tidyr") library("dplyr") library("NonCompart") library("ggthemes") simOutput1 <- list(name = c('Cc', 'L1', 'L2', 'L3', 'L4', #Steady state 'L5', 'L6', 'L7', 'L8', 'L9'), time = seq(0, 744, by = 1)) simOutput1 <- list(simOutput1) simOutput2 <- list(name = c('Cc', 'L1', 'L2', 'L3', 'L4', #Steady state 'L5', 'L6', 'L7', 'L8', 'L9'), time = seq(720, 744, by = 1)) simOutput2 <- list(simOutput2) #Drug parameters-------- RIF <- readRDS('RIF.rds') INH <- readRDS('INH.rds') MFX <- readRDS('MFX.rds') CFZ <- readRDS('CFZ.rds') KAN <- readRDS('KAN.rds') LZD <- readRDS('LZD.rds') PZA <- readRDS('PZA.rds') None <- readRDS('None.rds') noneDataset <- read.csv('noneDataset.csv') porterfield <- c('#ca222c', '#484848', '#22a6d6', '#ffca63', '#f6a192', '#f6b092', '#f6d992') drug_choice<<-"RIF" drug_choice1<<-"RIF" drug_choice2<<-"RIF" drug_choice3<<-"RIF" drug_choice4<<-"INH" drug_choice5<<-"PZA" drug_choice6<<-"None" server <- function(input, output,session) { #Simulations for cavity and lung---- res1 <- reactive({ #print(p) if(drug_choice2!=input$Drug2){ print("diff") updateSelectInput(session, "amount2", choices = dose_info$Dose[dose_info$Drug == input$Drug2], selected = dose_info$Dose[dose_info$Drug == input$Drug2][1]) updateNumericInput(session,"mic2", "MIC (mg/L)", value = dose_info$MIC[dose_info$Drug == input$Drug2][1]) dose_use<-input$amount2 assign("drug_choice2", input$Drug2, envir = .GlobalEnv) }else{ print("same") dose_use<-input$amount2 withProgress(message= 'Progress',value=0,{ #print(isolate(input$Drug2)) print(dose_use) patientN = 50 # captured distributiopatientNum groupSet <- list(size = patientN, level = "individual") p <- get(input$Drug2) t1 <- 0 nd1 = 100 t2 <- as.numeric(input$ii2)*(nd1-1)+t1 t.dose <- seq(t1,t2,by=as.numeric(input$ii2)) interval <- as.numeric(input$ii2) missedD <- as.numeric(input$adh2) seqTIME <- c(seq(0, missedD, interval), seq(720, 744, interval)) adm1 <- list(time = seqTIME, amount = as.numeric(input$amount2), type = 1) incProgress(0.2,detail="Simulating") r <- simulx( model = 'model.txt', treatment = adm1, group = list(size = patientN), parameter = p, output = simOutput2, settings =list(seed = 12345)) incProgress(0.6,detail="Done Simulating") res1 <- (r)#,z) outA <- res1 outB <- bind_cols(outA$Cc, outA$L1, outA$L2, outA$L3, outA$L4, outA$L5, outA$L6, outA$L7, outA$L8, outA$L9) outC <- outB %>% select(time, Cc, L1, L2, L3, L4, L5, L6, L7, L8, L9) outD <- gather(outC, "Lesion", "Conc", 2:11) outE <- outD outE$LESTYPE <- 'Plasma' outE[outE$Lesion == "L1", "LESTYPE"] <- 'Lung' outE[outE$Lesion == "L2", "LESTYPE"] <- 'Necrotic nodule' outE[outE$Lesion == "L3", "LESTYPE"] <- 'Closed nodule caseum' outE[outE$Lesion == "L4", "LESTYPE"] <- 'Caseous fibrotic nodule' outE[outE$Lesion == "L5", "LESTYPE"] <- 'Caseum from cavity' outE[outE$Lesion == "L6", "LESTYPE"] <- 'Cavity wall' outE[outE$Lesion == "L7", "LESTYPE"] <- 'Fibrotic tissue' outE[outE$Lesion == "L8", "LESTYPE"] <- 'Small nodule' outE[outE$Lesion == "L9", "LESTYPE"] <- 'Fungal ball' incProgress(0.7,detail="Summarizing") res2<- outE %>% group_by(time, LESTYPE) %>% summarise(lo = quantile(Conc, probs = 0.025, na.rm = T), up = quantile(Conc, probs = 0.975, na.rm = T), med = quantile(Conc, probs = 0.5, na.rm = T)) }) return(res2) } return(1) }) #Simulations for lesion plot-------- rv <- reactiveValues(trigger = FALSE) assign("drug_choice", "RIF", envir = .GlobalEnv) assign("drug_choice1", "RIF", envir = .GlobalEnv) assign("drug_choice2", "RIF", envir = .GlobalEnv) assign("drug_choice3", "RIF", envir = .GlobalEnv) assign("drug_choice4", "INH", envir = .GlobalEnv) assign("drug_choice5", "PZA", envir = .GlobalEnv) assign("drug_choice6", "None", envir = .GlobalEnv) dose_info<-read.csv("dose.csv") output$drug_dose_input <- renderUI({ selectInput("amount2", "Amount (mg)", dose_info$Dose[dose_info$Drug == input$Drug2], selected = input$Drug2[1]) }) output$drug_dose_input2 <- renderUI({ selectInput("amount_Adh", "Amount (mg)", dose_info$Dose[dose_info$Drug == input$Drug1], selected = input$Drug1[1]) }) output$drug_dose_input1 <- renderUI({ selectInput("amount1", "Amount (mg)", dose_info$Dose[dose_info$Drug == input$Drug], selected = input$Drug[1]) }) output$drug_dose_inputM1 <- renderUI({ selectInput("Multi_amount1", "Amount (mg)", dose_info$Dose[dose_info$Drug == input$Drug], selected = input$Multi_Drug1[1]) }) output$drug_dose_inputM2 <- renderUI({ selectInput("Multi_amount2", "Amount (mg)", dose_info$Dose[dose_info$Drug == input$Drug], selected = input$Multi_Drug2[1]) }) output$drug_dose_inputM3 <- renderUI({ selectInput("Multi_amount3", "Amount (mg)", dose_info$Dose[dose_info$Drug == input$Drug], selected = input$Multi_Drug3[1]) }) output$drug_dose_inputM4 <- renderUI({ selectInput("Multi_amount4", "Amount (mg)", dose_info$Dose[dose_info$Drug == input$Drug], selected = input$Multi_Drug4[1]) }) res <- reactive({ if(drug_choice!=input$Drug){ print("diff") updateNumericInput(session,"amount1", "Amount (mg)", value = dose_info$Dose[dose_info$Drug == input$Drug][1]) updateNumericInput(session,"mic1", "MIC (mg/L)", value = dose_info$MIC[dose_info$Drug == input$Drug][1]) dose_use<-input$amount1 assign("drug_choice", input$Drug, envir = .GlobalEnv) }else{ print("same") dose_use<-input$amount1 print(input$Drug) print(dose_use) #updateNumericInput(session,"amount1", "Amount (mg)", value = dose_info$Dose[dose_info$Drug == input$Drug][1]) withProgress(message= 'Progress',value=0,{ patientN = 100 # captured distribution g <- list(size = patientN, level = "individual") p <- get(input$Drug) #updateSelectInput(session, "amount1", choices = dose_info$Dose[dose_info$Drug == input$Drug]) t1 <- 0 nd1 = 100 t2 <- input$ii1*(nd1-1)+t1 t.dose <- seq(t1,t2,by=input$ii1) adm1 <- data.frame(id = rep(1:patientN,each = nd1), amount=as.numeric(input$amount1), time=rep(t.dose,patientN), type = 1) adhrate <- (input$adh1)/100 print("Simulating (less than 1 minute)") incProgress(0.2,detail="Simulating (less than 1 minute)") r <- simulx( model = 'model.txt', treatment = adm1, group = list(size = patientN), parameter = p, output = simOutput2, settings =list(seed = 12345)) incProgress(0.6,detail="Done Simulating") outA <- r outB <- bind_cols(outA$Cc, outA$L1, outA$L2, outA$L3, outA$L4, outA$L5, outA$L6, outA$L7, outA$L8, outA$L9) outC <- outB %>% select(time, Cc, L1, L2, L3, L4, L5, L6, L7, L8, L9) outD <- gather(outC, "Lesion", "Conc", 2:11) outE <- outD outE$LESTYPE <- 'Plasma' outE[outE$Lesion == "L1", "LESTYPE"] <- 'Lung' outE[outE$Lesion == "L2", "LESTYPE"] <- 'Necrotic nodule' outE[outE$Lesion == "L3", "LESTYPE"] <- 'Closed nodule caseum' outE[outE$Lesion == "L4", "LESTYPE"] <- 'Caseous fibrotic nodule' outE[outE$Lesion == "L5", "LESTYPE"] <- 'Caseum from cavity' outE[outE$Lesion == "L6", "LESTYPE"] <- 'Cavity wall' outE[outE$Lesion == "L7", "LESTYPE"] <- 'Fibrotic tissue' outE[outE$Lesion == "L8", "LESTYPE"] <- 'Small nodule' outE[outE$Lesion == "L9", "LESTYPE"] <- 'Fungal ball' #print(outE) incProgress(0.7,detail="Summarizing") distribution<- outE %>% group_by(time, LESTYPE) %>% summarise(lo = quantile(Conc, probs = 0.025, na.rm = T), up = quantile(Conc, probs = 0.975, na.rm = T), med = quantile(Conc, probs = 0.5, na.rm = T)) #print(distribution) }) return(distribution) } return(1) }) #Adherence simulation------- res2 <- reactive({ if(drug_choice!=input$Drug1){ print("diff") updateNumericInput(session,"amount_Adh", "Amount (mg)", value = dose_info$Dose[dose_info$Drug == input$Drug1][1]) updateNumericInput(session,"mic_Adh", "MIC (mg/L)", value = dose_info$MIC[dose_info$Drug == input$Drug1][1]) dose_use<-input$amount_Adh assign("drug_choice", input$Drug1, envir = .GlobalEnv) }else{ print("same") dose_use<-input$amount_Adh print(input$Drug) print(dose_use) #updateNumericInput(session,"amount1", "Amount (mg)", value = dose_info$Dose[dose_info$Drug == input$Drug][1]) withProgress(message= 'Progress',value=0,{ N <- 1 p <- get(input$Drug1) #updateSelectInput(session, "amount1", choices = dose_info$Dose[dose_info$Drug == input$Drug]) t1 <- 0 nd1 = 100 t2 <- input$ii_Adh*(nd1-1)+t1 t.dose <- seq(t1,t2,by=input$ii_Adh) adm1 <- data.frame(id = rep(1:N,each = nd1), amount=as.numeric(input$amount_Adh), time=rep(t.dose,N), type = 1) adhrate <- (input$adh1)/100 adm2 <- adm1[runif(N*nd1)<adhrate,] print("Simulating (less than 1 minute)") incProgress(0.2,detail="Simulating (less than 1 minute)") r <- simulx( model = 'model.txt', treatment = adm2, parameter = p, output = simOutput1, settings =list(seed = 12345)) incProgress(0.6,detail="Done Simulating") outA <- r outB <- bind_cols(outA$Cc, outA$L1, outA$L2, outA$L3, outA$L4, outA$L5, outA$L6, outA$L7, outA$L8, outA$L9) outC <- outB %>% select(time, Cc, L1, L2, L3, L4, L5, L6, L7, L8, L9) outD <- gather(outC, "Lesion", "Conc", 2:11) outE <- outD outE$LESTYPE <- 'Plasma' outE[outE$Lesion == "L1", "LESTYPE"] <- 'Lung' outE[outE$Lesion == "L2", "LESTYPE"] <- 'Necrotic nodule' outE[outE$Lesion == "L3", "LESTYPE"] <- 'Closed nodule caseum' outE[outE$Lesion == "L4", "LESTYPE"] <- 'Caseous fibrotic nodule' outE[outE$Lesion == "L5", "LESTYPE"] <- 'Caseum from cavity' outE[outE$Lesion == "L6", "LESTYPE"] <- 'Cavity wall' outE[outE$Lesion == "L7", "LESTYPE"] <- 'Fibrotic tissue' outE[outE$Lesion == "L8", "LESTYPE"] <- 'Small nodule' outE[outE$Lesion == "L9", "LESTYPE"] <- 'Fungal ball' #print(outE) incProgress(0.7,detail="Summarizing") }) return(outE) } return(1) }) ##Multi Drug simulation-------- ###Drug1----------- resMulti1 <- reactive({ if(drug_choice3!=input$Multi_Drug1){ print("diff") updateSelectInput(session, "Multi_amount1", choices = dose_info$Dose[dose_info$Drug == input$Multi_Drug1], selected = dose_info$Dose[dose_info$Drug == input$Multi_Drug1][1]) updateNumericInput(session,"Multi_mic1", "MIC (mg/L)", value = dose_info$MIC[dose_info$Drug == input$Multi_Drug1][1]) dose_use<-as.numeric(input$Multi_amount1) assign("drug_choice3", input$Multi_Drug1, envir = .GlobalEnv) }else{ print("same") dose_use<-input$Multi_amount1 # print(input$Multi_Drug1) # print(dose_use) #updateNumericInput(session,"amount1", "Amount (mg)", value = dose_info$Dose[dose_info$Drug == input$Drug][1]) withProgress(message= 'Progress',value=0,{ N = 100 # captured distribution g <- list(size = N, level = "individual") p <- get(input$Multi_Drug1) ii = as.numeric(input$Multi_ii1) #updateSelectInput(session, "Multi_amount1", choices = dose_info$Dose[dose_info$Drug == input$Multi_Drug1]) t1 <- 0 nd1 = 100 t2 <- ii*(nd1-1)+t1 t.dose <- seq(t1,t2,by=ii) adm1 <- data.frame(id = rep(1:N,each = nd1), amount=as.numeric(input$Multi_amount1), time=rep(t.dose,N), type = 1) print("Simulating") incProgress(0.2,detail="Simulating - Drug 1 (less than 1 minute)") r <- simulx( model = 'model.txt', treatment = adm1, group = list(size = N), parameter = p, output = simOutput2, settings =list(seed = 12345)) incProgress(0.6,detail="Done Simulating") outA <- r outB <- bind_cols(outA$Cc, outA$L1, outA$L2, outA$L3, outA$L4, outA$L5, outA$L6, outA$L7, outA$L8, outA$L9) outC <- outB %>% select(time, Cc, L1, L2, L3, L4, L5, L6, L7, L8, L9) outD <- gather(outC, "Lesion", "Conc", 2:11) outE <- outD outE$LESTYPE <- 'Plasma' outE[outE$Lesion == "L1", "LESTYPE"] <- 'Lung' outE[outE$Lesion == "L2", "LESTYPE"] <- 'Necrotic nodule' outE[outE$Lesion == "L3", "LESTYPE"] <- 'Closed nodule caseum' outE[outE$Lesion == "L4", "LESTYPE"] <- 'Caseous fibrotic nodule' outE[outE$Lesion == "L5", "LESTYPE"] <- 'Caseum from cavity' outE[outE$Lesion == "L6", "LESTYPE"] <- 'Cavity wall' outE[outE$Lesion == "L7", "LESTYPE"] <- 'Fibrotic tissue' outE[outE$Lesion == "L8", "LESTYPE"] <- 'Small nodule' outE[outE$Lesion == "L9", "LESTYPE"] <- 'Fungal ball' incProgress(0.7,detail="Summarizing - Drug 1") res2<- outE %>% group_by(time, LESTYPE) %>% summarise(lo = quantile(Conc, probs = 0.025, na.rm = T), med = quantile(Conc, probs = 0.5, na.rm = T)) }) return(res2) } return(1) }) ###Drug2----------- resMulti2 <- reactive({ if(drug_choice4!=input$Multi_Drug2){ print("diff") updateSelectInput(session,"Multi_amount2", "Amount (mg)", choices = dose_info$Dose[dose_info$Drug == input$Multi_Drug2]) updateNumericInput(session,"Multi_mic2", "MIC (mg/L)", value = dose_info$MIC[dose_info$Drug == input$Multi_Drug2][1]) dose_use<-input$Multi_amount2 assign("drug_choice4", input$Multi_Drug2, envir = .GlobalEnv) }else{ print("same") dose_use<-as.numeric(input$Multi_amount2) withProgress(message= 'Progress',value=0,{ N = 100 # captured distribution g <- list(size = N, level = "individual") p <- get(input$Multi_Drug2) ii = as.numeric(input$Multi_ii2) #updateSelectInput(session, "Multi_amount2", choices = dose_info$Dose[dose_info$Drug == input$Multi_Drug2]) t1 <- 0 nd1 = 100 t2 <- ii*(nd1-1)+t1 t.dose <- seq(t1,t2,by=ii) adm1 <- data.frame(id = rep(1:N,each = nd1), #amount=600, amount=as.numeric(dose_use), time=rep(t.dose,N), type = 1) print("Simulating") incProgress(0.2,detail="Simulating - Drug 2 (less than 1 minute)") r <- simulx( model = 'model.txt', treatment = adm1, group = list(size = N), parameter = p, output = simOutput2, settings =list(seed = 12345)) incProgress(0.6,detail="Done Simulating") outA <- r outB <- bind_cols(outA$Cc, outA$L1, outA$L2, outA$L3, outA$L4, outA$L5, outA$L6, outA$L7, outA$L8, outA$L9) outC <- outB %>% select(time, Cc, L1, L2, L3, L4, L5, L6, L7, L8, L9) outD <- gather(outC, "Lesion", "Conc", 2:11) outE <- outD outE$LESTYPE <- 'Plasma' outE[outE$Lesion == "L1", "LESTYPE"] <- 'Lung' outE[outE$Lesion == "L2", "LESTYPE"] <- 'Necrotic nodule' outE[outE$Lesion == "L3", "LESTYPE"] <- 'Closed nodule caseum' outE[outE$Lesion == "L4", "LESTYPE"] <- 'Caseous fibrotic nodule' outE[outE$Lesion == "L5", "LESTYPE"] <- 'Caseum from cavity' outE[outE$Lesion == "L6", "LESTYPE"] <- 'Cavity wall' outE[outE$Lesion == "L7", "LESTYPE"] <- 'Fibrotic tissue' outE[outE$Lesion == "L8", "LESTYPE"] <- 'Small nodule' outE[outE$Lesion == "L9", "LESTYPE"] <- 'Fungal ball' incProgress(0.7,detail="Summarizing - Drug 3") res2<- outE %>% group_by(time, LESTYPE) %>% summarise(lo = quantile(Conc, probs = 0.025, na.rm = T), med = quantile(Conc, probs = 0.5, na.rm = T)) }) return(res2) } return(1) }) ###Drug3----------- resMulti3 <- reactive({ if(drug_choice5!=input$Multi_Drug3){ print("diff") updateSelectInput(session,"Multi_amount3", "Amount (mg)", choices = dose_info$Dose[dose_info$Drug == input$Multi_Drug3]) updateNumericInput(session,"Multi_mic3", "MIC (mg/L)", value = dose_info$MIC[dose_info$Drug == input$Multi_Drug3][1]) dose_use<-input$Multi_amount3 assign("drug_choice5", input$Multi_Drug3, envir = .GlobalEnv) }else{ print("same") dose_use<-as.numeric(input$Multi_amount3) withProgress(message= 'Progress',value=0,{ N = 100 # captured distribution g <- list(size = N, level = "individual") p <- get(input$Multi_Drug3) ii = as.numeric(input$Multi_ii3) #updateSelectInput(session, "Multi_amount3", choices = dose_info$Dose[dose_info$Drug == input$Multi_Drug3]) t1 <- 0 nd1 = 100 t2 <- ii*(nd1-1)+t1 t.dose <- seq(t1,t2,by=ii) adm1 <- data.frame(id = rep(1:N,each = nd1), amount=as.numeric(dose_use), time=rep(t.dose,N), type = 1) print("Simulating") incProgress(0.2,detail="Simulating - Drug 3 (less than 1 minute)") r <- simulx( model = 'model.txt', treatment = adm1, group = list(size = N), parameter = p, output = simOutput2, settings =list(seed = 12345)) incProgress(0.6,detail="Done Simulating") outA <- r outB <- bind_cols(outA$Cc, outA$L1, outA$L2, outA$L3, outA$L4, outA$L5, outA$L6, outA$L7, outA$L8, outA$L9) outC <- outB %>% select(time, Cc, L1, L2, L3, L4, L5, L6, L7, L8, L9) outD <- gather(outC, "Lesion", "Conc", 2:11) outE <- outD outE$LESTYPE <- 'Plasma' outE[outE$Lesion == "L1", "LESTYPE"] <- 'Lung' outE[outE$Lesion == "L2", "LESTYPE"] <- 'Necrotic nodule' outE[outE$Lesion == "L3", "LESTYPE"] <- 'Closed nodule caseum' outE[outE$Lesion == "L4", "LESTYPE"] <- 'Caseous fibrotic nodule' outE[outE$Lesion == "L5", "LESTYPE"] <- 'Caseum from cavity' outE[outE$Lesion == "L6", "LESTYPE"] <- 'Cavity wall' outE[outE$Lesion == "L7", "LESTYPE"] <- 'Fibrotic tissue' outE[outE$Lesion == "L8", "LESTYPE"] <- 'Small nodule' outE[outE$Lesion == "L9", "LESTYPE"] <- 'Fungal ball' incProgress(0.7,detail="Summarizing - Drug 3") res2<- outE %>% group_by(time, LESTYPE) %>% summarise(lo = quantile(Conc, probs = 0.025, na.rm = T), med = quantile(Conc, probs = 0.5, na.rm = T)) }) return(res2) } return(1) }) ###Drug4----------- resMulti4 <- reactive({ if(drug_choice6!=input$Multi_Drug4){ print("diff") updateSelectInput(session,"Multi_amount4", "Amount (mg)", choices = dose_info$Dose[dose_info$Drug == input$Multi_Drug4]) updateNumericInput(session,"Multi_mic4", "MIC (mg/L)", value = dose_info$MIC[dose_info$Drug == input$Multi_Drug4][1]) dose_use<-input$Multi_amount4 assign("drug_choice6", input$Multi_Drug4, envir = .GlobalEnv) }else{ print("same") dose_use<-as.numeric(input$Multi_amount4) # print(input$Multi_Drug1) # print(dose_use) #updateNumericInput(session,"amount1", "Amount (mg)", value = dose_info$Dose[dose_info$Drug == input$Drug][1]) withProgress(message= 'Progress',value=0,{ N = 100 # captured distribution g <- list(size = N, level = "individual") p <- get(input$Multi_Drug4) ii = as.numeric(input$Multi_ii4) # updateSelectInput(session, "Multi_amount4", choices = dose_info$Dose[dose_info$Drug == input$Multi_Drug4]) t1 <- 0 nd1 = 100 t2 <- ii*(nd1-1)+t1 t.dose <- seq(t1,t2,by=ii) adm1 <- data.frame(id = rep(1:N,each = nd1), #amount=600, amount=as.numeric(dose_use), time=rep(t.dose,N), type = 1) print("Simulating") incProgress(0.2,detail="Simulating - Drug 4 (less than 1 minute)") r <- simulx( model = 'model.txt', treatment = adm1, group = list(size = N), parameter = p, output = simOutput2, settings =list(seed = 12345)) incProgress(0.6,detail="Done Simulating") outA <- r outB <- bind_cols(outA$Cc, outA$L1, outA$L2, outA$L3, outA$L4, outA$L5, outA$L6, outA$L7, outA$L8, outA$L9) outC <- outB %>% select(time, Cc, L1, L2, L3, L4, L5, L6, L7, L8, L9) outD <- gather(outC, "Lesion", "Conc", 2:11) outE <- outD outE$LESTYPE <- 'Plasma' outE[outE$Lesion == "L1", "LESTYPE"] <- 'Lung' outE[outE$Lesion == "L2", "LESTYPE"] <- 'Necrotic nodule' outE[outE$Lesion == "L3", "LESTYPE"] <- 'Closed nodule caseum' outE[outE$Lesion == "L4", "LESTYPE"] <- 'Caseous fibrotic nodule' outE[outE$Lesion == "L5", "LESTYPE"] <- 'Caseum from cavity' outE[outE$Lesion == "L6", "LESTYPE"] <- 'Cavity wall' outE[outE$Lesion == "L7", "LESTYPE"] <- 'Fibrotic tissue' outE[outE$Lesion == "L8", "LESTYPE"] <- 'Small nodule' outE[outE$Lesion == "L9", "LESTYPE"] <- 'Fungal ball' incProgress(0.7,detail="Summarizing - Drug 4") res2<- outE %>% group_by(time, LESTYPE) %>% summarise(lo = quantile(Conc, probs = 0.025, na.rm = T), med = quantile(Conc, probs = 0.5, na.rm = T)) }) return(res2) } return(1) }) #Output boxes for lesions-------- output$aucBox <- renderInfoBox({ res <- res() outA <- res %>% filter(LESTYPE == input$lesion) outB <- LogAUC(outA$time, outA$med) infoBox( "Mean daily AUC", paste0(prettyNum((outB["AUC"]), format = 'g', digits = 3), " mg.hr/L"),# icon = icon("list"),'expCas$cmax' color = "light-blue", fill = F ) }) output$cmaxBox <- renderInfoBox({ res <- res() outA <- res %>% group_by(LESTYPE) %>% summarise(cmax = max(med)) %>% filter(LESTYPE == input$lesion) infoBox( "Cmax", paste0(prettyNum(outA$cmax, format = 'g', digits = 3), " mg/L"),# icon = icon("list"),'expCas$cmax' color = "light-blue" ) }) output$tmicBox <- renderInfoBox({ res = res() outA <- res mic <- input$mic1 outE <- outA %>% mutate(tabove = ifelse(med < mic, 1, 0)) %>% group_by(LESTYPE) %>% summarise(totalhours = (sum(tabove)-1)) %>% mutate(totalhours = ifelse(totalhours ==-1, 0, totalhours)) outF <- filter(outE, LESTYPE == input$lesion) infoBox( "Time below MIC", paste0(prettyNum(((outF$totalhours)),format = 'g', digits = '3'), ' h/d'),# icon = icon("thumbs-up", lib = "glyphicon"), color = "light-blue" ) }) file_set<-c('RIF', 'INH', 'PZA', 'MFX', 'CFZ','KAN', 'LZD') vars_to_read<-c('ka_pop','Cl_pop','V_pop','Q2_pop','V2_pop','tg_pop',"rpl1_pop","rpl2_pop","rpl3_pop","rpl4_pop","rpl5_pop", "rpl6_pop","rpl7_pop","rpl8_pop","rpl9_pop","kpl1","kpl2","kpl3","kpl4","kpl5", "kpl6","kpl7","kpl8","kpl9") literal_read<-c('ka','Cl','V','Q2','V2','tg',"rpl1","rpl2","rpl3","rpl4","rpl5", "rpl6","rpl7","rpl8","rpl9","kpl1","kpl2","kpl3","kpl4","kpl5", "kpl6","kpl7","kpl8","kpl9") df_tbl3 <- as.data.frame(setNames(replicate(length(literal_read),numeric(0), simplify = F), literal_read[1:length(literal_read)])) for(fi_s in file_set){ df_rds<-readRDS(paste(fi_s,'.rds',sep="")) df_rds<-data.frame(as.list(df_rds)) df_rds<-df_rds[,colnames(df_rds)%in%vars_to_read] df_tbl3<-rbind(df_tbl3,df_rds) } colnames(df_tbl3)<-literal_read rownames(df_tbl3)<-file_set df_tbl3<-t(df_tbl3) df_rds<-data.frame( Parameter=literal_read ) df_tbl3<-cbind(df_rds,df_tbl3) output$tbl1 <- renderTable({ df_tbl3 }) output$myImage <- renderImage({ list(src = "about.png", contentType = 'image/png', #width = 400, height = 500, alt = "Box Model of pk equations") }, deleteFile = FALSE) #Output lesion plot ---- output$lesion_plot <- renderPlot({ withProgress(message= 'Progress',value=0.9, detail = "Plotting - almost there", { res = res() mic = input$mic1 limits = input$yaxis res$LESTYPE <- factor(res$LESTYPE, c('Plasma', 'Lung', 'Cavity wall','Small nodule','Caseum from cavity','Closed nodule caseum','Caseous fibrotic nodule','Necrotic nodule', 'Fibrotic tissue', 'Fungal ball')) resCFZ <- filter(res, LESTYPE != 'Fungal ball', LESTYPE != 'Closed nodule caseum') resLZD <- filter(res, LESTYPE != 'Fungal ball') if(input$Drug == 'LZD'){ resA <- resLZD } else {if(input$Drug == 'CFZ'){ resA <- resCFZ} else {resA <- res} } p <- ggplot(resA, aes(time-720, med)) + geom_ribbon(aes(ymin = lo, ymax = up), alpha = 0.2, fill = "#21a6d5", size = 0.01) + geom_line(color = 'black', size = 1) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(breaks = seq(0, 744, by=12)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + facet_wrap(~LESTYPE, scales = limits) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) if (input$ilog==TRUE) p=p + scale_y_log10() }) print(p) }, height = 500) #Adh plot-------- output$Adh_plot <- renderPlot({ withProgress(message= 'Progress',value=0.9, detail = "Plotting - almost there", { res = res2() mic = input$mic_Adh limits = input$yaxis res$LESTYPE <- factor(res$LESTYPE, c('Plasma', 'Lung', 'Cavity wall','Small nodule','Caseum from cavity','Closed nodule caseum','Caseous fibrotic nodule','Necrotic nodule', 'Fibrotic tissue', 'Fungal ball')) resCFZ <- filter(res, LESTYPE != 'Fungal ball', LESTYPE != 'Closed nodule caseum') resLZD <- filter(res, LESTYPE != 'Fungal ball') if(input$Drug == 'CFZ'){ resA <- resCFZ } else {if(input$Drug == 'LZD'){ resA <- resLZD} else {resA <- res} } x_limits = c(input$day1*24, (input$day1*24)+24) adhPlot <- ggplot(resA, aes(time, Conc)) + geom_line(color = 'black', size = 1) + xlab("Time after dose (hrs)") + scale_x_continuous(limits = x_limits, breaks = seq(0, 744, by=12)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + facet_wrap(~LESTYPE, scales = limits) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) if (input$ilog==TRUE) adhPlot=adhPlot + scale_y_log10() }) print(adhPlot) }, height = 500) #Day select plot------- output$timePlot <- renderPlot({ res = res2() resLesion <- filter(res, LESTYPE == input$lesion) timePlot <- ggplot(resLesion, aes(time, Conc)) + geom_line(color = 'black', size = 1) + scale_x_continuous(limits = c(0, 744)) + scale_y_continuous(limits = c(0, NA)) + theme_void() print(timePlot) }) #Lesion PK plot----- output$LesionPK <- renderPlot({ res1 = resMulti1() res2 = resMulti2() res3 = resMulti3() res4 = resMulti4() drug1 = input$Multi_Drug1 drug2 = input$Multi_Drug2 drug3 = input$Multi_Drug3 drug4 = input$Multi_Drug4 selectedDrug <- input$Multi_Drug5 mic1 = input$Multi_mic1 mic2 = input$Multi_mic2 mic3 = input$Multi_mic3 mic4 = input$Multi_mic4 resM1 <- mutate(res1, Drug = "Drug 1", drugName = drug1, mic = mic1) resM2 <- mutate(res2, Drug = "Drug 2", drugName = drug2, mic = mic2) resM3 <- mutate(res3, Drug = "Drug 3", drugName = drug3, mic = mic3) resM4 <- mutate(res4, Drug = "Drug 4", drugName = drug4, mic = mic4) resM5 <- bind_rows(resM1, resM2, resM3, resM4) pkData <- filter(resM5, Drug == selectedDrug) #legendCheck <- input$legend legendPosition <- ifelse(input$legend==T, "right", "none") PlotPK <- ggplot(pkData, aes(x = (time-720), y = med, color = LESTYPE)) + geom_line() + scale_x_continuous(limits = c(0, 24), breaks = seq(0, 24, by = 12)) + xlab("Time after dose (hrs)") + scale_color_brewer(palette = "Paired")+ ggtitle(label = pkData$drugName) + ylab("Conc mg/L") + geom_line(aes((x = time-720), y = pkData$mic), color = 'black', linetype = 2) + theme_bw(base_family = "Helvetica") + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position = legendPosition, plot.title = element_text(hjust = 0.5)) if (input$ilog==TRUE) PlotPK=PlotPK + scale_y_log10() print(PlotPK) }, height = 220, width = 300) #Output Multi Drug ----- output$multiFacet1 <- renderPlot({ withProgress(message= 'Progress',value=0.9, detail = "Plotting - almost there", { res1 = resMulti1() res2 = resMulti2() res3 = resMulti3() res4 = resMulti4() mic1 = as.numeric(input$Multi_mic1) drug1 = input$Multi_Drug1 mic2 = as.numeric(input$Multi_mic2) drug2 = input$Multi_Drug2 mic3 = as.numeric(input$Multi_mic3) drug3 = input$Multi_Drug3 mic4 = as.numeric(input$Multi_mic4) drug4 = input$Multi_Drug4 timebar1 <- res1 %>% mutate(tabove = ifelse(med > mic1, 1, 0), DRUG = paste("Drug 1 - ", drug1, sep = "")) %>% select(LESTYPE, DRUG, time, tabove) timebar2 <- res2 %>% mutate(tabove = ifelse(med > mic2, 1, 0), DRUG = paste("Drug 2 - ", drug2, sep = "")) %>% select(LESTYPE, DRUG, time, tabove) timebar3 <- res3 %>% mutate(tabove = ifelse(med > mic3, 1, 0), DRUG = paste("Drug 3 - ", drug3, sep = "")) %>% select(LESTYPE, DRUG, time, tabove) timebar4 <- res4 %>% mutate(tabove = ifelse(med > mic4, 1, 0), DRUG = paste("Drug 4 - ", drug4, sep = "")) %>% select(LESTYPE, DRUG, time, tabove) mergeLego <- bind_rows(timebar1, timebar2, timebar3, timebar4) filter_d <- mergeLego %>% filter(tabove == 1) #%>% # filter(DRUG %in% c("RIF","INH","PZA")) histoDF = filter_d %>% group_by(LESTYPE) %>% arrange(time) %>% # sort using longitudinal time mutate(time_rounded = (time+1) - ( (time+1) %% 1 ) ) %>% # This attributes a bin to each observation. Here 1hr is the size of the bin. mutate(nDrugs=ave(time_rounded, time_rounded, FUN=seq_along)) # This calculates the position on the Y axis: 1, 2, 3, 4... none_data1 <- data_frame(time_rounded = rep(seq(0, 25, 1)+720,3), nDrugs = c(rep(1, 26), rep(2, 26), rep(3, 26)), DRUG = "none") none_data2 <- data_frame(time_rounded = rep(seq(0, 25, 1)+720,4), nDrugs = c(rep(1, 26), rep(2, 26), rep(3, 26), rep(4, 26)), DRUG = "none") if(input$Multi_Drug4=="None"){ emptyBlocks <- none_data1 drugTime = 75 seqBreaks = seq(1, 3, 1) }else{ emptyBlocks <- none_data2 drugTime = 100 seqBreaks = seq(1, 4, 1) } histoDF$LESTYPE <- factor(histoDF$LESTYPE, c('Plasma', 'Lung', 'Cavity wall','Small nodule','Caseum from cavity','Closed nodule caseum','Caseous fibrotic nodule','Necrotic nodule', 'Fibrotic tissue', 'Fungal ball')) histoDF$DRUG <- factor(histoDF$DRUG, c(paste("Drug 1 - ", drug1, sep = ""), paste("Drug 2 - ", drug2, sep = ""), paste("Drug 3 - ", drug3, sep = ""), paste("Drug 4 - ", drug4, sep = ""))) percDrugHours <- histoDF %>% group_by(LESTYPE) %>% summarise(perc = paste(prettyNum(length(nDrugs)/drugTime*100, format = f, digits = 1), "%", sep = "")) # Make the plot (middle) legoPlot <- ggplot(histoDF, aes(x=time_rounded-720.5, y=nDrugs)) + geom_point(data = emptyBlocks, shape = 22, size = 4.5, aes(x=time_rounded-720.5, y=nDrugs))+ geom_point(shape = 22, size = 4.5, aes(color = DRUG, fill = DRUG))+ scale_x_continuous(limits = c(0, 24), breaks = seq(0, 24, by = 1), labels = c(0, "", "", "", "", "", "6", "", "", "", "", "", 12, "", "", "", "", "", 18, "", "", "", "", "", 24), minor_breaks = c(0, 24, 1)) + scale_y_continuous(breaks = seqBreaks, limits = c(0, 5))+ geom_text(data = percDrugHours, x = 12, y = 5, label = percDrugHours$perc)+ #facet_wrap(~LESTYPE)+ xlab("Time after dose (hrs)") + ylab("Number of drugs above MIC") + theme(legend.position = "none") + scale_fill_manual(values = porterfield) + scale_color_manual(values = porterfield) + theme_tufte(base_family = "Helvetica") + #theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend position = "none")) + theme(panel.grid.major = element_blank(), legend.position = "top") + facet_wrap(~LESTYPE, scales = "free", ncol = 3) }) print(legoPlot) }, height = 500, width = 950) output$multiFacet2 <- renderPlot({ res1 = resMulti1() res2 = resMulti2() res3 = resMulti3() res4 = resMulti4() mic1 = as.numeric(input$Multi_mic1) drug1 = input$Multi_Drug1 mic2 = as.numeric(input$Multi_mic2) drug2 = input$Multi_Drug2 mic3 = as.numeric(input$Multi_mic3) drug3 = input$Multi_Drug3 mic4 = as.numeric(input$Multi_mic4) drug4 = input$Multi_Drug4 timebar1 <- res1 %>% mutate(tabove = ifelse(lo > mic1, 1, 0), DRUG = paste("Drug 1 - ", drug1, sep = "")) %>% select(LESTYPE, DRUG, time, tabove) timebar2 <- res2 %>% mutate(tabove = ifelse(lo > mic2, 1, 0), DRUG = paste("Drug 2 - ", drug2, sep = "")) %>% select(LESTYPE, DRUG, time, tabove) timebar3 <- res3 %>% mutate(tabove = ifelse(lo > mic3, 1, 0), DRUG = paste("Drug 3 - ", drug3, sep = "")) %>% select(LESTYPE, DRUG, time, tabove) timebar4 <- res4 %>% mutate(tabove = ifelse(lo > mic4, 1, 0), DRUG = paste("Drug 4 - ", drug4, sep = "")) %>% select(LESTYPE, DRUG, time, tabove) mergeLego <- bind_rows(timebar1, timebar2, timebar3, timebar4) filter_d <- mergeLego %>% filter(tabove == 1) #%>% # filter(DRUG %in% c("RIF","INH","PZA")) histoDF = filter_d %>% group_by(LESTYPE) %>% arrange(time) %>% # sort using longitudinal time mutate(time_rounded = (time+1) - ( (time+1) %% 1 ) ) %>% # This attributes a bin to each observation. Here 1hr is the size of the bin. mutate(nDrugs=ave(time_rounded, time_rounded, FUN=seq_along)) # This calculates the position on the Y axis: 1, 2, 3, 4... none_data1 <- data_frame(time_rounded = rep(seq(0, 25, 1)+720,3), nDrugs = c(rep(1, 26), rep(2, 26), rep(3, 26)), DRUG = "none") none_data2 <- data_frame(time_rounded = rep(seq(0, 25, 1)+720,4), nDrugs = c(rep(1, 26), rep(2, 26), rep(3, 26), rep(4, 26)), DRUG = "none") if(input$Multi_Drug4=="None"){ emptyBlocks <- none_data1 drugTime = 75 seqBreaks = seq(1, 3, 1) }else{ emptyBlocks <- none_data2 drugTime = 100 seqBreaks = seq(1, 4, 1) } histoDF$LESTYPE <- factor(histoDF$LESTYPE, c('Plasma', 'Lung', 'Cavity wall','Small nodule','Caseum from cavity','Closed nodule caseum','Caseous fibrotic nodule','Necrotic nodule', 'Fibrotic tissue', 'Fungal ball')) histoDF$DRUG <- factor(histoDF$DRUG, c(paste("Drug 1 - ", drug1, sep = ""), paste("Drug 2 - ", drug2, sep = ""), paste("Drug 3 - ", drug3, sep = ""), paste("Drug 4 - ", drug4, sep = ""))) percDrugHours <- histoDF %>% group_by(LESTYPE) %>% summarise(perc = paste(prettyNum(length(nDrugs)/drugTime*100, format = f, digits = 1), "%", sep = "")) # Make the plot (middle) legoPlot <- ggplot(histoDF, aes(x=time_rounded-720.5, y=nDrugs)) + geom_point(data = emptyBlocks, shape = 22, size = 4.5, aes(x=time_rounded-720.5, y=nDrugs))+ geom_point(shape = 22, size = 4.5, aes(color = DRUG, fill = DRUG))+ scale_x_continuous(limits = c(0, 24), breaks = seq(0, 24, by = 1), labels = c(0, "", "", "", "", "", "6", "", "", "", "", "", 12, "", "", "", "", "", 18, "", "", "", "", "", 24), minor_breaks = c(0, 24, 1)) + scale_y_continuous(breaks = seqBreaks, limits = c(0, 5))+ geom_text(data = percDrugHours, x = 12, y = 5, label = percDrugHours$perc)+ #facet_wrap(~LESTYPE)+ xlab("Time after dose (hrs)") + ylab("Number of drugs above MIC") + theme(legend.position = "none") + scale_fill_manual(values = porterfield) + scale_color_manual(values = porterfield) + theme_tufte(base_family = "Helvetica") + #theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend position = "none")) + theme(panel.grid.major = element_blank(), legend.position = "top") + facet_wrap(~LESTYPE, scales = "free", ncol = 3) print(legoPlot) }, height = 500, width = 950) #Output cavity plot----- output$plot3 <- renderPlot({ withProgress(message= 'Progress',value=0.9, detail = "Plotting - almost there", { res = res1() outF <- res %>% filter(LESTYPE == 'Caseum from cavity') mic = input$mic2 if(('Typical exposure'%in%input$percentile) & ('Low exposure'%in%input$percentile)){ plotCavity <- ggplot(outF, aes(time-720, med)) + #geom_ribbon(aes(ymin = lo, ymax = up), alpha = 0.2, fill = "#21a6d5", size = 0.01) + geom_line(color = 'black', size = 1) + geom_line(data = outF, aes(x = time-720, y = lo), color = 'red', size = 1) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(limits = c(0, 24), breaks = c(0, 12, 24)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) } if(!('Typical exposure'%in%input$percentile) & ('Low exposure'%in%input$percentile)){ plotCavity <- ggplot(outF, aes(time-720, med)) + #geom_ribbon(aes(ymin = lo, ymax = up), alpha = 0.2, fill = "#21a6d5", size = 0.01) + geom_line(data = outF, aes(x = time-720, y = lo), color = 'red', size = 1) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(limits = c(0, 24), breaks = c(0, 12, 24)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) } if(('Typical exposure'%in%input$percentile) & !('Low exposure'%in%input$percentile)){ plotCavity <- ggplot(outF, aes(time-720, med)) + #geom_ribbon(aes(ymin = lo, ymax = up), alpha = 0.2, fill = "#21a6d5", size = 0.01) + geom_line(color = 'black', size = 1) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(limits = c(0, 24), breaks = c(0, 12, 24)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) } if(!('Typical exposure'%in%input$percentile) & !('Low exposure'%in%input$percentile)){ plotCavity <- ggplot(outF, aes(time-720, med)) + #geom_ribbon(aes(ymin = lo, ymax = up), alpha = 0.2, fill = "#21a6d5", size = 0.01) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(limits = c(0, 24), breaks = c(0, 12, 24)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) } if (input$ilog==TRUE) plotCavity=plotCavity + scale_y_log10() }) print(plotCavity) }, height = 250) #Output lung plot------ output$plot2 <- renderPlot({ res = res1() outF <- filter(res, LESTYPE == "Lung") mic = input$mic2 if(('Typical exposure'%in%input$percentile) & ('Low exposure'%in%input$percentile)){ plotLung <- ggplot(outF, aes(time-720, med)) + geom_line(color = 'black', size = 1) + geom_line(data = outF, aes(x = time-720, y = lo), color = 'red', size = 1) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(limits = c(0, 24), breaks = c(0, 12, 24)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) plotLung=plotLung + geom_line(color = 'black', size = 1) plotLung=plotLung + geom_line(data = outF, aes(x = time-720, y = lo), color = 'red', size = 1) } if(('Typical exposure'%in%input$percentile) & !('Low exposure'%in%input$percentile)){ plotLung <- ggplot(outF, aes(time-720, med)) + geom_line(color = 'black', size = 1) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(limits = c(0, 24), breaks = c(0, 12, 24)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) plotLung=plotLung + geom_line(color = 'black', size = 1) } if(!('Typical exposure'%in%input$percentile) & ('Low exposure'%in%input$percentile)){ plotLung <- ggplot(outF, aes(time-720, med)) + geom_line(data = outF, aes(x = time-720, y = lo), color = 'red', size = 1) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(limits = c(0, 24), breaks = c(0, 12, 24)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) plotLung=plotLung + geom_line(data = outF, aes(x = time-720, y = lo), color = 'red', size = 1) } if(!('Typical exposure'%in%input$percentile) & !('Low exposure'%in%input$percentile)){ plotLung <- ggplot(outF, aes(time-720, med)) + xlab("Time after dose at steady state (hrs)") + scale_x_continuous(limits = c(0, 24), breaks = c(0, 12, 24)) + scale_y_continuous(limits = c(0, NA)) + ylab("Concentration (mg/L)") + geom_hline(yintercept = mic, linetype = 2) + theme_bw(base_family = "Helvetica") + theme(strip.background = element_rect(fill = 'white', colour = 'white'), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) } if (input$ilog==TRUE) plotLung=plotLung + scale_y_log10() print(plotLung) }, height = 250) output$lung <- renderUI({ res = res1() outA <- filter(res, LESTYPE == 'Lung') mic = input$mic2 outB <- outA %>% group_by(LESTYPE) %>% mutate(tabove = ifelse(med < mic, 1, 0)) %>% summarise(auc = sum(med), cmax = max(med), totalhours = (sum(tabove)-1))%>% mutate(totalhours = ifelse(totalhours ==-1, 0, totalhours)) auc <- paste0("AUC = ", prettyNum(outB$auc, format = 'g', digits = 3), " mg.hr/L") cmax <- paste0("Cmax = ", prettyNum(outB$cmax, format = 'g', digits = 3), " mg/L") tmic <- paste0("Time below MIC = ", prettyNum(outB$totalhours, format = 'g', digits = 3), " hrs") HTML(paste(auc, cmax, tmic, sep="<br/>")) }) output$cavity <- renderUI({ res = res1() outA <- filter(res, LESTYPE == 'Caseum from cavity') mic = input$mic2 outB <- outA %>% group_by(LESTYPE) %>% mutate(tabove = ifelse(med < mic, 1, 0)) %>% summarise(auc = sum(med), cmax = max(med), totalhours = (sum(tabove)-1))%>% mutate(totalhours = ifelse(totalhours ==-1, 0, totalhours)) auc <- paste0("AUC = ", prettyNum(outB$auc, format = 'g', digits = 3), " mg.hr/L") cmax <- paste0("Cmax = ", prettyNum(outB$cmax, format = 'g', digits = 3), " mg/L") tmic <- paste0("Time below MIC = ", prettyNum(outB$totalhours, format = 'g', digits = 3), " hrs") HTML(paste(auc, cmax, tmic, sep="<br/>")) }) #Output Cavity tables---------- output$table2 <- renderTable({ res = res1() outA <- filter(res, LESTYPE == 'Lung') mic = input$mic2 aucMed <- LogAUC(outA$time, outA$med) aucMedb <- aucMed[1] aucLo <- LogAUC(outA$time, outA$lo) aucLob <- aucLo[1] outB <- outA %>% group_by(LESTYPE) %>% mutate(tabove = ifelse(med < mic, 1, 0)) %>% summarise(Cmax = max(med), totalhours = (sum(tabove)-1))%>% mutate("Time below MIC" = ifelse(totalhours == -1, 0, totalhours), Patient = "Typical exposure", AUC = aucMedb) %>% select(Patient, AUC, Cmax, "Time below MIC") outC <- outA %>% group_by(LESTYPE) %>% mutate(tabove = ifelse(lo < mic, 1, 0)) %>% summarise(Cmax = max(lo), totalhours = (sum(tabove)-1))%>% mutate("Time below MIC" = ifelse(totalhours == -1, 0, totalhours), Patient = "Low exposure", AUC = aucLob) %>% select(Patient, AUC, Cmax, "Time below MIC") outD <- bind_rows(outC, outB) outD }) output$table3 <- renderTable({ res = res1() outA <- filter(res, LESTYPE == 'Caseum from cavity') mic = input$mic2 aucMed <- LogAUC(outA$time, outA$med) aucMedb <- aucMed[1] aucLo <- LogAUC(outA$time, outA$lo) aucLob <- aucLo[1] outB <- outA %>% group_by(LESTYPE) %>% mutate(tabove = ifelse(med < mic, 1, 0)) %>% summarise(Cmax = max(med), totalhours = (sum(tabove)-1)) %>% mutate("Time below MIC" = ifelse(totalhours == -1, 0, totalhours), Patient = "Typical exp", AUC = aucMedb) %>% select(Patient, AUC, Cmax, "Time below MIC") outC <- outA %>% group_by(LESTYPE) %>% mutate(tabove = ifelse(lo < mic, 1, 0)) %>% summarise(Cmax = max(lo), totalhours = (sum(tabove)-1))%>% mutate("Time below MIC" = ifelse(totalhours == -1, 0, totalhours), Patient = "Low exp", AUC = aucLob) %>% select(Patient, AUC, Cmax, "Time below MIC") outD <- bind_rows(outC, outB) outD }) }