Last updated: 2023-10-27

Checks: 6 1

Knit directory: 20211209_JingxinRNAseq/analysis/

This reproducible R Markdown analysis was created with workflowr (version 1.7.0). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


The R Markdown file has unstaged changes. To know which version of the R Markdown file created these results, you’ll want to first commit it to the Git repo. If you’re still working on the analysis, you can ignore this warning. When you’re finished, you can run wflow_publish to commit the R Markdown file and build the HTML.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(19900924) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version d7b8ae0. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .DS_Store
    Ignored:    .Rhistory
    Ignored:    .Rproj.user/
    Ignored:    analysis/.RData
    Ignored:    analysis/.Rhistory
    Ignored:    analysis/20220707_TitrationSeries_DE_testing.nb.html
    Ignored:    code/.DS_Store
    Ignored:    code/._DOCK7.pdf
    Ignored:    code/._DOCK7_DMSO1.pdf
    Ignored:    code/._DOCK7_SM2_1.pdf
    Ignored:    code/._FKTN_DMSO_1.pdf
    Ignored:    code/._FKTN_SM2_1.pdf
    Ignored:    code/._MAPT.pdf
    Ignored:    code/._PKD1_DMSO_1.pdf
    Ignored:    code/._PKD1_SM2_1.pdf
    Ignored:    code/.snakemake/
    Ignored:    code/1KG_HighCoverageCalls.samplelist.txt
    Ignored:    code/5ssSeqs.tab
    Ignored:    code/Alignments/
    Ignored:    code/Branaplam_Risdiplam_specific_introns.bed.gz
    Ignored:    code/Branaplam_Risdiplam_specific_introns.bed.gz.tbi
    Ignored:    code/ChemCLIP/
    Ignored:    code/ClinVar/
    Ignored:    code/DE_testing/
    Ignored:    code/DE_tests.mat.counts.gz
    Ignored:    code/DE_tests.txt.gz
    Ignored:    code/DataNotToCommit/
    Ignored:    code/DonorMotifSearches/
    Ignored:    code/DoseResponseData/
    Ignored:    code/Fastq/
    Ignored:    code/FastqFastp/
    Ignored:    code/FivePrimeSpliceSites.txt
    Ignored:    code/FragLenths/
    Ignored:    code/Ishigami/
    Ignored:    code/Meme/
    Ignored:    code/Multiqc/
    Ignored:    code/OMIM/
    Ignored:    code/OldBigWigs/
    Ignored:    code/PhyloP/
    Ignored:    code/QC/
    Ignored:    code/ReferenceGenomes/
    Ignored:    code/Rplots.pdf
    Ignored:    code/Session.vim
    Ignored:    code/Session2.vim
    Ignored:    code/SplicingAnalysis/
    Ignored:    code/TracksSession
    Ignored:    code/bigwigs/
    Ignored:    code/featureCounts/
    Ignored:    code/figs/
    Ignored:    code/fimo_out/
    Ignored:    code/geena/
    Ignored:    code/hg38ToMm39.over.chain.gz
    Ignored:    code/igv_session.template.xml
    Ignored:    code/igv_session.xml
    Ignored:    code/log
    Ignored:    code/logs/
    Ignored:    code/rstudio-server.job
    Ignored:    code/rules/.RNASeqProcessing.smk.swp
    Ignored:    code/scratch/
    Ignored:    code/test.txt.gz
    Ignored:    code/testPlottingWithMyScript.ForJingxin.sh
    Ignored:    code/testPlottingWithMyScript.ForJingxin2.sh
    Ignored:    code/testPlottingWithMyScript.ForJingxin3.sh
    Ignored:    code/testPlottingWithMyScript.ForJingxin4.sh
    Ignored:    code/testPlottingWithMyScript.sh
    Ignored:    code/tracks.with_chRNA.RisdiBrana.xml
    Ignored:    code/tracks.with_chRNA.RisdiBranaWithExtras.xml
    Ignored:    code/tracks.xml
    Ignored:    data/~$52CompoundsTempPlateLayoutForPipettingConvenience.xlsx

Unstaged changes:
    Modified:   analysis/2023-10-26_ExploreDrmModels.Rmd
    Modified:   code/scripts/GenometracksByGenotype

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the repository in which changes were made to the R Markdown (analysis/2023-10-26_ExploreDrmModels.Rmd) and HTML (docs/2023-10-26_ExploreDrmModels.html) files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view the files as they were in that past version.

File Version Author Date Message
Rmd d7b8ae0 Benjmain Fair 2023-10-26 update model fitting nb
html d7b8ae0 Benjmain Fair 2023-10-26 update model fitting nb
Rmd b3b009e Benjmain Fair 2023-10-26 lots of updates
html b3b009e Benjmain Fair 2023-10-26 lots of updates

Load libs

library(tidyverse)
library(RColorBrewer)
library(data.table)
library(drc)
library(ggrepel)

theme_set(
  theme_classic() +
  theme(text=element_text(size=16,  family="Helvetica")))

Intro

There are many ways to fit models with drc::drm… See this tutorial

I have noticed some funny things, in that depending on exactly how you call the drm function, the lower and upper limits estimates are sometimes switched (with corresponding sign change in slope parameter), and sometimes you get wildly different estimates… I kind of know what I am looking for inuitively, and I think I have an idea of how exactly I want to call drm to fit dose response curves to gene expression. I’m going to demonstrate some of these nuances here… But first for some terminology…. the 4 parameter log logistic model has for parameters: b, c, d, and e…

When I fit dose response curves to gene expression, I figured the following details would make the model most useful and easily interpretable:

Response is in units of log2FC relative to DMSO… So I will use the \(log2CPM_d - mean(log2CPM_{DMSO})\) as the response metric (where \(log2CPM_d\) denotes the log2 CountsPerMillion for a gene at dose \(d\)). Thus, one of the limit parameters should be fixed at 0. For best modelling, it makes sense to limit parameters when reasonable, so I will also fit each treatment simultaneously such that I can limit the other limit parameter to be the same amongst all 3 treatments. The ED50 and slope parameter can freely vary between treatments, as I want to capture examples like HTT manual/eyeball interpretation of the dose response data looks like the slope is similar between all three treatments, but the ED50 is shifted. And in the HSD17B4 example, the slope looks clearly different between treatments, and the underlying reason makes sense (in that at the splicing level, there are either 2 or 1 poison exons depending on the treatment, and the gene expression response is logically sort of like the complement of the product of the poison exon dose response curves). Also, for simplicity/interpretability, rather than use the actual nanomolar dose for each treatment, I will rescale the doses of branaplam and C2C5 to be in units that are roughly functionally equivalent to the nanomolar dose for risdiplam. For example, since C2C5 is about 10x more potent than risdiplam, I will use 10*nanomolarDose for C2C5. Also I know that the steepness parameter should be constrained… sometimes the fit converges to something really ridiculous with a unrealistically steep dose. Since b is scaled by the limits, it as actually reasonable imo to just set the same limits across all genes… something like \(abs(c)<5\)

Analysis

Below, I will use some example data and show what happens when I try to fit these models different ways. In theory, a lot of these models should converge to the same thing, but for whatever reason they don’t.

f_in <-"../code/DoseResponseData/LCL/TidyExpressionDoseData_logFCTransformedAndAllDMSORepsInEachSeries.txt.gz"

sample_n_of <- function(data, size, ...) {
  dots <- quos(...)

  group_ids <- data %>%
    group_by(!!! dots) %>%
    group_indices()

  sampled_groups <- sample(unique(group_ids), size)

  data %>%
    filter(group_ids %in% sampled_groups)
}

expression.dat <- fread(f_in) %>%
  group_by(treatment) %>%
  mutate(doseRank = dense_rank(dose.nM)) %>%
  ungroup() %>%
  as_tibble() %>%
  mutate(doseInRisdiscale = case_when(
    treatment == "C2C5" ~ dose.nM * 10,
    treatment == "Branaplam" ~ dose.nM * sqrt(10),
    TRUE ~ dose.nM
  ))

expression.dat %>%
  distinct(doseInRisdiscale, treatment)
# A tibble: 27 × 2
   treatment doseInRisdiscale
   <chr>                <dbl>
 1 Branaplam          9993.  
 2 Branaplam          3162.  
 3 Branaplam           999.  
 4 Branaplam           316.  
 5 Branaplam            99.9 
 6 Branaplam            31.6 
 7 Branaplam             9.99
 8 Branaplam             3.16
 9 C2C5              10000   
10 C2C5               3160   
# … with 17 more rows

Plot dose response data for some genes of intrest

GenesToHighlight <- c("STAT1", "HTT", "MYB",  "TRIM11", "TRAFD1", "VEGFA", "FBXW11", "HSD17B4")

expression.dat %>%
  mutate(treatment = factor(treatment)) %>%
  filter(hgnc_symbol %in% GenesToHighlight) %>%
  ggplot(aes(x=doseInRisdiscale, y=log2FC, color=treatment)) +
  geom_point() +
  geom_line() +
  scale_x_continuous(trans="log1p", breaks=c(10000, 1000,  100,  10,  0), labels=c("10K", "1K", "100", "10", "0")) +
  facet_wrap(~hgnc_symbol, scale="free_y")

Version Author Date
d7b8ae0 Benjmain Fair 2023-10-26
b3b009e Benjmain Fair 2023-10-26

Now plot some random genes…

set.seed(0)
expression.dat %>%
  filter(!is.na(spearman) & !is.na(log2FC)) %>%
  add_count(Geneid) %>%
  filter(n==33) %>%
  sample_n_of(40, hgnc_symbol) %>%
  ggplot(aes(x=doseRank, y=log2FC, color=treatment)) +
  geom_point() +
  geom_line() +
  facet_wrap(~hgnc_symbol, scale="free_y")

Version Author Date
b3b009e Benjmain Fair 2023-10-26

Let’s handpick a couple of those, to add to the gene list of interest to more carefully try fitting models…

GenesToHighlight <- c(GenesToHighlight, c("BTG2", "B9D1", "ZIK1", "POLN", "TOMM20P4", "CRYBB1", "EIF2AK4"))

Now fit models for each of these in three ways, which should all in effect be identical:

Without contraining slope

SlopeAbsValueLimit <- 4.5

for (gene in GenesToHighlight){
  cat("\n## ", gene, "\n")
  data <- expression.dat %>%
    mutate(treatment = factor(treatment)) %>%
    filter(hgnc_symbol == gene)
  
  P <- ggplot(data, aes(x=doseInRisdiscale, y=log2FC, color=treatment)) +
  geom_point() +
  geom_line() +
  scale_x_continuous(trans="log1p", breaks=c(10000, 1000,  100,  10,  0), labels=c("10K", "1K", "100", "10", "0"))
  print(P)
  cat("\n")
  
  cat("\n### LL.4, fix upper limit\n\n")
  tryCatch(expr={
    fit <- drm(formula = log2FC ~ doseInRisdiscale,
                 data = data,
                 fct = LL.4(names=c("Steepness", "LowerLimit", "UpperLimit", "ED50"), fixed=c(NA,NA,0,NA)),
                 curveid = treatment,
                 pmodels=data.frame(treatment, 1, treatment, treatment),
                 # lowerl = c(-5, -Inf,  -Inf),
                 # upperl = c(5, Inf,  Inf),
                 robust = "mean")
    message("\n\nSuccessfully fitted model:\n\n")
    plot(fit)
    as.data.frame(fit$coefficients) %>% knitr::kable() %>% print()
  },
  error=function(e){
      cat("ERROR:", gene, " model LL.4 fixed upper limit\n", conditionMessage(e), "\n")
    }
  )

  cat("\n### LL.4, fix lower limit\n")
  tryCatch(expr={
    fit <- drm(formula = log2FC ~ doseInRisdiscale,
                 data = data,
                 fct = LL.4(names=c("Steepness", "LowerLimit", "UpperLimit", "ED50"), fixed=c(NA,0,NA,NA)),
                 curveid = treatment,
                 pmodels=data.frame(treatment, 1, treatment, treatment),# Dunno why this is parameterized as is... but this seems to work
                 # lowerl = c(-5, -Inf,  -Inf),
                 # upperl = c(5, Inf,  Inf),
                 robust = "mean")
    message("\n\nSuccessfully fitted model:\n\n")
    plot(fit)
    as.data.frame(fit$coefficients) %>% knitr::kable() %>% print()
  },
  error=function(e){
      cat("ERROR:", gene, " model LL.4 fixed lower limit\n", conditionMessage(e), "\n")
    }
  )

  cat("\n### LL.3\n")
  tryCatch(expr={
    fit <- drm(formula = log2FC ~ doseInRisdiscale,
                 data = data,
                 fct = LL.3(names=c("Steepness", "UpperLimit", "ED50"), fixed=c(NA,NA,NA)),
                 curveid = treatment,
                 pmodels=data.frame(treatment, 1, treatment),
                 # lowerl = c(-5, -Inf,  -Inf),
                 # upperl = c(5, Inf,  Inf),
                 robust = "mean")
    message("\n\nSuccessfully fitted model:\n\n")
    plot(fit)
    as.data.frame(fit$coefficients) %>% knitr::kable() %>% print()
  },
  error=function(e){
      cat("ERROR:", gene, " model LL.3\n", conditionMessage(e), "\n")
    }
  )
  
    cat("\n### LL.4, fix upper limit, limit, limit slope\n\n")
  tryCatch(expr={
    fit <- drm(formula = log2FC ~ doseInRisdiscale,
                 data = data,
                 fct = LL.4(names=c("Steepness", "LowerLimit", "UpperLimit", "ED50"), fixed=c(NA,NA,0,NA)),
                 curveid = treatment,
                 pmodels=data.frame(treatment, 1, treatment, treatment),
                 lowerl = c(-SlopeAbsValueLimit, -Inf,  -Inf),
                 upperl = c(SlopeAbsValueLimit, Inf,  Inf),
                 robust = "mean")
    message("\n\nSuccessfully fitted model:\n\n")
    plot(fit)
    as.data.frame(fit$coefficients) %>% knitr::kable() %>% print()
  },
  error=function(e){
      cat("ERROR:", gene, " model LL.4 fixed upper limit, limit slope\n", conditionMessage(e), "\n")
    }
  )

  cat("\n### LL.4, fix lower limit, limit slope\n")
  tryCatch(expr={
    fit <- drm(formula = log2FC ~ doseInRisdiscale,
                 data = data,
                 fct = LL.4(names=c("Steepness", "LowerLimit", "UpperLimit", "ED50"), fixed=c(NA,0,NA,NA)),
                 curveid = treatment,
                 pmodels=data.frame(treatment, 1, treatment, treatment),# Dunno why this is parameterized as is... but this seems to work
                 lowerl = c(-SlopeAbsValueLimit, -Inf,  -Inf),
                 upperl = c(SlopeAbsValueLimit, Inf,  Inf),
                 robust = "mean")
    message("\n\nSuccessfully fitted model:\n\n")
    plot(fit)
    as.data.frame(fit$coefficients) %>% knitr::kable() %>% print()
  },
  error=function(e){
      cat("ERROR:", gene, " model LL.4 fixed lower limit, limit slope\n", conditionMessage(e), "\n")
    }
  )

  cat("\n### LL.3, limit slope\n")
  tryCatch(expr={
    fit <- drm(formula = log2FC ~ doseInRisdiscale,
                 data = data,
                 fct = LL.3(names=c("Steepness", "UpperLimit", "ED50"), fixed=c(NA,NA,NA)),
                 curveid = treatment,
                 pmodels=data.frame(treatment, 1, treatment),
                 lowerl = c(-SlopeAbsValueLimit, -Inf,  -Inf),
                 upperl = c(SlopeAbsValueLimit, Inf,  Inf),
                 robust = "mean")
    message("\n\nSuccessfully fitted model:\n\n")
    plot(fit)
    as.data.frame(fit$coefficients) %>% knitr::kable() %>% print()
  },
  error=function(e){
      cat("ERROR:", gene, " model LL.3, limit slope\n", conditionMessage(e), "\n")
    }
  )
}

STAT1

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 1.264285
Steepness:C2C5 1.461975
Steepness:Risdiplam 1.449977
LowerLimit:(Intercept) -4.886981
ED50:Branaplam 1045.324933
ED50:C2C5 711.321624
ED50:Risdiplam 713.387708

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -9.111220
Steepness:C2C5 -12.632985
Steepness:Risdiplam -27.353565
UpperLimit:(Intercept) -4.183405
ED50:Branaplam 380.947662
ED50:C2C5 927.444193
ED50:Risdiplam 6105.389931

LL.3

fit$coefficients
Steepness:Branaplam -9.111220
Steepness:C2C5 -12.632985
Steepness:Risdiplam -27.353565
UpperLimit:(Intercept) -4.183405
ED50:Branaplam 380.947662
ED50:C2C5 927.444193
ED50:Risdiplam 6105.389931

LL.4, fix upper limit, limit, limit slope

fit$coefficients
Steepness:Branaplam 1.263214
Steepness:C2C5 1.461507
Steepness:Risdiplam 1.449420
LowerLimit:(Intercept) -4.887708
ED50:Branaplam 1045.485553
ED50:C2C5 711.520498
ED50:Risdiplam 713.581694

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: STAT1 model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: STAT1 model LL.3, limit slope Convergence failed

HTT

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 1.4840198
Steepness:C2C5 0.5926407
Steepness:Risdiplam 0.5361201
LowerLimit:(Intercept) -2.9367086
ED50:Branaplam 19.6878942
ED50:C2C5 5211.9265130
ED50:Risdiplam 1446.2570785

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -1.4860151
Steepness:C2C5 -0.5945162
Steepness:Risdiplam -0.5373429
UpperLimit:(Intercept) -2.9343586
ED50:Branaplam 19.6665751
ED50:C2C5 5161.9113909
ED50:Risdiplam 1431.3328869

LL.3

fit$coefficients
Steepness:Branaplam -1.4860151
Steepness:C2C5 -0.5945162
Steepness:Risdiplam -0.5373429
UpperLimit:(Intercept) -2.9343586
ED50:Branaplam 19.6665751
ED50:C2C5 5161.9113909
ED50:Risdiplam 1431.3328869

LL.4, fix upper limit, limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: HTT model LL.4 fixed upper limit, limit slope Convergence failed

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: HTT model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: HTT model LL.3, limit slope Convergence failed

MYB

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 0.6027270
Steepness:C2C5 0.8763099
Steepness:Risdiplam 0.8809865
LowerLimit:(Intercept) -4.8790223
ED50:Branaplam 854.8441848
ED50:C2C5 492.1582935
ED50:Risdiplam 468.0208048

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -0.6023965
Steepness:C2C5 -0.8757448
Steepness:Risdiplam -0.8804160
UpperLimit:(Intercept) -4.8810055
ED50:Branaplam 856.4518593
ED50:C2C5 492.8310725
ED50:Risdiplam 468.6542144

LL.3

fit$coefficients
Steepness:Branaplam -0.6023965
Steepness:C2C5 -0.8757448
Steepness:Risdiplam -0.8804160
UpperLimit:(Intercept) -4.8810055
ED50:Branaplam 856.4518593
ED50:C2C5 492.8310725
ED50:Risdiplam 468.6542144

LL.4, fix upper limit, limit, limit slope

fit$coefficients
Steepness:Branaplam 0.6025096
Steepness:C2C5 0.8760418
Steepness:Risdiplam 0.8807139
LowerLimit:(Intercept) -4.8799709
ED50:Branaplam 855.9124722
ED50:C2C5 492.4730941
ED50:Risdiplam 468.3115700

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: MYB model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: MYB model LL.3, limit slope Convergence failed

TRIM11

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 5.699012e-01
Steepness:C2C5 1.489062e+01
Steepness:Risdiplam 2.593925e-01
LowerLimit:(Intercept) 6.181259e-01
ED50:Branaplam 3.518368e+02
ED50:C2C5 3.433886e+03
ED50:Risdiplam 1.556755e+04

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -0.5709617
Steepness:C2C5 -16.9007997
Steepness:Risdiplam -0.2644370
UpperLimit:(Intercept) 0.6167399
ED50:Branaplam 348.5714837
ED50:C2C5 3399.3651173
ED50:Risdiplam 14185.4024763

LL.3

fit$coefficients
Steepness:Branaplam -0.5709617
Steepness:C2C5 -16.9007997
Steepness:Risdiplam -0.2644370
UpperLimit:(Intercept) 0.6167399
ED50:Branaplam 348.5714837
ED50:C2C5 3399.3651173
ED50:Risdiplam 14185.4024763

LL.4, fix upper limit, limit, limit slope

fit$coefficients
Steepness:Branaplam 2.837967e-01
Steepness:C2C5 1.074720e+00
Steepness:Risdiplam 3.045765e-01
LowerLimit:(Intercept) 4.052388e+00
ED50:Branaplam 3.343237e+06
ED50:C2C5 5.769947e+04
ED50:Risdiplam 2.224340e+07

LL.4, fix lower limit, limit slope

fit$coefficients
Steepness:Branaplam -3.016154e-01
Steepness:C2C5 -1.038852e+00
Steepness:Risdiplam -2.621744e-01
UpperLimit:(Intercept) 3.244244e+00
ED50:Branaplam 9.134680e+05
ED50:C2C5 4.835079e+04
ED50:Risdiplam 3.866041e+07

LL.3, limit slope

fit$coefficients
Steepness:Branaplam -3.016154e-01
Steepness:C2C5 -1.038852e+00
Steepness:Risdiplam -2.621744e-01
UpperLimit:(Intercept) 3.244244e+00
ED50:Branaplam 9.134680e+05
ED50:C2C5 4.835079e+04
ED50:Risdiplam 3.866041e+07

TRAFD1

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 1.5176400
Steepness:C2C5 4.7994133
Steepness:Risdiplam 1.1822400
LowerLimit:(Intercept) 0.6676374
ED50:Branaplam 256.4706113
ED50:C2C5 365.5973701
ED50:Risdiplam 321.2377935

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -1.5175123
Steepness:C2C5 -4.7182191
Steepness:Risdiplam -1.1820072
UpperLimit:(Intercept) 0.6677191
ED50:Branaplam 256.5204423
ED50:C2C5 366.5148370
ED50:Risdiplam 321.3031097

LL.3

fit$coefficients
Steepness:Branaplam -1.5175123
Steepness:C2C5 -4.7182191
Steepness:Risdiplam -1.1820072
UpperLimit:(Intercept) 0.6677191
ED50:Branaplam 256.5204423
ED50:C2C5 366.5148370
ED50:Risdiplam 321.3031097

LL.4, fix upper limit, limit, limit slope

fit$coefficients
Steepness:Branaplam 1.5171464
Steepness:C2C5 4.5000000
Steepness:Risdiplam 1.1811878
LowerLimit:(Intercept) 0.6679675
ED50:Branaplam 256.6890903
ED50:C2C5 369.1208612
ED50:Risdiplam 321.5586583

LL.4, fix lower limit, limit slope

fit$coefficients
Steepness:Branaplam -1.5173189
Steepness:C2C5 -4.5000000
Steepness:Risdiplam -1.1812123
UpperLimit:(Intercept) 0.6679687
ED50:Branaplam 256.7177161
ED50:C2C5 369.1176449
ED50:Risdiplam 321.5321220

LL.3, limit slope

fit$coefficients
Steepness:Branaplam -1.5173189
Steepness:C2C5 -4.5000000
Steepness:Risdiplam -1.1812123
UpperLimit:(Intercept) 0.6679687
ED50:Branaplam 256.7177161
ED50:C2C5 369.1176449
ED50:Risdiplam 321.5321220

VEGFA

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 0.3817651
Steepness:C2C5 0.8210605
Steepness:Risdiplam 0.3233641
LowerLimit:(Intercept) 1.5102915
ED50:Branaplam 7990.0840610
ED50:C2C5 2858.8541579
ED50:Risdiplam 3600.7093186

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -0.3775381
Steepness:C2C5 -0.8095375
Steepness:Risdiplam -0.3192875
UpperLimit:(Intercept) 1.5451555
ED50:Branaplam 8980.3946801
ED50:C2C5 3052.2403502
ED50:Risdiplam 4163.7440736

LL.3

fit$coefficients
Steepness:Branaplam -0.3775381
Steepness:C2C5 -0.8095375
Steepness:Risdiplam -0.3192875
UpperLimit:(Intercept) 1.5451555
ED50:Branaplam 8980.3946801
ED50:C2C5 3052.2403502
ED50:Risdiplam 4163.7440736

LL.4, fix upper limit, limit, limit slope

fit$coefficients
Steepness:Branaplam 3.427477e-01
Steepness:C2C5 7.256367e-01
Steepness:Risdiplam 2.880044e-01
LowerLimit:(Intercept) 1.849470e+00
ED50:Branaplam 2.475087e+04
ED50:C2C5 5.040642e+03
ED50:Risdiplam 1.394245e+04

LL.4, fix lower limit, limit slope

fit$coefficients
Steepness:Branaplam -0.3280324
Steepness:C2C5 -0.7220665
Steepness:Risdiplam -0.2972506
UpperLimit:(Intercept) 1.8914782
ED50:Branaplam 33092.1422310
ED50:C2C5 5414.5469858
ED50:Risdiplam 13644.6598822

LL.3, limit slope

fit$coefficients
Steepness:Branaplam -0.3280324
Steepness:C2C5 -0.7220665
Steepness:Risdiplam -0.2972506
UpperLimit:(Intercept) 1.8914782
ED50:Branaplam 33092.1422310
ED50:C2C5 5414.5469858
ED50:Risdiplam 13644.6598822

FBXW11

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 9.589470e-01
Steepness:C2C5 4.619376e-01
Steepness:Risdiplam 4.731712e-01
LowerLimit:(Intercept) 2.216327e+00
ED50:Branaplam 4.938152e+03
ED50:C2C5 4.683941e+04
ED50:Risdiplam 6.405889e+04

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -0.9505882
Steepness:C2C5 -0.4585692
Steepness:Risdiplam -0.4682422
UpperLimit:(Intercept) 2.2442768
ED50:Branaplam 5080.2401621
ED50:C2C5 49651.8383960
ED50:Risdiplam 68650.2078080

LL.3

fit$coefficients
Steepness:Branaplam -0.9505882
Steepness:C2C5 -0.4585692
Steepness:Risdiplam -0.4682422
UpperLimit:(Intercept) 2.2442768
ED50:Branaplam 5080.2401621
ED50:C2C5 49651.8383960
ED50:Risdiplam 68650.2078080

LL.4, fix upper limit, limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: FBXW11 model LL.4 fixed upper limit, limit slope Convergence failed

LL.4, fix lower limit, limit slope

fit$coefficients
Steepness:Branaplam -5.389430e-01
Steepness:C2C5 -4.922571e-01
Steepness:Risdiplam -4.901796e-01
UpperLimit:(Intercept) 1.647630e+01
ED50:Branaplam 7.498320e+05
ED50:C2C5 4.258961e+06
ED50:Risdiplam 6.102685e+06

LL.3, limit slope

fit$coefficients
Steepness:Branaplam -5.389430e-01
Steepness:C2C5 -4.922571e-01
Steepness:Risdiplam -4.901796e-01
UpperLimit:(Intercept) 1.647630e+01
ED50:Branaplam 7.498320e+05
ED50:C2C5 4.258961e+06
ED50:Risdiplam 6.102685e+06

HSD17B4

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 0.6017432
Steepness:C2C5 40.3188976
Steepness:Risdiplam 2.7530345
LowerLimit:(Intercept) -4.8102474
ED50:Branaplam 56068.4732084
ED50:C2C5 330.0059383
ED50:Risdiplam 868.7382861

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -0.6302388
Steepness:C2C5 -45.8851065
Steepness:Risdiplam -2.3117860
UpperLimit:(Intercept) -5.2027380
ED50:Branaplam 57759.6069678
ED50:C2C5 1941.5790008
ED50:Risdiplam 930.0396867

LL.3

fit$coefficients
Steepness:Branaplam -0.6302388
Steepness:C2C5 -45.8851065
Steepness:Risdiplam -2.3117860
UpperLimit:(Intercept) -5.2027380
ED50:Branaplam 57759.6069678
ED50:C2C5 1941.5790008
ED50:Risdiplam 930.0396867

LL.4, fix upper limit, limit, limit slope

fit$coefficients
Steepness:Branaplam 0.5386559
Steepness:C2C5 2.1705135
Steepness:Risdiplam 2.2226211
LowerLimit:(Intercept) -5.2796746
ED50:Branaplam 97656.6426634
ED50:C2C5 745.8234749
ED50:Risdiplam 945.3920800

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: HSD17B4 model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: HSD17B4 model LL.3, limit slope Convergence failed

BTG2

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 2.781937e+01
Steepness:C2C5 3.031514e+01
Steepness:Risdiplam 7.821329e-01
LowerLimit:(Intercept) 6.278559e-01
ED50:Branaplam 1.855647e+04
ED50:C2C5 3.147711e+02
ED50:Risdiplam 3.577894e+02

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam 1.6189095
Steepness:C2C5 -1.4027697
Steepness:Risdiplam -0.9807397
UpperLimit:(Intercept) 0.3779961
ED50:Branaplam 1.1724219
ED50:C2C5 71.6871387
ED50:Risdiplam 84.6048332

LL.3

fit$coefficients
Steepness:Branaplam 1.6189095
Steepness:C2C5 -1.4027697
Steepness:Risdiplam -0.9807397
UpperLimit:(Intercept) 0.3779961
ED50:Branaplam 1.1724219
ED50:C2C5 71.6871387
ED50:Risdiplam 84.6048332

LL.4, fix upper limit, limit, limit slope

fit$coefficients
Steepness:Branaplam 4.500000e+00
Steepness:C2C5 9.190472e-01
Steepness:Risdiplam 6.536991e-01
LowerLimit:(Intercept) 6.899893e-01
ED50:Branaplam 5.011184e+05
ED50:C2C5 2.690935e+02
ED50:Risdiplam 4.781258e+02

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: BTG2 model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: BTG2 model LL.3, limit slope Convergence failed

B9D1

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 1.109206
Steepness:C2C5 1.257662
Steepness:Risdiplam 1.125598
LowerLimit:(Intercept) -5.610512
ED50:Branaplam 2368.909547
ED50:C2C5 3752.873615
ED50:Risdiplam 7151.945739

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -42.715566
Steepness:C2C5 -31.227433
Steepness:Risdiplam -20.999697
UpperLimit:(Intercept) -3.475657
ED50:Branaplam 2098.315902
ED50:C2C5 3097.439697
ED50:Risdiplam 1078.921545

LL.3

fit$coefficients
Steepness:Branaplam -42.715566
Steepness:C2C5 -31.227433
Steepness:Risdiplam -20.999697
UpperLimit:(Intercept) -3.475657
ED50:Branaplam 2098.315902
ED50:C2C5 3097.439697
ED50:Risdiplam 1078.921545

LL.4, fix upper limit, limit, limit slope

fit$coefficients
Steepness:Branaplam 1.107872
Steepness:C2C5 1.256653
Steepness:Risdiplam 1.124931
LowerLimit:(Intercept) -5.615041
ED50:Branaplam 2373.594015
ED50:C2C5 3758.895665
ED50:Risdiplam 7164.142517

LL.4, fix lower limit, limit slope

fit$coefficients
Steepness:Branaplam -1.108054
Steepness:C2C5 -1.256799
Steepness:Risdiplam -1.125008
UpperLimit:(Intercept) -5.614425
ED50:Branaplam 2372.958091
ED50:C2C5 3758.135410
ED50:Risdiplam 7162.811329

LL.3, limit slope

fit$coefficients
Steepness:Branaplam -1.108054
Steepness:C2C5 -1.256799
Steepness:Risdiplam -1.125008
UpperLimit:(Intercept) -5.614425
ED50:Branaplam 2372.958091
ED50:C2C5 3758.135410
ED50:Risdiplam 7162.811329

ZIK1

LL.4, fix upper limit

Error in optim(startVec, opfct, hessian = TRUE, method = optMethod, control = list(maxit = maxIt, : non-finite finite-difference value [5] ERROR: ZIK1 model LL.4 fixed upper limit Convergence failed

LL.4, fix lower limit

Error in optim(startVec, opfct, hessian = TRUE, method = optMethod, control = list(maxit = maxIt, : non-finite finite-difference value [6] ERROR: ZIK1 model LL.4 fixed lower limit Convergence failed

LL.3

Error in optim(startVec, opfct, hessian = TRUE, method = optMethod, control = list(maxit = maxIt, : non-finite finite-difference value [6] ERROR: ZIK1 model LL.3 Convergence failed

LL.4, fix upper limit, limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: ZIK1 model LL.4 fixed upper limit, limit slope Convergence failed

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: ZIK1 model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: ZIK1 model LL.3, limit slope Convergence failed

POLN

LL.4, fix upper limit

Error in optim(startVec, opfct, hessian = TRUE, method = optMethod, control = list(maxit = maxIt, : non-finite finite-difference value [7] ERROR: POLN model LL.4 fixed upper limit Convergence failed

LL.4, fix lower limit

Error in optim(startVec, opfct, hessian = TRUE, method = optMethod, control = list(maxit = maxIt, : non-finite finite-difference value [7] ERROR: POLN model LL.4 fixed lower limit Convergence failed

LL.3

Error in optim(startVec, opfct, hessian = TRUE, method = optMethod, control = list(maxit = maxIt, : non-finite finite-difference value [7] ERROR: POLN model LL.3 Convergence failed

LL.4, fix upper limit, limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : non-finite finite-difference value [7] ERROR: POLN model LL.4 fixed upper limit, limit slope Convergence failed

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : non-finite finite-difference value [7] ERROR: POLN model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : non-finite finite-difference value [7] ERROR: POLN model LL.3, limit slope Convergence failed

TOMM20P4

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam -5.368666e+00
Steepness:C2C5 6.063349e+00
Steepness:Risdiplam 1.185715e+01
LowerLimit:(Intercept) 3.193633e-01
ED50:Branaplam 1.055932e+05
ED50:C2C5 5.714868e+00
ED50:Risdiplam 5.546426e+00

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -0.0012369
Steepness:C2C5 -0.0004988
Steepness:Risdiplam -1.0857694
UpperLimit:(Intercept) 0.4789872
ED50:Branaplam 1784.4511277
ED50:C2C5 11.7256792
ED50:Risdiplam 124.4130069

LL.3

fit$coefficients
Steepness:Branaplam -0.0012369
Steepness:C2C5 -0.0004988
Steepness:Risdiplam -1.0857694
UpperLimit:(Intercept) 0.4789872
ED50:Branaplam 1784.4511277
ED50:C2C5 11.7256792
ED50:Risdiplam 124.4130069

LL.4, fix upper limit, limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: TOMM20P4 model LL.4 fixed upper limit, limit slope Convergence failed

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: TOMM20P4 model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: TOMM20P4 model LL.3, limit slope Convergence failed

CRYBB1

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 0.4210764
Steepness:C2C5 0.3366277
Steepness:Risdiplam 3.2876998
LowerLimit:(Intercept) -1.5022760
ED50:Branaplam 373.9813357
ED50:C2C5 8166.6836026
ED50:Risdiplam 6234.2208669

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -0.4272708
Steepness:C2C5 -0.3383781
Steepness:Risdiplam -3.1572815
UpperLimit:(Intercept) -1.5573189
ED50:Branaplam 477.4159543
ED50:C2C5 10716.1781844
ED50:Risdiplam 6541.2260045

LL.3

fit$coefficients
Steepness:Branaplam -0.4272708
Steepness:C2C5 -0.3383781
Steepness:Risdiplam -3.1572815
UpperLimit:(Intercept) -1.5573189
ED50:Branaplam 477.4159543
ED50:C2C5 10716.1781844
ED50:Risdiplam 6541.2260045

LL.4, fix upper limit, limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: CRYBB1 model LL.4 fixed upper limit, limit slope Convergence failed

LL.4, fix lower limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: CRYBB1 model LL.4 fixed lower limit, limit slope Convergence failed

LL.3, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: CRYBB1 model LL.3, limit slope Convergence failed

EIF2AK4

LL.4, fix upper limit

fit$coefficients
Steepness:Branaplam 0.8712671
Steepness:C2C5 1.5284816
Steepness:Risdiplam 17.3731698
LowerLimit:(Intercept) 0.6337062
ED50:Branaplam 132.8989229
ED50:C2C5 1359.7224688
ED50:Risdiplam 3000.7519104

LL.4, fix lower limit

fit$coefficients
Steepness:Branaplam -0.9616537
Steepness:C2C5 -1.5510130
Steepness:Risdiplam -1.5857019
UpperLimit:(Intercept) 0.6229735
ED50:Branaplam 127.2343467
ED50:C2C5 1320.4270653
ED50:Risdiplam 1420.9492344

LL.3

fit$coefficients
Steepness:Branaplam -0.9616537
Steepness:C2C5 -1.5510130
Steepness:Risdiplam -1.5857019
UpperLimit:(Intercept) 0.6229735
ED50:Branaplam 127.2343467
ED50:C2C5 1320.4270653
ED50:Risdiplam 1420.9492344

LL.4, fix upper limit, limit, limit slope

Error in optim(startVec, opfct, hessian = TRUE, method = “L-BFGS-B”, lower = lowerLimits, : L-BFGS-B needs finite values of ‘fn’ ERROR: EIF2AK4 model LL.4 fixed upper limit, limit slope Convergence failed

LL.4, fix lower limit, limit slope

fit$coefficients
Steepness:Branaplam -0.9616253
Steepness:C2C5 -1.5509806
Steepness:Risdiplam -1.5857242
UpperLimit:(Intercept) 0.6229758
ED50:Branaplam 127.2360106
ED50:C2C5 1320.4395018
ED50:Risdiplam 1420.9578570

LL.3, limit slope

fit$coefficients
Steepness:Branaplam -0.9616253
Steepness:C2C5 -1.5509806
Steepness:Risdiplam -1.5857242
UpperLimit:(Intercept) 0.6229758
ED50:Branaplam 127.2360106
ED50:C2C5 1320.4395018
ED50:Risdiplam 1420.9578570

sessionInfo()
R version 4.2.0 (2022-04-22)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)

Matrix products: default
BLAS/LAPACK: /software/openblas-0.3.13-el7-x86_64/lib/libopenblas_haswellp-r0.3.13.so

locale:
 [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C         LC_TIME=C           
 [4] LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C       
 [7] LC_PAPER=C           LC_NAME=C            LC_ADDRESS=C        
[10] LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggrepel_0.9.1      drc_3.0-1          MASS_7.3-56        data.table_1.14.2 
 [5] RColorBrewer_1.1-3 forcats_0.5.1      stringr_1.4.0      dplyr_1.0.9       
 [9] purrr_0.3.4        readr_2.1.2        tidyr_1.2.0        tibble_3.1.7      
[13] ggplot2_3.3.6      tidyverse_1.3.1   

loaded via a namespace (and not attached):
 [1] fs_1.5.2          lubridate_1.8.0   httr_1.4.3        rprojroot_2.0.3  
 [5] tools_4.2.0       backports_1.4.1   bslib_0.3.1       utf8_1.2.2       
 [9] R6_2.5.1          DBI_1.1.2         colorspace_2.0-3  withr_2.5.0      
[13] tidyselect_1.1.2  compiler_4.2.0    git2r_0.30.1      cli_3.3.0        
[17] rvest_1.0.2       xml2_1.3.3        sandwich_3.0-1    labeling_0.4.2   
[21] sass_0.4.1        scales_1.2.0      mvtnorm_1.1-3     digest_0.6.29    
[25] rmarkdown_2.14    R.utils_2.11.0    pkgconfig_2.0.3   htmltools_0.5.2  
[29] plotrix_3.8-2     highr_0.9         dbplyr_2.1.1      fastmap_1.1.0    
[33] rlang_1.0.2       readxl_1.4.0      rstudioapi_0.13   farver_2.1.0     
[37] jquerylib_0.1.4   generics_0.1.2    zoo_1.8-10        jsonlite_1.8.0   
[41] gtools_3.9.2      R.oo_1.24.0       car_3.1-1         magrittr_2.0.3   
[45] Matrix_1.5-3      Rcpp_1.0.8.3      munsell_0.5.0     fansi_1.0.3      
[49] abind_1.4-5       R.methodsS3_1.8.1 lifecycle_1.0.1   stringi_1.7.6    
[53] multcomp_1.4-19   whisker_0.4       yaml_2.3.5        carData_3.0-5    
[57] grid_4.2.0        promises_1.2.0.1  crayon_1.5.1      lattice_0.20-45  
[61] haven_2.5.0       splines_4.2.0     hms_1.1.1         knitr_1.39       
[65] pillar_1.7.0      codetools_0.2-18  reprex_2.0.1      glue_1.6.2       
[69] evaluate_0.15     modelr_0.1.8      vctrs_0.4.1       tzdb_0.3.0       
[73] httpuv_1.6.5      cellranger_1.1.0  gtable_0.3.0      assertthat_0.2.1 
[77] xfun_0.30         broom_0.8.0       later_1.3.0       survival_3.3-1   
[81] workflowr_1.7.0   TH.data_1.1-1     ellipsis_0.3.2