def create_default_params(parnames): pars = parameters.parameter_container() for pname in parnames: if pname in [ 'diffstd', 'critstd', 'dnoisestd', 'cnoisestd', 'dnoisestd', 'dirstd', 'ndtspread', 'noisestd', 'intstd' ]: pars.add_param(pname, 0, 1, parameters.exponential()) elif pname == 'bound': pars.add_param(pname, 0, 1, parameters.gaussprob(width=0.5, shift=0.5)) elif pname in ['bias', 'lapseprob', 'lapsetoprob']: pars.add_param(pname, 0, 1, parameters.gaussprob()) elif pname in ['cpsqrtkappa']: pars.add_param(pname, 0, 1, parameters.zero()) else: pars.add_param(pname, 0, 1) return pars
# normalising constant of the uniform distribution over the data space in # which samples are accepted as defined by distfun and epsilon; for # response_dist this is 2*epsilon for the Euclidean distance between true # and sampled RT veps = 2 * epsilon #%% inference for mname in models: # generate time-stamped file name fname = datetime.datetime.now().strftime('infres_'+mname+'_%Y%m%d%H%M') # prepare common model parameters pars = pyEPABC.parameters.parameter_container() pars.add_param('ndtmean', -1, 1) pars.add_param('ndtspread', -1.5, 1, exponential()) pars.add_param('noisestd', 4, 1.5, exponential()) pars.add_param('bound', 0, 1, gaussprob(0.5, 0.5)) pars.add_param('prior', 0, 0.5, gaussprob()) pars.add_param('lapseprob', -1, 1, gaussprob()) pars.add_param('lapsetoprob', 0, 1, gaussprob()) # model-specific preparations if mname == 'basic': pass elif mname == 'collapse': pars.add_param('bshape', np.log(1.4), 1.5, exponential()) pars.add_param('bstretch', 0, 1, gaussprob()) else: raise ValueError('unknown model requested')
dt, data.tarDir.unique() / 180 * np.pi, data.critDir / 180 * np.pi, maxrt=data.dropna().RT.max() + dt, toresponse=helpers.toresponse, choices=choices) errorm = model.correct != data.response ind = data.response != 0 assert np.all( data[ind].error == errorm[ind]), ("Model and data don't agree " "about which trials are error trials!") #%% infer pars = pyEPABC.parameters.parameter_container() pars.add_param('noisestd', 0, 1.2, exponential()) #pars.add_param('intstd', 0, 1.2, exponential()) model.intstd = 0.2 pars.add_param('bound', 0, 1, gaussprob(width=0.5, shift=0.5)) pars.add_param('bias', 0, .2, gaussprob()) pars.add_param('ndtmean', -2, 1) pars.add_param('ndtspread', np.log(0.2), 1, exponential()) pars.add_param('lapseprob', -1.65, 1, gaussprob()) # median approx at 0.05 pars.add_param('lapsetoprob', 0, 1, gaussprob()) pars.plot_param_dist() simfun = lambda data, dind, parsamples: model.gen_distances_with_params( data[0], data[1], dind, pars.transform(parsamples), pars.names) epsilon = 0.05
import matplotlib.pyplot as plt #%% define parameters and their prior ndtdist = 'uniform' modelname = 'base' use_liks = True pars = parameters.parameter_container() if modelname == 'base': fix = {'bound': 0.7} if use_liks: fix['noisestd'] = 0 if 'noisestd' not in fix.keys(): pars.add_param('noisestd', 0, 1.2, exponential()) if 'intstd' not in fix.keys(): pars.add_param('intstd', 0, 1.2, exponential()) elif modelname == 'diff': fix = {'bound': 0.7, 'diffstd': 1000, 'cnoisestd': 1e-12, 'cpsqrtkappa': 0} if 'diffstd' not in fix.keys(): pars.add_param('diffstd', 0, 10, exponential()) if 'cpsqrtkappa' not in fix.keys(): pars.add_param('cpsqrtkappa', 1, 1, zero()) if 'critstd' not in fix.keys(): pars.add_param('critstd', 0, 1, exponential()) if 'cnoisestd' not in fix.keys(): pars.add_param('cnoisestd', 0, 1, exponential()) if 'dnoisestd' not in fix.keys():