Paper: https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1008863
If you would like to use part of this code for your own project, I encourage you to get in touch with me before you dive into the code (it's a bit hairy) [email protected]
meta_mdp.jl
defines the metalevel Markov decision process.voi.jl
defines the value of information features.bmps.jl
defines the policy, based on the VOI features.bmps_ucb.jl
defines the UCB method for identifying near-optimal settings of the BMPS weights.pseudo_likelihood.jl
defines the likelihood of summary statistics used to fit the model.
Simulations from the optimal model can be found here
That folder contains all data needed to plot the model simulations in the paper. Each file contains the simulations for binary or trinary choice, with the prior either "fit" to the data, fixed to the empirical mean ("unbiased") or fixed to "zero".
The files are JSON formatted, a list of trial objects. The spec for each trial is:
value
: a list specifying the value of the two/three optionschoice
: the chosen option, ONE-INDEXED (1-2 or 1-3)fixations
: a list specifying which option was fixated at each time step (100ms), also one-indexedparam_idx
: (1-30) id for the parameter configurationpolicy_idx
: (1-80) id for the near-optimal policy
The last two values can be ignored in most cases. Together they roughly correspond to one "subject"
I don't imagine anyone else will want to invest the compute resources to actually replicate this, but here are instructions to do so for the sake of completeness.
- Define parameters such as the search space and output directory in
fit_base.jl
. I use files inruns/
to organize parameters for different runs. The final run used to generate results in the paper isruns/revision.jl
. - Find the near-optimal policies for each candidate parameter setting: run
julia compute_policies.jl i
for i in 1 to N. Each job takes an average of 30 minutes. - Compute the likelihood for each candidate parameter setting: run
julia compute_likelihood.jl i
for i in 1 to N. Each job takes an average of 64 minutes. Each job depends only on the results of the same index from the compute_policies step. - Identify the top-performing parmaeters based on the results from the previous step: Run
julia process_likelihood.jl
. Six sets are identified in which the prior is either fit or not fit and the fitting is done jointly or separately on each dataset. - Compute likelihood and simulations on the held out set: Run
julia evaluation.jl joint PRIOR_MODE
. PRIOR_MODE can befit
,unbiased
, orzero
. To generate the full results, you need to run all three modes. - Plots are generated in
plots.jl
andindividual_plots.jl
. This must be done in an environment where graphics can be displayed. I used the Hydrogen package in Atom. Alternatively, you can use X11 forwarding to run it on a server, or you can copy the simulation results to your local machine (warning: each set of simulations is 500-750 MB). - The ADDM is implemented in
addm.jl
. Generate simulations and precompute features to plot withjulia run_addm.jl
.plot_addm_binary.jl
andplot_addm_trinary.jl
generate the replication plots to compare against the original papers.