From abf02ef4ec184c8f97b4593104c521d85677e209 Mon Sep 17 00:00:00 2001 From: Franz Innerbichler Date: Fri, 5 Jun 2026 11:32:15 +0200 Subject: [PATCH] Dilution simulator updated --- MultiL2.xlsx | Bin 0 -> 74088 bytes R/Global.R | 19 +++++---- dev/app.R | 118 +++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 97 insertions(+), 40 deletions(-) create mode 100644 MultiL2.xlsx diff --git a/MultiL2.xlsx b/MultiL2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e923b8bfc2db474eb4bca35f41fe85d33b7a1b9e GIT binary patch literal 74088 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 K2191hOfUeA;=vXG literal 0 HcmV?d00001 diff --git a/R/Global.R b/R/Global.R index 9315e27..dc1dd76 100644 --- a/R/Global.R +++ b/R/Global.R @@ -177,7 +177,7 @@ Fitting_FUNC <- function(ro_new, TransFlag = FALSE) { #' @export #' @examples #' suppressMessages(source("../../dev/setup.R")) -#' data.frame( +#' dat <- data.frame( #' R_dil1 = c( #' 10.0651024695491, 10.9844983291817, 10.7635586089293, 10.4597656321327, 10.3898668457823, 10.8171761349909, #' 10.319758021908, 10.1304854046653 @@ -265,11 +265,11 @@ plotSingularity <- function(dat) { # sigmoid,det_sig, #' TEST1 = c(1405, 1523, 1502, 1474, 2383, 3221, 3589, 3445), TEST2 = c(1420, 1516, 1544, 1512, 2226, 3219, 3327, 3591), #' TEST3 = c(1399, 1376, 1588, 1475, 2148, 3083, 2942, 3466), log_dose = c(5.01, 3.401, 2.708, 2.015, 1.32176, 0.62861, -0.0645385, -1.6739764) #' ) -#' sigmoid <- c(0.7163324, 0.5636804, 10.6156340, 9.9784160, -0.7504673, -0.7108692, -3.5788141, -0.6662962) -#' det_sig <- FALSE -#' TransF <- FALSE +#' +#' +#' TransFlag <- FALSE #' Dat <- list() -#' p <- plot_f(dat, sigmoid, det_sig, TransF) +#' p <- plot_f(dat, TransFlag) #' print(p) plot_f <- function(dat, TransFlag = FALSE) { # sigmoid,det_sig, CORdat <- cor(dat[, 1], dat[, ncol(dat)]) @@ -490,7 +490,7 @@ plot_f <- function(dat, TransFlag = FALSE) { # sigmoid,det_sig, #' @param heteroNoise Boolean if heteroscedstic noise should be added. #' @param noDilSeries A number >1 indicating how many dilution series per product should be simulated. #' @param noDils A number >7 indicating how many dilutions steps per product should be simulated. -#' @returns A data-frame with readouts and natural log of concentrations. +#' @returns A data-frame with readouts and natural log of concentrations. avs: means per concentration; sds: standard deviation per concentration;cvs: coefficients of variation #' @export #' @examples #' suppressMessages(source("../../dev/setup.R")) @@ -656,7 +656,8 @@ LinPotTab <- function(circles, Lim, PureErrFlag) { #' PureErrF <- TRUE #' #' -#' ANOVAlintests(ro_new, circles, Lim, PureErrF) +#' ANOVAlintests(dat, circles, Lim, PureErrF) +#' ANOVAlintests <- function(ro_new, circles, Lim, PureErrFlag) { all_l <- melt(data.frame(ro_new), id.vars = "log_dose", variable.name = "replname", value.name = "readout") isRef <- rep(c(1, 0), 1, each = nrow(all_l) / 2) @@ -873,6 +874,7 @@ ANOVAlintests <- function(ro_new, circles, Lim, PureErrFlag) { #' ) #' #' PlotLinPLA_FUNC(circle, sigmoid, all_l2, pl_df, indS, indT) +#' PlotLinPLA_FUNC <- function(circle, sigmoid, all_l2, pl_df, indS, indT) { # browser() mLin <- gsl_nls(readout ~ (intS + r) * isSample + intS * isRef + k * log_dose, @@ -1100,7 +1102,7 @@ pot4plFUNC <- function(ro_new, PureErrFlag) { #' se_xt <- 0.34 #' se_xs <- 0.23 #' DFs <- 32 - 16 -#' +#' CoVar <- 0 #' #' ParamCI_F(xt, xs, se_xt, se_xs, CoVar, DFs, Conf = 0.975) ParamCI_F <- function(xt, xs, se_xt, se_xs, CoVar, DFs, Conf = 0.975) { @@ -1371,6 +1373,7 @@ tests_FUNC <- function(ro_new, Lim, PureErrFlag) { #' #' #' ANOVA4plUnresfunc(ro_new) +#' ANOVA4plUnresfunc <- function(ro_new) { all_l <- melt(data.frame(ro_new), id.vars = "log_dose", variable.name = "replname", value.name = "readout") all_len <- nrow(all_l) diff --git a/dev/app.R b/dev/app.R index 5b6dc11..4b97b26 100644 --- a/dev/app.R +++ b/dev/app.R @@ -579,36 +579,32 @@ server <- function(input, output, session) { sidebarPanel( width = 3, fluidRow( - column( - 6, + box( title = "Upload multiple worksheets", status = "warning", solidHeader = TRUE, width = 12, "Please upload your EXCEL file here", fileInput("MiFile", "", accept = ".xlsx") - ) - ) ) ), mainPanel( tabsetPanel( id = "tabs", - tabPanel( - "4pl", + tabPanel("4pl", box( title = "ANOVA table", status = "primary", solidHeader = TRUE, width = 12, tableOutput("Anovatab") ), - column(8, + column(12, # h3("Confidence intervals"), # tableOutput("CIs"), - # "The confidence interval table is interaactive for changes in: variability slider (%SD), potency of test-slider, + # "The confidence interval table is interactive for changes in: variability slider (%SD), potency of test-slider, # and 'Adjust the dilutions'-slider", # tableOutput("optimalDils"), plotOutput("sigPlotREF"), - selectInput(inputId = "scenario", label = "Select an 'optimal' scenario:", choices = c("scenario 2", "scenario 3", "scenario 6", "steep slope")) - ), - column(5, + plotOutput("sigPlotTEST"), + #selectInput(inputId = "scenario", label = "Select an 'optimal' scenario:", choices = c("scenario 2", "scenario 3", "scenario 6", "steep slope")) + plotOutput("plotfordilutions"), # h4("in grey: most extreme bend point lines of theoretical samples with 50% and 200% potency"), # sliderInput("dilslider", "Adjust the dilutions(+-change in %)", min = -100, max = 100, value = 0, step = 1, round = 0), @@ -627,6 +623,14 @@ server <- function(input, output, session) { h4("Explanation of the plots") ) ), + tabPanel("Histograms", + h4("Histograms of parameters"), + plotOutput("histCIs"), + plotOutput("histEC50REF"), + plotOutput("histLasREF"), + plotOutput("histUasREF"), + + ), tabPanel( "Report", h4("Settings for report") @@ -766,7 +770,7 @@ server <- function(input, output, session) { REP$all_l <- all_l #### XLSX eval ---- - if (CORro < 0) SLOPE <- -1 else SLOPE <- 1 + #if (CORro < 0) SLOPE <- -1 else SLOPE <- 1 FITs <- Fitting_FUNC(XLdat2, TransFlag = FALSE) #### if no 4pl fit is possible ---- @@ -2117,7 +2121,7 @@ server <- function(input, output, session) { AllXL <- Dat$Mws AllSheets <- Dat$Msheets - URMcoefsL <- list() + URMcoefsL <- RMcoefsL <- potEstL <- list() for (N_WS in 1:length(AllXL)) { @@ -2144,6 +2148,7 @@ server <- function(input, output, session) { FITs <- Fitting_FUNC(datWS2, TransFlag = F) pot_est <- FITs[[3]] + potEstL[[N_WS]] <- pot_est potU_est <- FITs[[4]] # unrestricted SU_mu <- FITs[[2]] @@ -2152,6 +2157,14 @@ server <- function(input, output, session) { URMcoefs_ <- cbind(AllSheets[[N_WS]], URMcoefs) URMcoefsL[[N_WS]] <- URMcoefs_ + SU_mr <- FITs[[1]] + RMcoefs1 <- SU_mr$coefficients + RMcoefs <- t(matrix(unlist(RMcoefs1[,1]))) + RMcoefs_ <- cbind(AllSheets[[N_WS]], RMcoefs) + RMcoefsL[[N_WS]] <- RMcoefs_ + + + X <- seq(min(datWS2$log_dose), max(datWS2$log_dose), 0.1) sigRef <- URMcoefs[1,1] + (URMcoefs[1,3]-URMcoefs[1,1])/(1+exp(URMcoefs[1,2]*(URMcoefs[1,4]-X))) sigTest1 <- URMcoefs[1,5] + (URMcoefs[1,7]-URMcoefs[1,5])/(1+exp(URMcoefs[1,6]*(URMcoefs[1,4] - URMcoefs[1,8]-X))) @@ -2174,10 +2187,16 @@ server <- function(input, output, session) { # UasREF <- UasREF[!UasREF %in% boxplot.stats(UasREF)$out] LasREF <- as.numeric(URMcoefsDF[,2]) # LasREF <- LasREF[!LasREF %in% boxplot.stats(LasREF)$out] - # - # Dat$URMcoefsDF <- URMcoefsDF - # Dat$RestrM <- RestrM - # Dat$CalcPot <- CalcPot + UasTEST <- as.numeric(URMcoefsDF[,4]) + LasTEST <- as.numeric(URMcoefsDF[,2]) + + RMcoefsDF <- t(matrix(unlist(RMcoefsL),nrow=6)) + + Dat$URMcoefsDF <- URMcoefsDF + Dat$RestrM <- RMcoefsDF + + CalcPotDF <- t(matrix(unlist(potEstL),nrow=3)) + Dat$CalcPot <- CalcPotDF # #### sigmoid plots ---- @@ -2199,23 +2218,58 @@ server <- function(input, output, session) { output$sigPlotREF <- renderPlot({ p1 }) - # PLOTS$sigPlotREF <- p1 + Dat$sigPlotREF <- p1 # - # p2 <- ggplot(SIGtestDF, aes(x_X, y=sigTest, col=as.factor(Prod))) + - # geom_line() + - # #annotate("text", label="x", x=x_UA, y=UasREF, alpha=0.2) + - # #annotate("text", label="o", x=x_LA, y=LasREF, alpha=0.2) + - # geom_vline(xintercept = EC50TEST, alpha = 0.2) + - # xlab("dilutions") + - # ggtitle("Plot of all calculated reference fits (unrestricted model, in gray vertical lines: EC50)") + - # theme_bw() + - # theme(axis.text = element_text(face = "bold", size = 15), - # plot.title = element_text(size = 15, face = "bold")) - # - # output$sigPlotREF <- renderPlot({ p2 }) - # - # PLOTS$sigPlotTEST <- p2 + p2 <- ggplot(SIGtestDF, aes(x=X, y=sigTest, col=as.factor(Sheet))) + + geom_line() + + annotate("text", label="x", x=x_UA, y=UasTEST, alpha=0.2) + + annotate("text", label="o", x=x_LA, y=LasTEST, alpha=0.2) + + geom_vline(xintercept = EC50TEST, alpha = 0.2) + + xlab("dilutions") + + ggtitle("Calculated test sample fits (unrestricted model, in gray vertical lines: EC50)") + + theme_bw() + + theme(axis.text = element_text(face = "bold", size = 15), + plot.title = element_text(size = 15, face = "bold")) + + output$sigPlotTEST <- renderPlot({ p2 }) + + Dat$sigPlotTEST <- p2 + #### histograms right panel ---- + + #browser() + + all_lPot <- data.frame(Cat_potency= c(rep("rel poteny",nrow(CalcPotDF)), rep("lower CI",nrow(CalcPotDF)),rep("upper CI",nrow(CalcPotDF))), + Potency_and_CI = c(CalcPotDF[,1], CalcPotDF[,2],CalcPotDF[,3])) + all_lPot[,2][all_lPot[,2] > 5] <- NA + all_lPot[,2][all_lPot[,2] < 0.1] <- NA + + P_histCI <- ggplot(all_lPot, aes(x=Potency_and_CI, fill=Cat_potency)) + + geom_histogram(color="#e9ecef", alpha=0.6, position = "identity") + + scale_fill_manual(values=c("darkgreen","darkblue","salmon2","tomato3")) + + ggtitle("Histogram of relative potencies, standard RMSEs") + + scale_x_continuous( + breaks=seq(trunc(min(all_lPot$Potency_and_CI, na.rm=T)*10)/10, max(all_lPot$Potency_and_CI, na.rm=T)*1.1, by=0.4), + ) + + theme_bw() + + theme(axis.text = element_text(face="bold", size=15), + axis.text.x = element_text(angle=90), + plot.title= element_text(size=15, face="bold")) + + output$histCIs <- renderPlot({ P_histCI }) + + output$histEC50REF <- renderPlot({ + hist(EC50REF, col="steelblue", border="white", main = 'Histogram of EC50REF') + }) + output$histLasREF <- renderPlot({ + hist(LasREF, col="violet", border="white",main = 'Histogram of lower asymptotes REF') + }) + output$histUasREF <- renderPlot({ + hist(UasREF, col="darkturquoise", border="white",main = 'Histogram of upper asymptotes REF') + }) + Dat$histEC50REF <- hist(EC50REF, col="steelblue", border="white", main = 'Histogram of EC50REF') + Dat$histLasREF <- hist(LasREF, col="violet", border="white", main = 'Histogram of EC50REF') + Dat$histUasREF <- hist(UasREF, col="darkturquoise", border="white", main = 'Histogram of EC50REF') # dils <- tab$log_dose # min_y <- min(tab[, 1:3])