Nothing
## ----echo = FALSE, message=FALSE----------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
library(dRiftDM)
set.seed(1014)
## -----------------------------------------------------------------------------
# Input documentation:
# named_values: a named numeric vector
# sigma_old, sigma_new: the previous and target diffusion constants
# t_from_to: scaling of time (options: ms->s, s->ms, or none)
convert_prms <- function(named_values,
sigma_old = 4,
sigma_new = 1,
t_from_to = "ms->s") {
# Some rough input checks
stopifnot(is.numeric(named_values), is.character(names(named_values)))
stopifnot(is.numeric(sigma_old), is.numeric(sigma_new))
t_from_to <- match.arg(t_from_to, choices = c("ms->s", "s->ms", "none"))
# Internal conversion function (takes a name and value pair, and transforms it)
internal <- function(name, value) {
name <- match.arg(
name,
choices = c("muc", "b", "non_dec", "sd_non_dec", "tau", "a", "A", "alpha")
)
# 1. scale for the diffusion constant
if (name %in% c("muc", "b", "A")) {
value <- value * (sigma_new / sigma_old)
}
# 2. scale for the time
# determine the scaling per parameter (assuming s->ms)
scale <- 1
if (name %in% c("non_dec", "sd_non_dec", "tau")) scale <- 1000
if (name %in% c("b", "A")) scale <- sqrt(1000)
if (name %in% c("muc")) scale <- sqrt(1000) / 1000
# adapt, depending on the t_from_to argument
if (t_from_to == "ms->s") scale <- 1 / scale
if (t_from_to == "none") scale <- 1
value <- value * scale
}
# Apply the internal function to each element
converted_values <- mapply(FUN = internal, names(named_values), named_values)
return(converted_values)
}
## -----------------------------------------------------------------------------
dmc_s <- dmc_dm()
prms_solve(dmc_s) # current parameter settings for sigma = 1 and seconds
quants_s <- calc_stats(dmc_s, "quantiles") # calculate predicted quantiles
head(quants_s) # show quantiles
# now the same with new diffusion constant of 4 and time scale in milliseconds
dmc_ms <- dmc_dm()
prms_solve(dmc_ms)["sigma"] <- 4 # new diffusion constant
prms_solve(dmc_ms)["t_max"] <- 3000 # 3000 ms is new max time
prms_solve(dmc_ms)["dt"] <- 1 # 1 ms steps
coef(dmc_ms) <- convert_prms(
named_values = coef(dmc_ms), # the previous parameters
sigma_old = 1, # diffusion constants
sigma_new = 4,
t_from_to = "s->ms" # how shall the time be scaled?
)
quants_ms <- calc_stats(dmc_ms, "quantiles") # calculate predicted quantiles
head(quants_ms) # show quantiles
## -----------------------------------------------------------------------------
coef(dmc_s)
coef(dmc_ms)
## ----echo = F-----------------------------------------------------------------
# "Unit test" the function
# TEST 1 -> converting twice should lead to the same result as previously
a_model <- dmc_dm(instr = "a ~!")
convert_1 <- convert_prms(
coef(a_model),
sigma_old = 1,
sigma_new = 4,
t_from_to = "s->ms"
)
convert_2 <- convert_prms(
convert_1,
sigma_old = 4,
sigma_new = 1,
t_from_to = "ms->s"
)
stopifnot(convert_2 == coef(a_model))
# TEST 2 -> quantiles from above should be very similar
stopifnot(
abs(quants_ms$Quant_corr - quants_s$Quant_corr * 1000) <= 0.001
)
# TEST 3 -> expectation based on "hand" formula
DMCfun_def <- c(A = 20, tau = 30, muc = 0.5, b = 75, non_dec = 300, sd_non_dec = 30, a = 2, alpha = 3)
exp <- convert_prms(DMCfun_def, sigma_new = 0.1, sigma_old = 4, t_from_to = "ms->s")
stopifnot(abs(exp["A"] - 0.01581139) < 0.0001)
stopifnot(abs(exp["tau"] - 0.030) < 0.0001)
stopifnot(abs(exp["muc"] - 0.3952847) < 0.0001)
stopifnot(abs(exp["b"] - 0.05929271) < 0.0001)
stopifnot(abs(exp["non_dec"] - 0.300) < 0.0001)
stopifnot(abs(exp["sd_non_dec"] - 0.030) < 0.0001)
stopifnot(abs(exp["a"] - 2) < 0.0001)
stopifnot(abs(exp["alpha"] - 3) < 0.0001)
# TEST 4 -> expectation based on "hand" formula (no time scaling)
exp <- convert_prms(DMCfun_def, sigma_new = 0.1, sigma_old = 4, t_from_to = "none")
stopifnot(abs(exp["A"] - 0.5) < 0.0001)
stopifnot(abs(exp["tau"] - 30) < 0.0001)
stopifnot(abs(exp["muc"] - 0.0125) < 0.0001)
stopifnot(abs(exp["b"] - 1.875) < 0.0001)
stopifnot(abs(exp["non_dec"] - 300) < 0.0001)
stopifnot(abs(exp["sd_non_dec"] - 30) < 0.0001)
stopifnot(abs(exp["a"] - 2) < 0.0001)
stopifnot(abs(exp["alpha"] - 3) < 0.0001)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.