Tutorial on Parameter defaults
As of version 0.9.8
, HDDM
doesn’t expect that you always
explicitly want to fit the v
, a
and t
parameters. You are
now allowed to fix any of these parameters to any default you like. In
this tutorial we show how to fit any given subset of parameters of a
model, while supplying (user picked) default values for the remaining
parameters.
Install (colab)
# package to help train networks
# !pip install git+https://github.com/AlexanderFengler/LANfactory
# package containing simulators for ssms
# !pip install git+https://github.com/AlexanderFengler/ssm_simulators
# packages related to hddm
# !pip install cython
# !pip install pymc==2.3.8
# !pip install git+https://github.com/hddm-devs/kabuki
# !pip install git+https://github.com/hddm-devs/hddm
Load Modules
# MODULE IMPORTS ----
# warning settings
import warnings
warnings.simplefilter(action="ignore", category=FutureWarning)
# Data management
import pandas as pd
import numpy as np
import pickle
# Plotting
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns
# Stats functionality
from statsmodels.distributions.empirical_distribution import ECDF
# HDDM
import hddm
from hddm.simulators.hddm_dataset_generators import simulator_h_c
Example Models
HDDM()
Simulate Data
#from hddm.simulators.hddm_dataset_generators import simulator_h_c
from hddm.simulators.basic_simulator import simulator
from hddm.simulators.hddm_dataset_generators import hddm_preprocess
model = 'ddm_hddm_base'
data = simulator(theta = [1., 1., 0.5, 0.5],
model = model,
n_samples = 500)
data = hddm_preprocess(data)
Model and Sample
Let’s first fit all parameters.
hddm_model = hddm.HDDM(data,
include = ['v', 'a', 't', 'z'],
informative = False,
is_group_model = False,
)
No model attribute --> setting up standard HDDM
Set model to ddm
hddm_model.sample(1000, burn = 500)
[-----------------100%-----------------] 1000 of 1000 complete in 8.5 sec
<pymc.MCMC.MCMC at 0x7ff3014fc210>
hddm_model.gen_stats()
mean | std | 2.5q | 25q | 50q | 75q | 97.5q | mc err | |
---|---|---|---|---|---|---|---|---|
a | 0.996413 | 0.022212 | 0.949557 | 0.983287 | 0.995682 | 1.011092 | 1.040408 | 0.001349 |
v | 1.150145 | 0.122256 | 0.925338 | 1.072607 | 1.14161 | 1.225006 | 1.435445 | 0.007297 |
t | 0.501954 | 0.003282 | 0.495503 | 0.500019 | 0.502353 | 0.504147 | 0.507753 | 0.000225 |
z | 0.488272 | 0.015967 | 0.45511 | 0.477788 | 0.489069 | 0.498717 | 0.519293 | 0.001011 |
Now we fix ``a`` to it’s default as per the HDDM
-supplied
model_config
dictionary. As shown below, this sets a = 2.
which
corresponds to an overestimation. We expect that, having fixed a
at
such value, we will correspondingly overestimate v
to compensate
(however the fit will end up worse in general).
hddm.model_config.model_config['ddm_hddm_base']
{'doc': 'Model used internally for simulation purposes. Do NOT use with the LAN extension.',
'params': ['v', 'a', 'z', 't'],
'params_trans': [0, 0, 1, 0],
'params_std_upper': [1.5, 1.0, None, 1.0],
'param_bounds': [[-5.0, 0.1, 0.05, 0], [5.0, 5.0, 0.95, 3.0]],
'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>,
'params_default': [0.0, 2.0, 0.5, 0],
'hddm_include': ['v', 'a', 't', 'z'],
'choices': [0, 1],
'slice_widths': {'v': 1.5,
'v_std': 1,
'a': 1,
'a_std': 1,
'z': 0.1,
'z_trans': 0.2,
't': 0.01,
't_std': 0.15}}
hddm_model_no_a = hddm.HDDM(data,
include = ['v', 't', 'z'],
informative = False,
is_group_model = False,
)
No model attribute --> setting up standard HDDM
Set model to ddm
/Users/afengler/OneDrive/project_hddm_extension/hddm/hddm/models/base.py:1316: UserWarning: Your include statement misses either the v, a or t parameters. Parameters not explicitly included will be set to the defaults, which you can find in the model_config dictionary! "Parameters not explicitly included will be set to the defaults, n" +
hddm_model_no_a.sample(1000, burn = 500)
[-----------------100%-----------------] 1000 of 1000 complete in 5.6 sec
<pymc.MCMC.MCMC at 0x7ff301546b50>
hddm_model_no_a.gen_stats()
mean | std | 2.5q | 25q | 50q | 75q | 97.5q | mc err | |
---|---|---|---|---|---|---|---|---|
v | 2.077952 | 0.146506 | 1.806508 | 1.977741 | 2.075691 | 2.164686 | 2.385388 | 0.011489 |
t | 0.335338 | 0.009595 | 0.315019 | 0.330216 | 0.335275 | 0.341575 | 0.353736 | 0.000553 |
z | 0.36132 | 0.022235 | 0.319808 | 0.346506 | 0.360754 | 0.376082 | 0.406029 | 0.001815 |
As predicted, v
is now overestimated as well.
Let’s now try to set a
to a default of our liking. We will set it to
the ground-truth and again not include it in the parameters to estimate.
To do so, we supply our own model_config
to the HDDM()
class.
from copy import deepcopy
# copy model_config dictionary so we can change it
my_model_config = deepcopy(hddm.model_config.model_config['ddm_hddm_base'])
# setting 'a' to 1.
my_model_config['params_default'][1] = 1.
hddm_model_no_a_2 = hddm.HDDM(data,
include = ['v', 't', 'z'],
informative = False,
is_group_model = False,
model_config = my_model_config
)
Custom model config supplied as:
{'doc': 'Model used internally for simulation purposes. Do NOT use with the LAN extension.', 'params': ['v', 'a', 'z', 't'], 'params_trans': [0, 0, 1, 0], 'params_std_upper': [1.5, 1.0, None, 1.0], 'param_bounds': [[-5.0, 0.1, 0.05, 0], [5.0, 5.0, 0.95, 3.0]], 'boundary': <function constant at 0x7ff31c1fab90>, 'params_default': [0.0, 1.0, 0.5, 0], 'hddm_include': ['v', 'a', 't', 'z'], 'choices': [0, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15}}
No model attribute --> setting up standard HDDM
Set model to ddm
/Users/afengler/OneDrive/project_hddm_extension/hddm/hddm/models/base.py:1316: UserWarning: Your include statement misses either the v, a or t parameters. Parameters not explicitly included will be set to the defaults, which you can find in the model_config dictionary! "Parameters not explicitly included will be set to the defaults, n" +
hddm_model_no_a_2.sample(1000, burn = 500)
[-----------------100%-----------------] 1000 of 1000 complete in 5.2 sec
<pymc.MCMC.MCMC at 0x7ff30157b150>
hddm_model_no_a_2.gen_stats()
mean | std | 2.5q | 25q | 50q | 75q | 97.5q | mc err | |
---|---|---|---|---|---|---|---|---|
v | 1.171748 | 0.118515 | 0.935492 | 1.094611 | 1.170236 | 1.251087 | 1.425975 | 0.006572 |
t | 0.501641 | 0.002593 | 0.496291 | 0.499915 | 0.50178 | 0.503453 | 0.506346 | 0.000121 |
z | 0.486188 | 0.016581 | 0.450828 | 0.476066 | 0.486156 | 0.497147 | 0.518931 | 0.000963 |
As we see, in this case v
is estimated appropriately again.
Let’s compare DICs
print('Standard: ', hddm_model.dic)
print('No a with HDDM default: ', hddm_model_no_a.dic)
print('No a with a set to ground truth: ', hddm_model_no_a_2.dic)
Standard: -7.05123814817064
No a with HDDM default: 562.273161208081
No a with a set to ground truth: -9.028954442474097
HDDMnn()
Let’s repeat this with another model via the HDDMnn()
class. We will
pick the HDDM
-supplied angle
model.
Simulate Data
model = 'angle'
theta = [1., 1.5, .5, .5, 0.2] # v, a, z, t, theta
data_angle = simulator(theta = theta,
model = 'angle',
n_samples = 500)
data_angle = hddm_preprocess(data_angle,
keep_negative_responses = True)
Model and Sample
model_angle = hddm.HDDMnn(data_angle,
model = 'angle',
include = ['v', 'a', 't', 'z', 'theta'])
Using default priors: Uninformative
Supplied model_config specifies params_std_upper for z as None.
Changed to 10
model_angle.sample(1000, burn = 500)
[-----------------100%-----------------] 1000 of 1000 complete in 52.0 sec
<pymc.MCMC.MCMC at 0x7ff301575390>
model_angle.gen_stats()
mean | std | 2.5q | 25q | 50q | 75q | 97.5q | mc err | |
---|---|---|---|---|---|---|---|---|
v | 1.020563 | 0.083431 | 0.852936 | 0.964464 | 1.020123 | 1.074769 | 1.178448 | 0.006605 |
a | 1.584719 | 0.098083 | 1.419463 | 1.511524 | 1.576579 | 1.651892 | 1.787859 | 0.009077 |
z | 0.526568 | 0.025441 | 0.475032 | 0.510146 | 0.527315 | 0.543314 | 0.577972 | 0.002245 |
t | 0.494598 | 0.037365 | 0.420589 | 0.470531 | 0.495294 | 0.521575 | 0.561596 | 0.003361 |
theta | 0.270865 | 0.050656 | 0.177934 | 0.236454 | 0.269616 | 0.304024 | 0.377811 | 0.004407 |
Again we will now leave out one parameter (let’s pick theta
this
time). As we can see from the printed model_config
below, the
default that will be chosen for this parameter is to set it to 0
in
this case.
hddm.model_config.model_config
{'ddm_hddm_base': {'doc': 'Model used internally for simulation purposes. Do NOT use with the LAN extension.', 'params': ['v', 'a', 'z', 't'], 'params_trans': [0, 0, 1, 0], 'params_std_upper': [1.5, 1.0, None, 1.0], 'param_bounds': [[-5.0, 0.1, 0.05, 0], [5.0, 5.0, 0.95, 3.0]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 2.0, 0.5, 0], 'hddm_include': ['v', 'a', 't', 'z'], 'choices': [0, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'full_ddm_hddm_base': {'doc': 'Model used internally for simulation purposes. Do NOT use with the LAN extension.', 'params': ['v', 'a', 'z', 't', 'sz', 'sv', 'st'], 'params_trans': [0, 0, 1, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 0.1, 0.5, 0.1], 'param_bounds': [[-5.0, 0.1, 0.3, 0.25, 0, 0, 0], [5.0, 5.0, 0.7, 2.25, 0.25, 4.0, 0.25]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 1.0, 0.5, 0.25, 0, 0, 0], 'hddm_include': ['v', 'a', 't', 'z', 'st', 'sv', 'sz'], 'choices': [0, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'sz': 1.1, 'st': 0.1, 'sv': 0.5}}, 'ddm': {'doc': 'Basic DDM. Meant for use with the LAN extension. nNote that the boundaries here are coded as -a, and a in line with all other models meant for the LAN extension. nTo compare model fits between standard HDDM and HDDMnn when using the DDM model, multiply the boundary (a) parameter by 2. nWe recommend using standard HDDM if you are interested in the basic DDM, but you might want to use this for testing.', 'params': ['v', 'a', 'z', 't'], 'params_trans': [0, 0, 1, 0], 'params_std_upper': [1.5, 1.0, None, 1.0], 'param_bounds': [[-3.0, 0.3, 0.1, 0.001], [3.0, 2.5, 0.9, 2.0]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 1.0, 0.5, 0.001], 'hddm_include': ['v', 'a', 't', 'z'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'angle': {'doc': 'Model formulation is described in the documentation under LAN Extension.nMeant for use with the extension.', 'params': ['v', 'a', 'z', 't', 'theta'], 'params_trans': [0, 0, 1, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 1.0], 'param_bounds': [[-3.0, 0.3, 0.1, 0.001, -0.1], [3.0, 3.0, 0.9, 2.0, 1.3]], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'params_default': [0.0, 1.0, 0.5, 0.001, 0.1], 'hddm_include': ['v', 'a', 't', 'z', 'theta'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2}}, 'weibull': {'doc': 'Model formulation is described in the documentation under LAN Extension.nMeant for use with the extension.', 'params': ['v', 'a', 'z', 't', 'alpha', 'beta'], 'params_trans': [0, 0, 1, 0, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 2.0, 2.0], 'param_bounds': [[-2.5, 0.3, 0.2, 0.001, 0.31, 0.31], [2.5, 2.5, 0.8, 2.0, 4.99, 6.99]], 'boundary': <function ssms.basic_simulators.boundary_functions.weibull_cdf(t=1, alpha=1, beta=1)>, 'params_default': [0.0, 1.0, 0.5, 0.001, 3.0, 3.0], 'hddm_include': ['v', 'a', 't', 'z', 'alpha', 'beta'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'alpha': 1.0, 'alpha_std': 0.5, 'beta': 1.0, 'beta_std': 0.5}}, 'levy': {'doc': 'Model formulation is described in the documentation under LAN Extension.nMeant for use with the extension.', 'params': ['v', 'a', 'z', 'alpha', 't'], 'params_trans': [0, 0, 1, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 1.0], 'param_bounds': [[-3.0, 0.3, 0.1, 1.0, 0.001], [3.0, 2.0, 0.9, 2.0, 2]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 1.0, 0.5, 1.5, 0.001], 'hddm_include': ['v', 'a', 't', 'z', 'alpha'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'alpha': 1.0, 'alpha_std': 0.5}}, 'full_ddm': {'doc': 'Currently unavailable, for LANs after switch to pytorch. nComing soon... Please use standard HDDM if you want to fit this model to your data.', 'params': ['v', 'a', 'z', 't', 'sz', 'sv', 'st'], 'params_trans': [0, 0, 1, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 0.1, 0.5, 0.1], 'param_bounds': [[-3.0, 0.3, 0.3, 0.25, 0.001, 0.001, 0.001], [3.0, 2.5, 0.7, 2.25, 0.2, 2.0, 0.25]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 1.0, 0.5, 0.25, 0.001, 0.001, 0.001], 'hddm_include': ['v', 'a', 't', 'z', 'st', 'sv', 'sz'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'sz': 1.1, 'st': 0.1, 'sv': 0.5}}, 'ornstein': {'doc': 'Model formulation is described in the documentation under LAN Extension.Meant for use with the extension.', 'params': ['v', 'a', 'z', 'g', 't'], 'params_trans': [0, 0, 1, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 1.0], 'param_bounds': [[-2.0, 0.3, 0.2, -1.0, 0.001], [2.0, 2.0, 0.8, 1.0, 2]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 1.0, 0.5, 0.0, 0.001], 'hddm_include': ['v', 'a', 't', 'z', 'g'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 0.1, 'a': 1, 'a_std': 0.1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'g': 0.1, 'g_trans': 0.2, 'g_std': 0.1}}, 'ddm_sdv': {'doc': 'Currently unavailable, for LANs after switch to pytorch. Coming soon...Please use standard HDDM if you want to fit this model to your data.', 'params': ['v', 'a', 'z', 't', 'sv'], 'params_trans': [0, 0, 1, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 1.0], 'param_bounds': [[-3.0, 0.3, 0.1, 0.001, 0.001], [3.0, 2.5, 0.9, 2.0, 2.5]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 1.0, 0.5, 0.001, 0.001], 'hddm_include': ['v', 'a', 't', 'z', 'sv'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'sv': 0.5}}, 'gamma_drift': {'doc': 'Meant for use with the LAN extension', 'params': ['v', 'a', 'z', 't', 'shape', 'scale', 'c'], 'params_trans': [0, 0, 1, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 2.0, 2.0, 1.5], 'param_bounds': [[-3.0, 0.3, 0.1, 0.001, 2.0, 0.01, -3.0], [3.0, 3.0, 0.9, 2.0, 10.0, 1.0, 3.0]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 1.0, 0.5, 0.25, 5.0, 0.5, 1.0], 'hddm_include': ['v', 'a', 't', 'z', 'shape', 'scale', 'c'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'shape': 1, 'shape_std': 1, 'scale': 1, 'scale_std': 1, 'c': 1, 'c_std': 1}}, 'gamma_drift_angle': {'doc': 'Meant for use with the LAN extension', 'params': ['v', 'a', 'z', 't', 'theta', 'shape', 'scale', 'c'], 'params_trans': [0, 0, 1, 0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 1.0, 2.0, 2.0, 1.5], 'param_bounds': [[-3.0, 0.3, 0.1, 0.001, -0.1, 2.0, 0.01, -3.0], [3.0, 3.0, 0.9, 2.0, 1.3, 10.0, 1.0, 3.0]], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'params_default': [0.0, 1.0, 0.5, 0.25, 0.0, 5.0, 0.5, 1.0], 'hddm_include': ['v', 'a', 't', 'z', 'shape', 'scale', 'c', 'theta'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2, 'shape': 1, 'shape_std': 1, 'scale': 1, 'scale_std': 1, 'c': 1, 'c_std': 1}}, 'ds_conflict_drift': {'doc': 'Meant for use with LAN extension.', 'params': ['a', 'z', 't', 'tinit', 'dinit', 'tslope', 'dslope', 'tfixedp', 'tcoh', 'dcoh'], 'param_bounds': [[0.3, 0.1, 0.001, 0, 0, 0.01, 0.01, 0, -1.0, -1.0], [3.0, 0.9, 2.0, 5.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0]], 'params_trans': [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 'params_std_upper': [1.0, None, 1.0, 1.5, 1.5, 1.5, 1.5, 1.5, 1.0, 1.0], 'params_default': [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 1.0], 'hddm_include': ['a', 'z', 't', 'tinit', 'dinit', 'tslope', 'dslope', 'tfixedp', 'tcoh', 'dcoh'], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'choices': [-1, 1], 'slice_widhts': {'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 'z_std': 1, 'z_trans_std': 1, 't': 0.01, 't_std': 1, 'tinit': 0.1, 'tinit_std': 1, 'dinit': 0.1, 'dinit_std': 1, 'tslope': 1, 'tslope_std': 1, 'dslope': 1, 'dslope_std': 1, 'tfixedp': 1, 'tfixedp_std': 1, 'tcoh': 1, 'tcoh_std': 1, 'dcoh': 1, 'dcohe_std': 1}}, 'ds_conflict_drift_angle': {'doc': 'Meant for use with LAN extension.', 'params': ['a', 'z', 't', 'tinit', 'dinit', 'tslope', 'dslope', 'tfixedp', 'tcoh', 'dcoh', 'angle'], 'param_bounds': [[0.3, 0.1, 0.001, 0, 0, 0.01, 0.01, 0, -1.0, -1.0, -0.1], [3.0, 0.9, 2.0, 5.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0, 1.3]], 'params_trans': [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'params_std_upper': [1.0, None, 1.0, 1.5, 1.5, 1.5, 1.5, 1.5, 1.0, 1.0, 1.0], 'params_default': [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 1.0, 0.0], 'hddm_include': ['a', 'z', 't', 'tinit', 'dinit', 'tslope', 'dslope', 'tfixedp', 'tcoh', 'dcoh', 'theta'], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'choices': [-1, 1], 'slice_widhts': {'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 'z_std': 1, 'z_trans_std': 1, 't': 0.01, 't_std': 1, 'tinit': 0.1, 'tinit_std': 1, 'dinit': 0.1, 'dinit_std': 1, 'tslope': 1, 'tslope_std': 1, 'dslope': 1, 'dslope_std': 1, 'tfixedp': 1, 'tfixedp_std': 1, 'tcoh': 1, 'tcoh_std': 1, 'dcoh': 1, 'dcoh_std': 1, 'theta': 0.1, 'theta_std': 0.2}}, 'ddm_par2': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'zh', 'zl1', 'zl2', 't'], 'params_trans': [0, 0, 0, 0, 1, 1, 1, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, None, None, None, 1.0], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.2, 0.2, 0.2, 0.0], [2.5, 2.5, 2.5, 2.0, 0.8, 0.8, 0.8, 2.0]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 1.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'zh', 'zl1', 'zl2', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 'zh': 0.1, 'zh_trans': 0.2, 'zl1': 0.1, 'zl1_trans': 0.2, 'zl2': 0.1, 'zl2_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'ddm_par2_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 't'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0], [2.5, 2.5, 2.5, 2.0, 2.0]], 'params_trans': [0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 1.0, 1.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 't': 0.01, 't_std': 0.15}}, 'ddm_par2_angle_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 't', 'theta'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0, -0.1], [2.5, 2.5, 2.5, 2.0, 2.0, 1.0]], 'params_trans': [0, 0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'boundary_multiplicative': False, 'params_default': [0.0, 0.0, 0.0, 1.0, 1.0, 0.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 't', 'theta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2}}, 'ddm_par2_weibull_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 't', 'alpha', 'beta'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0, 0.31, 0.31], [2.5, 2.5, 2.5, 2.0, 2.0, 4.99, 6.99]], 'params_trans': [0, 0, 0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.5, 1.5], 'boundary': <function ssms.basic_simulators.boundary_functions.weibull_cdf(t=1, alpha=1, beta=1)>, 'boundary_multiplicative': True, 'params_default': [0.0, 0.0, 0.0, 1.0, 1.0, 2.5, 3.5], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 't', 'alpha', 'beta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2, 'alpha': 1.0, 'alpha_std': 0.5, 'beta': 1.0, 'beta_std': 0.5}}, 'ddm_seq2': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'zh', 'zl1', 'zl2', 't'], 'params_trans': [0, 0, 0, 0, 1, 1, 1, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, None, None, None, 1.0], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.2, 0.2, 0.2, 0.0], [2.5, 2.5, 2.5, 2.0, 0.8, 0.8, 0.8, 2.0]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 1.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'zh', 'zl1', 'zl2', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 'zh': 0.1, 'zh_trans': 0.2, 'zl1': 0.1, 'zl1_trans': 0.2, 'zl2': 0.1, 'zl2_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'ddm_seq2_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 't'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0], [2.5, 2.5, 2.5, 2.0, 2.0]], 'params_trans': [0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 1.0, 1.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 't': 0.01, 't_std': 0.15}}, 'ddm_seq2_angle_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 't', 'theta'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0, -0.1], [2.5, 2.5, 2.5, 2.0, 2.0, 1.0]], 'params_trans': [0, 0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'boundary_multiplicative': False, 'params_default': [0.0, 0.0, 0.0, 1.0, 1.0, 0.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 't', 'theta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2}}, 'ddm_seq2_weibull_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 't', 'alpha', 'beta'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0, 0.31, 0.31], [2.5, 2.5, 2.5, 2.0, 2.0, 4.99, 6.99]], 'params_trans': [0, 0, 0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.5, 1.5], 'boundary': <function ssms.basic_simulators.boundary_functions.weibull_cdf(t=1, alpha=1, beta=1)>, 'boundary_multiplicative': True, 'params_default': [0.0, 0.0, 0.0, 1.0, 1.0, 2.5, 3.5], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 't', 'alpha', 'beta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 't': 0.01, 't_std': 0.15, 'alpha': 1.0, 'alpha_std': 0.5, 'beta': 1.0, 'beta_std': 0.5}}, 'ddm_mic2_adj': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'zh', 'zl1', 'zl2', 'd', 't'], 'params_trans': [0, 0, 0, 0, 1, 1, 1, 1, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, None, None, None, None, 1.0], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.2, 0.2, 0.2, 0.0, 0.0], [2.5, 2.5, 2.5, 2.0, 0.8, 0.8, 0.8, 1.0, 2.0]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'zh', 'zl1', 'zl2', 'd', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 'zh': 0.1, 'zh_trans': 0.2, 'zl1': 0.1, 'zl1_trans': 0.2, 'zl2': 0.1, 'zl2_trans': 0.2, 'd': 0.1, 'd_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'ddm_mic2_adj_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'd', 't'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0, 0.0], [2.5, 2.5, 2.5, 2.0, 1.0, 2.0]], 'params_trans': [0, 0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 1.0, 0.5, 1.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'd', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 'd': 0.1, 'd_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'ddm_mic2_adj_angle_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'theta'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0, 0.0, -0.1], [2.5, 2.5, 2.5, 2.0, 1.0, 2.0, 1.0]], 'params_trans': [0, 0, 0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'boundary_multiplicative': False, 'params_default': [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 0.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'theta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 'd': 0.1, 'd_trans': 0.2, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2}}, 'ddm_mic2_adj_weibull_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'alpha', 'beta'], 'param_bounds': [[-2.5, -2.5, -2.5, 0.3, 0.0, 0.0, 0.31, 0.31], [2.5, 2.5, 2.5, 2.0, 1.0, 2.0, 4.99, 6.99]], 'params_trans': [0, 0, 0, 0, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0, 1.5, 1.5], 'boundary': <function ssms.basic_simulators.boundary_functions.weibull_cdf(t=1, alpha=1, beta=1)>, 'boundary_multiplicative': True, 'params_default': [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 2.5, 3.5], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'alpha', 'beta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 1, 'd': 0.1, 'd_trans': 0.2, 't': 0.01, 't_std': 0.15, 'alpha': 1.0, 'alpha_std': 0.5, 'beta': 1.0, 'beta_std': 0.5}}, 'tradeoff_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'd', 't'], 'params_trans': [0, 0, 0, 0, 0, 0], 'param_bounds': [[-4.0, -4.0, -4.0, 0.3, 0.0, 0.0], [4.0, 4.0, 4.0, 2.5, 1.0, 2.0]], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'n_params': 6, 'default_params': [0.0, 0.0, 0.0, 1.0, 0.5, 1.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'd', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 0.1, 'd': 0.1, 'd_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'tradeoff_angle_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'theta'], 'params_trans': [0, 0, 0, 0, 0, 0, 0], 'param_bounds': [[-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, -0.1], [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 1.0]], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'boundary_multiplicative': False, 'n_params': 7, 'default_params': [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 0.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'theta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 0.1, 'd': 0.1, 'd_trans': 0.2, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2}}, 'tradeoff_weibull_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'alpha', 'beta'], 'params_trans': [0, 0, 0, 0, 0, 0, 0, 0], 'param_bounds': [[-4.0, -4.0, -4.0, 0.3, 0.0, 0.0, 0.31, 0.31], [4.0, 4.0, 4.0, 2.5, 1.0, 2.0, 4.99, 6.99]], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.weibull_cdf(t=1, alpha=1, beta=1)>, 'boundary_multiplicative': True, 'n_params': 8, 'default_params': [0.0, 0.0, 0.0, 1.0, 0.5, 1.0, 2.5, 3.5], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'alpha', 'beta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 0.1, 'd': 0.1, 'd_trans': 0.2, 't': 0.01, 't_std': 0.15, 'alpha': 1.0, 'alpha_std': 0.5, 'beta': 1.0, 'beta_std': 0.5}}, 'tradeoff_conflict_gamma_no_bias': {'doc': 'Currently undocumented, in testing phase.', 'params': ['vh', 'vl1', 'vl2', 'd', 't', 'a', 'theta', 'scale', 'alphagamma', 'scalegamma'], 'params_trans': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'param_bounds': [[-4.0, -4.0, -4.0, 0.0, 0.0, 0.3, 0.0, 0.0, 1.1, 0.5], [4.0, 4.0, 4.0, 1.0, 2.0, 2.5, 0.5, 5.0, 5.0, 5.0]], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.conflict_gamma_bound(t=array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3. , 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5. , 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6. , 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7. , 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8. , 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9. , 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10. , 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11. , 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12. , 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13. , 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14. , 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15. , 15.1, 15.2, 15.3, 15.4, 15.5, 15.6, 15.7, 15.8, 15.9, 16. , 16.1, 16.2, 16.3, 16.4, 16.5, 16.6, 16.7, 16.8, 16.9, 17. , 17.1, 17.2, 17.3, 17.4, 17.5, 17.6, 17.7, 17.8, 17.9, 18. , 18.1, 18.2, 18.3, 18.4, 18.5, 18.6, 18.7, 18.8, 18.9, 19. , 19.1, 19.2, 19.3, 19.4, 19.5, 19.6, 19.7, 19.8, 19.9]), a=0.5, theta=0.5, scale=1, alpha_gamma=1.01, scale_gamma=0.3)>, 'boundary_multiplicative': False, 'n_params': 10, 'default_params': [0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0], 'hddm_include': ['vh', 'vl1', 'vl2', 'a', 'd', 't', 'theta', 'scale', 'alphagamma', 'scalegamma'], 'choices': [0, 1, 2, 3], 'slice_widths': {'vh': 1.5, 'vh_std': 0.5, 'vl1': 1.5, 'vl1_std': 0.5, 'vl2': 1.5, 'vl2_std': 0.5, 'a': 1, 'a_std': 0.1, 'd': 0.1, 'd_trans': 0.2, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2, 'scale': 0.1, 'scale_std': 0.2, 'alphagamma': 0.1, 'alphagamma_std': 0.2, 'scalegamma': 0.1, 'scalegamma_std': 0.2}}, 'race_no_bias_3': {'doc': 'To be used with the LAN extension. Note, we suggest to fix z instead here, since it is essentially nredundant with the boundary separation parameter a. Future versions will drop z altogether.', 'params': ['v0', 'v1', 'v2', 'a', 'z', 't'], 'params_trans': [0, 0, 0, 0, 1, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, None, 1.0], 'param_bounds': [[0.0, 0.0, 0.0, 1.0, 0.0, 0.0], [2.5, 2.5, 2.5, 3.0, 0.9, 2.0]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 2.0, 0.5, 0.001], 'hddm_include': ['v0', 'v1', 'v2', 'a', 'z', 't'], 'choices': [0, 1, 2], 'slice_widths': {'v0': 1.5, 'v0_std': 0.5, 'v1': 1.5, 'v1_std': 0.5, 'v2': 1.5, 'v2_std': 0.5, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'race_no_bias_angle_3': {'doc': 'To be used with the LAN extension. Note, we suggest to fix z instead here, since it is essentially nredundant with the boundary separation parameter a. Future versions will drop z altogether.', 'params': ['v0', 'v1', 'v2', 'a', 'z', 't', 'theta'], 'param_bounds': [[0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -0.1], [2.5, 2.5, 2.5, 3.0, 0.9, 2.0, 1.45]], 'params_trans': [0, 0, 0, 0, 1, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, None, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'params_default': [0.0, 0.0, 0.0, 2.0, 0.5, 0.001, 0.0], 'hddm_include': ['v0', 'v1', 'v2', 'a', 'z', 't', 'theta'], 'choices': [0, 1, 2], 'slice_widths': {'v0': 1.5, 'v0_std': 0.5, 'v1': 1.5, 'v1_std': 0.5, 'v2': 1.5, 'v2_std': 0.5, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2}}, 'race_no_bias_4': {'doc': 'To be used with the LAN extension. Note, we suggest to fix z instead here, since it is essentially nredundant with the boundary separation parameter a. Future versions will drop z altogether.', 'params': ['v0', 'v1', 'v2', 'v3', 'a', 'z', 't'], 'param_bounds': [[0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0], [2.5, 2.5, 2.5, 2.5, 3.0, 0.9, 2.0]], 'params_std_upper': [1.5, 1.5, 1.5, 1.5, 1.0, None, 1.0], 'params_trans': [0, 0, 0, 0, 0, 1, 0], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 0.0, 2.0, 0.5, 0.001], 'hddm_include': ['v0', 'v1', 'v2', 'v3', 'a', 'z', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'v0': 1.5, 'v0_std': 0.5, 'v1': 1.5, 'v1_std': 0.5, 'v2': 1.5, 'v2_std': 0.5, 'v3': 1.5, 'v3_std': 0.5, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15}}, 'race_no_bias_angle_4': {'doc': 'To be used with the LAN extension. Note, we suggest to fix z instead here, since it is essentially nredundant with the boundary separation parameter a. Future versions will drop z altogether.', 'params': ['v0', 'v1', 'v2', 'v3', 'a', 'z', 't', 'theta'], 'param_bounds': [[0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -0.1], [2.5, 2.5, 2.5, 2.5, 3.0, 0.9, 2.0, 1.45]], 'params_trans': [0, 0, 0, 0, 0, 1, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.5, 1.0, None, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'params_default': [0.0, 0.0, 0.0, 0.0, 2.0, 0.5, 0.001, 0.0], 'hddm_include': ['v0', 'v1', 'v2', 'v3', 'a', 'z', 't', 'theta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'v0': 1.5, 'v0_std': 0.5, 'v1': 1.5, 'v1_std': 0.5, 'v2': 1.5, 'v2_std': 0.5, 'v3': 1.5, 'v3_std': 0.5, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'theta': 0.1, 'theta_std': 0.2}}, 'lca_no_bias_3': {'doc': 'To be used with the LAN extension. Note, we suggest to fix z instead here, since it is essentially nredundant with the boundary separation parameter a. Future versions will drop z altogether.', 'params': ['v0', 'v1', 'v2', 'a', 'z', 'g', 'b', 't'], 'param_bounds': [[0.0, 0.0, 0.0, 1.0, 0.0, -1.0, -1.0, 0.0], [2.5, 2.5, 2.5, 3.0, 0.9, 1.0, 1.0, 2.0]], 'params_trans': [0, 0, 0, 0, 1, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, None, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 2.0, 0.5, 0.0, 0.0, 0.001], 'hddm_include': ['v0', 'v1', 'v2', 'a', 'z', 'g', 'b', 't'], 'choices': [0, 1, 2], 'slice_widths': {'v0': 1.5, 'v0_std': 0.5, 'v1': 1.5, 'v1_std': 0.5, 'v2': 1.5, 'v2_std': 0.5, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'g': 0.1, 'g_std': 0.2, 'b': 0.1, 'b_std': 0.2}}, 'lca_no_bias_angle_3': {'doc': 'To be used with the LAN extension. Note, we suggest to fix z instead here, since it is essentially nredundant with the boundary separation parameter a. Future versions will drop z altogether.', 'params': ['v0', 'v1', 'v2', 'a', 'z', 'g', 'b', 't', 'theta'], 'param_bounds': [[0.0, 0.0, 0.0, 1.0, 0.0, -1.0, -1.0, 0.0, -1.0], [2.5, 2.5, 2.5, 3.0, 0.9, 1.0, 1.0, 2.0, 1.45]], 'params_trans': [0, 0, 0, 0, 1, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.0, None, 1.5, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'params_default': [0.0, 0.0, 0.0, 2.0, 0.5, 0.0, 0.0, 0.001, 0.0], 'hddm_include': ['v0', 'v1', 'v2', 'a', 'z', 'g', 'b', 't', 'theta'], 'choices': [0, 1, 2], 'slice_widths': {'v0': 1.5, 'v0_std': 0.5, 'v1': 1.5, 'v1_std': 0.5, 'v2': 1.5, 'v2_std': 0.5, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'g': 0.1, 'g_std': 0.2, 'b': 0.1, 'b_std': 0.2, 'theta': 0.1, 'theta_std': 0.2}}, 'lca_no_bias_4': {'doc': 'To be used with the LAN extension. Note, we suggest to fix z instead here, since it is essentially nredundant with the boundary separation parameter a. Future versions will drop z altogether.', 'params': ['v0', 'v1', 'v2', 'v3', 'a', 'z', 'g', 'b', 't'], 'param_bounds': [[0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.0, -1.0, 0.0], [2.5, 2.5, 2.5, 2.5, 3.0, 0.9, 1.0, 1.0, 2.0]], 'params_trans': [0, 0, 0, 0, 0, 1, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.5, 1.0, None, 1.5, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 0.0, 0.0, 0.0, 2.0, 0.5, 0.0, 0.0, 0.001], 'hddm_include': ['v0', 'v1', 'v2', 'v3', 'a', 'z', 'g', 'b', 't'], 'choices': [0, 1, 2, 3], 'slice_widths': {'v0': 1.5, 'v0_std': 0.5, 'v1': 1.5, 'v1_std': 0.5, 'v2': 1.5, 'v2_std': 0.5, 'v3': 1.5, 'v3_std': 0.5, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'g': 0.1, 'g_std': 0.2, 'b': 0.1, 'b_std': 0.2}}, 'lca_no_bias_angle_4': {'doc': 'To be used with the LAN extension. Note, we suggest to fix z instead here, since it is essentially nredundant with the boundary separation parameter a. Future versions will drop z altogether.', 'params': ['v0', 'v1', 'v2', 'v3', 'a', 'z', 'g', 'b', 't', 'theta'], 'param_bounds': [[0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.0, -1.0, 0.0, -0.1], [2.5, 2.5, 2.5, 2.5, 3.0, 0.9, 1.0, 1.0, 2.0, 1.45]], 'params_trans': [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.5, 1.5, 1.5, 1.0, None, 1.5, 1.0, 1.0, 1.0], 'boundary': <function ssms.basic_simulators.boundary_functions.angle(t=1, theta=1)>, 'params_default': [0.0, 0.0, 0.0, 0.0, 2.0, 0.5, 0.0, 0.0, 0.001, 0.0], 'hddm_include': ['v0', 'v1', 'v2', 'v3', 'a', 'z', 'g', 'b', 't', 'theta'], 'choices': [0, 1, 2, 3], 'slice_widths': {'v0': 1.5, 'v0_std': 0.5, 'v1': 1.5, 'v1_std': 0.5, 'v2': 1.5, 'v2_std': 0.5, 'v3': 1.5, 'v3_std': 0.5, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'g': 0.1, 'g_std': 0.2, 'b': 0.1, 'b_std': 0.2, 'theta': 0.1, 'theta_std': 0.2}}, 'full_ddm2': {'doc': 'Currently unavailable, for LANs after switch to pytorch. nComing soon... Please use standard HDDM if you want to fit this model to your data.', 'params': ['v', 'a', 'z', 't', 'sz', 'sv', 'st'], 'params_trans': [0, 0, 1, 0, 0, 0, 0], 'params_std_upper': [1.5, 1.0, None, 1.0, 0.1, 0.5, 0.1], 'param_bounds': [[-3.0, 0.3, 0.3, 0.25, 0.001, 0.001, 0.001], [3.0, 2.5, 0.7, 2.25, 0.2, 2.0, 0.25]], 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>, 'params_default': [0.0, 1.0, 0.5, 0.25, 0.001, 0.001, 0.001], 'hddm_include': ['v', 'a', 't', 'z', 'st', 'sv', 'sz'], 'choices': [-1, 1], 'slice_widths': {'v': 1.5, 'v_std': 1, 'a': 1, 'a_std': 1, 'z': 0.1, 'z_trans': 0.2, 't': 0.01, 't_std': 0.15, 'sz': 1.1, 'st': 0.1, 'sv': 0.5}}}
model_angle_no_theta = hddm.HDDMnn(data_angle,
model = 'angle',
include = ['v', 'a', 't', 'z'])
Using default priors: Uninformative
Supplied model_config specifies params_std_upper for z as None.
Changed to 10
model_angle_no_theta.sample(1000, burn = 500)
[-----------------100%-----------------] 1000 of 1000 complete in 47.4 sec
<pymc.MCMC.MCMC at 0x7ff30160bed0>
model_angle_no_theta.gen_stats()
mean | std | 2.5q | 25q | 50q | 75q | 97.5q | mc err | |
---|---|---|---|---|---|---|---|---|
v | 1.124278 | 0.09761 | 0.928012 | 1.052883 | 1.128692 | 1.191886 | 1.310813 | 0.008418 |
a | 1.363875 | 0.053492 | 1.259736 | 1.327325 | 1.364278 | 1.396537 | 1.468327 | 0.004211 |
z | 0.49972 | 0.030672 | 0.436555 | 0.477589 | 0.498887 | 0.522161 | 0.558534 | 0.002693 |
t | 0.536048 | 0.033127 | 0.464361 | 0.515404 | 0.53657 | 0.558055 | 0.595229 | 0.002959 |
Again we observe how the parameter estimates are affected by the wrong choice of ``theta``. The model tries to compensate for the parallel bounds (no collapse), implied by the ``theta`` default, by decreasing ``a`` and slightly increasing ``v``. Let’s now try again, but this time we set ``theta`` fixed to the actualground truth*.
# copy out the model_config dictionary for the angle model
my_model_config_angle = deepcopy(hddm.model_config.model_config['angle'])
# set theta default to the ground truth defined above
my_model_config_angle['params_default'][4] = 0.2
model_angle_no_theta_2 = hddm.HDDMnn(data_angle,
model = 'angle',
include = ['v', 'a', 't', 'z'],
model_config = my_model_config_angle)
Using default priors: Uninformative
Supplied model_config specifies params_std_upper for z as None.
Changed to 10
model_angle_no_theta_2.sample(1000, burn = 500)
[-----------------100%-----------------] 1000 of 1000 complete in 53.4 sec
<pymc.MCMC.MCMC at 0x7ff301652c90>
model_angle_no_theta_2.gen_stats()
mean | std | 2.5q | 25q | 50q | 75q | 97.5q | mc err | |
---|---|---|---|---|---|---|---|---|
v | 1.020949 | 0.089617 | 0.838443 | 0.959232 | 1.019338 | 1.087935 | 1.188067 | 0.007229 |
a | 1.46397 | 0.049143 | 1.363087 | 1.429878 | 1.465694 | 1.49972 | 1.554566 | 0.003623 |
z | 0.527111 | 0.027281 | 0.471521 | 0.508124 | 0.527366 | 0.547015 | 0.581392 | 0.002391 |
t | 0.528561 | 0.029786 | 0.470851 | 0.50755 | 0.527586 | 0.547936 | 0.588767 | 0.002522 |
As we see, fixing theta
to the actual ground truth, corrects the
parameter estimates of the remaining parameters to be much more accurate
again.
Let’s compare DICs
print('Standard: ', model_angle.dic)
print('theta set to model_config default: ', model_angle_no_theta.dic)
print('theta set to ground truth: ', model_angle_no_theta_2.dic)
Standard: 1059.453694824219
theta set to model_config default: 1066.945202636719
theta set to ground truth: 1058.248090332031
We observe in this case, that fixing theta
to 0
instead of
0.2
, didn’t do too much damage as far as the DICs are concerned.
Nevertheless, the explicitly wrong model performs worst as per this
metric.
END
Hopefully this was helpful.