| Title: | Modelling Continuous Report Visual Short-Term Memory Studies | 
| Version: | 1.2.2 | 
| Date: | 2025-07-19 | 
| Description: | A set of utility functions for analysing and modelling data from continuous report short-term memory experiments using either the 2-component mixture model of Zhang and Luck (2008) <doi:10.1038/nature06860> or the 3-component mixture model of Bays et al. (2009) <doi:10.1167/9.10.7>. Users are also able to simulate from these models. | 
| Depends: | R (≥ 4.0) | 
| Imports: | dplyr, ggplot2, rlang, tidyr | 
| Suggests: | knitr, rmarkdown | 
| License: | GPL-3 | 
| LazyData: | true | 
| URL: | https://github.com/JimGrange/mixtur | 
| BugReports: | https://github.com/JimGrange/mixtur/issues | 
| Encoding: | UTF-8 | 
| RoxygenNote: | 7.3.2 | 
| Copyright: | Some functions have been adapted from Matlab code written by Paul Bays (https://bayslab.com) published under GNU General Public License. | 
| NeedsCompilation: | no | 
| Packaged: | 2025-07-21 08:58:28 UTC; jimgrange | 
| Author: | Jim Grange | 
| Maintainer: | Jim Grange <grange.jim@gmail.com> | 
| Repository: | CRAN | 
| Date/Publication: | 2025-07-21 12:30:01 UTC | 
Full data set from Bays et al. (2009)
Description
A full data set including data from 12 participants in a continuous report visual short-term memory experiment. The stimuli were coloured squares in the range radians -pi to pi. The experiment had various set sizes and an additional manipulation of duration of the sample array presentation.
Usage
bays2009_full
Format
A data frame with 7271 rows and 10 variables:
- id
- participant identification 
- set_size
- the set size of each trial 
- duration
- the duration of the sample array (in milliseconds, ms), with levels 100ms, 500ms, 2000ms 
- response
- the participant's recollection of the target orientation in radians (-pi to pi) 
- target
- the feature value of the target in radians (-pi to pi) 
- non_target_1
- the feature value of the first non-target in radians (-pi to pi) 
- non_target_2
- the feature value of the second non-target in radians (-pi to pi) 
- non_target_3
- the feature value of the third non-target in radians (-pi to pi) 
- non_target_4
- the feature value of the fourth non-target in radians (-pi to pi) 
- non_target_5
- the feature value of the fifth non-target in radians (-pi to pi) 
Source
The data set is publicly available on the Open Science Framework, with thanks to Paul Bays: https://osf.io/c2yx5/
References
Bays, P.M., Catalao, R.F.G., & Husain, M. (2009). The precision of visual working memory is set by allocation of a shared resource. Journal of Vision, 9(10), Article 7.
Sample data set from Bays et al. (2009)
Description
A sample data set including data from 12 participants in a continuous report visual short-term memory experiment. The stimuli were coloured squares in the range radians -pi to pi. The sample data set only consists of trials with a set size of 4 and a sample array duration of 500ms.
Usage
bays2009_sample
Format
A data frame with 7271 rows and 10 variables:
- id
- participant identification 
- response
- the participant's recollection of the target orientation in radians (-pi to pi) 
- target
- the feature value of the target in radians (-pi to pi) 
- non_target_1
- the feature value of the first non-target in radians (-pi to pi) 
- non_target_2
- the feature value of the second non-target in radians (-pi to pi) 
- non_target_3
- the feature value of the third non-target in radians (-pi to pi) 
Source
The data set is publicly available on the Open Science Framework, with thanks to Paul Bays: https://osf.io/c2yx5/
References
Bays, P.M., Catalao, R.F.G., & Husain, M. (2009). The precision of visual working memory is set by allocation of a shared resource. Journal of Vision, 9(10), Article 7.
Data set from Berry et al. (2019)
Description
A data set including data from 30 participants in a continuous report visual short-term memory experiment. The stimuli were oriented bars within the range 1-180 degrees. The experiment had a set size of 3.
Usage
berry_2019
Format
A data frame with 3600 rows and 6 variables:
- id
- participant identification 
- condition
- condition of experiment: whether the task was completed under single-task or dual-task conditions 
- target_ori
- the orientation of the target in degrees (1-180) 
- response_ori
- the participant's recollection of the target orientation in degrees (1-180) 
- non_target_1
- the orientation of the first non-target in degrees (1-180) 
- non_target_2
- the orientation of the second non-target in degrees (1-180) 
Source
The data set is publicly available on the Open Science Framework: https://osf.io/59c4g/
References
Berry. E.D.J., Allen, R.J., Waterman, A.H., & Logie, R.H. (2019). The effect of a verbal concurrent task on visual precision in working memory. Experimental Psychology, 66, (77-85).
Fit the mixture model.
Description
This is the function called by the user to fit either the two- or three- component mixture model.
Usage
fit_mixtur(
  data,
  model = "3_component",
  unit = "degrees",
  id_var = "id",
  response_var = "response",
  target_var = "target",
  non_target_var = NULL,
  set_size_var = NULL,
  condition_var = NULL,
  return_fit = FALSE
)
Arguments
| data | A data frame with columns containing (at the very least) trial-level participant response and target values This data can either be in degrees (1-360 or 1-180) or radians. If the 3-component mixture model is to be fitted to the data, the data frame also needs to contain the values of all non-targets. In addition, the model can be fit to individual individual participants, individual set-sizes, and individual additional conditions; if the user wishes for this, then the data frame should have columns coding for this information. | 
| model | A string indicating the model to be fit to the data. Currently the options are "2_component", "3_component", "slots", and "slots_averaging". | 
| unit | A string indicating the unit of measurement in the data frame: "degrees" (measurement is in degrees, from 1 to 360); "degrees_180 (measurement is in degrees, but limited to 1 to 180); or "radians" (measurement is in radians, from pi to 2 * pi, but could also be already in the range -pi to pi). | 
| id_var | The quoted column name coding for participant id. If the data is from a single participant (i.e., there is no id column) set to NULL. | 
| response_var | The quoted column name coding for the participants' responses | 
| target_var | The quoted column name coding for the target value. | 
| non_target_var | The quoted variable name common to all columns (if
applicable) storing non-target values. If the user wishes to fit the
3-component mixture model, the user should have one column coding for each
non-target's value in the data frame. If there is more than one non-target,
each column name should begin with a common term (e.g., the "non_target"
term is common to the non-target columns "non_target_1", "non_target_2"
etc.), which should then be passed to the function via the
 | 
| set_size_var | The quoted column name (if applicable) coding for the set size of each response. | 
| condition_var | The quoted column name (if applicable) coding for the condition of each response. | 
| return_fit | If set to TRUE, the function will return the log-likelihood of the model fit, Akiakie's Information Criterion (AIC), Bayesian Information Criterion (BIC), as well as the number of trials used in the fit. | 
Value
Returns a data frame with best-fitting parameters per participant (if
applicable), set-size (if applicable), and condition (if applicable). If
return_fit was set to TRUE, the data frame will also include
the log-likelihood value and information criteria of the model fit.
Source
The code for the 3-component model has been adapted from Matlab code written by Paul Bays (https://bayslab.com) published under GNU General Public License.
Examples
# load the example data
data <- bays2009_full
# fit the 3-component mixture model ignoring condition
fit <- fit_mixtur(data = data,
                  model = "3_component",
                  unit = "radians",
                  id_var = "id",
                  response_var = "response",
                  target_var = "target",
                  non_target_var = "non_target",
                  set_size_var = "set_size",
                  condition_var = NULL)
Obtain summary statistics of response error
Description
Returns participant-level summary statistic data of response error estimates ready for inferential analysis. Note that the function does not actually conduct the analysis.
Usage
get_summary_statistics(
  data,
  unit = "degrees",
  id_var = "id",
  response_var = "response",
  target_var = "target",
  set_size_var = NULL,
  condition_var = NULL
)
Arguments
| data | A data frame with columns containing: participant identifier (declared via variable 'id_var'); the participants' response per trial ('response_var'); the target value ('target_var'); and, if applicable, the set size of each response ('set_size_var'), and the condition of each response ('condition_var'). | 
| unit | The unit of measurement in the data frame: "degrees" (measurement is in degrees, from 0 to 360); "degrees_180 (measurement is in degrees, but limited to 0 to 180); or "radians" (measurement is in radians, from pi to 2 * pi, but could also be already in -pi to pi). | 
| id_var | The quoted column name coding for participant id. If the data is from a single participant (i.e., there is no id column) set to NULL. | 
| response_var | The quoted column name coding for the participants' responses | 
| target_var | The quoted column name coding for the target value. | 
| set_size_var | The quoted column name (if applicable) coding for the set size of each response. | 
| condition_var | The quoted column name (if applicable) coding for the condition of each response. | 
Value
Returns a data frame containing the summary statistics
mean_absolute_error, resultant_vector_length,
precision, and bias per participant (if applicable),
set-size (if applicable), and condition (if applicable).
Examples
# load an example data frame
data(bays2009_full)
# calculate the summary statistics per condition and per set size
summary_data <- get_summary_statistics(data = bays2009_full,
                                      unit = "radians",
                                      condition_var = "duration",
                                      set_size_var = "set_size")
Data set from Oberauer & Lin (2017)
Description
A data set including data from 19 participants in a continuous report visual short-term memory experiment. The stimuli were coloured patches within the range 1-360 degrees. The experiment had a set sizes ranging from 1 to 8.
Usage
oberauer_2017
Format
A data frame with 15,200 rows and 11 variables:
- id
- participant identification 
- set_size
- the set size of each trial 
- response
- the participant's recollection of the target colour in degrees (1-360) 
- target
- the orientation of the target colour in degrees (1-360) 
- non_target_1
- the orientation of the first non-target in degrees (1-360) 
- non_target_2
- the orientation of the first non-target in degrees (1-360) 
- non_target_3
- the orientation of the second non-target in degrees (1-360) 
- non_target_4
- the orientation of the third non-target in degrees (1-360) 
- non_target_5
- the orientation of the fourth non-target in degrees (1-360) 
- non_target_6
- the orientation of the fifth non-target in degrees (1-360) 
- non_target_7
- the orientation of the sixth non-target in degrees (1-360) 
Source
The data set is publicly available on the Open Science Framework: https://osf.io/j24wb/
References
Oberauer, K. & Lin, H-Y. (2017). An interference model of visual working memory. Psychological Review, 124, 21-59.
Plot response error of behavioural data relative to target values.
Description
Function to plot the response error in behavioural data relative to target values. Requires a data frame that (at least) has target value data and participant response data.
Usage
plot_error(
  data,
  unit = "degrees",
  id_var = "id",
  response_var = "response",
  target_var = "target",
  set_size_var = NULL,
  condition_var = NULL,
  n_bins = 18,
  n_col = 2,
  return_data = FALSE,
  palette = "Dark2",
  scale_y_axis = NULL
)
Arguments
| data | A data frame with columns containing: participant identifier ('id_var'); the participants' response per trial ('response_var'); the target value ('target_var'); and, if applicable, the set size of each response ('set_size_var'), and the condition of each response ('condition_var'). | 
| unit | The unit of measurement in the data frame: "degrees" (measurement is in degrees, from 0 to 360); "degrees_180 (measurement is in degrees, but limited to 0 to 180); or "radians" (measurement is in radians, from pi to 2 * pi, but could also be already in -pi to pi). | 
| id_var | The column name coding for participant id. If the data is from a single participant (i.e., there is no id column) set to "NULL". | 
| response_var | The column name coding for the participants' responses. | 
| target_var | The column name coding for the target value. | 
| set_size_var | The column name (if applicable) coding for the set size of each response. | 
| condition_var | The column name (if applicable) coding for the condition of each response. | 
| n_bins | An integer controlling the number of cells / bins used in the plot. | 
| n_col | An integer controlling the number of columns in the resulting plot. | 
| return_data | A boolean (TRUE or FALSE) indicating whether the data for the plot should be returned. | 
| palette | A character stating the preferred colour palette to use. To see all available palettes, type ?scale_colour_brewer into the console. | 
| scale_y_axis | A vector of 2 elements stating the minimum and maximum value to use for the y-axis in the plots. | 
Value
If return_data is set to FALSE (which it is by default),
the function returns a ggplot2 object visualising the density distribution
of response error averaged across participants (if applicable) per set-size
(if applicable) and condition (if applicable).
If return_data is set to TRUE, the function returns a
list with two components:
-  plot:The ggplot2 object.
-  data:A data frame with the data used to generate the plot.
Examples
plot_error(bays2009_full,
          unit = "radians",
          set_size_var = "set_size")
Plot response error of behavioural data relative to non-target values.
Description
Function to plot the response error in behavioural data relative to non-target values. Note that this function also applies a correction to account for the minimum angle distance on feature values. Requires a data frame that (at least) has target value data, non-target values, and participant response data.
Usage
plot_error_non_target(
  data,
  unit = "degrees",
  id_var = "id",
  response_var = "response",
  target_var = "target",
  non_target_var = "non_target",
  set_size_var = NULL,
  condition_var = NULL,
  n_bins = 18,
  n_col = 2,
  return_data = FALSE,
  palette = "Dark2",
  scale_y_axis = NULL
)
Arguments
| data | A data frame with columns containing: participant identifier ('id_var'); the participants' response per trial ('response_var'); the target value ('target_var'); and, if applicable, the set size of each response ('set_size_var'), and the condition of each response ('condition_var'). | 
| unit | The unit of measurement in the data frame: "degrees" (measurement is in degrees, from 0 to 360); "degrees_180 (measurement is in degrees, but limited to 0 to 180); or "radians" (measurement is in radians, from pi to 2 * pi, but could also be already in -pi to pi). | 
| id_var | The column name coding for participant id. If the data is from a single participant (i.e., there is no id column) set to "NULL". | 
| response_var | The column name coding for the participants' responses. | 
| target_var | The column name coding for the target value. | 
| non_target_var | The column name coding for the non-target values. | 
| set_size_var | The column name (if applicable) coding for the set size of each response. | 
| condition_var | The column name (if applicable) coding for the condition of each response. | 
| n_bins | An integer controlling the number of cells / bins used in the plot. | 
| n_col | An integer controlling the number of columns in the resulting plot. | 
| return_data | A boolean (TRUE or FALSE) indicating whether the data for the plot should be returned. | 
| palette | A character stating the preferred colour palette to use. To see all available palettes, type display.brewer.all() into the console. | 
| scale_y_axis | A vector of 2 elements stating the minimum and maximum value to use for the y-axis in the plots. | 
Value
If return_data is set to FALSE (which it is by default),
the function returns a ggplot2 object visualising the density distribution
of response error averaged across participants (if applicable) per set-size
(if applicable) and condition (if applicable).
If return_data is set to TRUE, the function returns a
list with two components:
-  plot:The ggplot2 object.
-  data:A data frame with the data used to generate the plot.
Examples
plot_error_non_target(bays2009_full,
                      unit = "radians",
                      set_size_var = "set_size")
Plot model fit against human error data (target errors)
Description
Plot model fit against human error data (target errors)
Usage
plot_model_fit(
  participant_data,
  model_fit,
  model,
  unit = "degrees",
  id_var = "id",
  response_var = "response",
  target_var = "target",
  set_size_var = NULL,
  condition_var = NULL,
  n_bins = 18,
  n_col = 2,
  palette = "Dark2"
)
Arguments
| participant_data | A data frame of the participant data, with columns containing: participant identifier ('id_var'); the participants' response per trial ('response_var'); the target value ('target_var'); and, if applicable, the set size of each response ('set_size_var'), and the condition of each response ('condition_var'). | 
| model_fit | The model fit object to be plotted against participant data. | 
| model | A string indicating the model that was fit to the data. Currently the options are "2_component", "3_component", "slots", and "slots_averaging". | 
| unit | The unit of measurement in the data frame: "degrees" (measurement is in degrees, from 0 to 360); "degrees_180 (measurement is in degrees, but limited to 0 to 180); or "radians" (measurement is in radians, from pi to 2 * pi, but could also be already in -pi to pi). | 
| id_var | The column name coding for participant id. If the data is from a single participant (i.e., there is no id column) set to "NULL". | 
| response_var | The column name coding for the participants' responses | 
| target_var | The column name coding for the target value | 
| set_size_var | The column name (if applicable) coding for the set size of each response | 
| condition_var | The column name (if applicable) coding for the condition of each response | 
| n_bins | An integer controlling the number of cells / bins used in the plot of the behavioural data. | 
| n_col | An integer controlling the number of columns in the resulting plot. | 
| palette | A character stating the preferred colour palette to use. To see all available palettes, type ?scale_colour_brewer into the console. | 
Value
The function returns a ggplot2 object visualising the mean observed response error density distribution across participants (if applicable) per set-size (if applicable) and condition (if applicable) together with the model predictions superimposed.
Plot best-fitting parameters of model fit
Description
Function to plot the best-fitting parameters of either the 2-component or 3-component model. .
Usage
plot_model_parameters(
  model_fit,
  model,
  id_var = "id",
  set_size_var = NULL,
  condition_var = NULL,
  n_col = 2,
  return_data = FALSE,
  palette = "Dark2"
)
Arguments
| model_fit | The model fit object containing the parameters to be plotted. | 
| model | A string indicating the model that was fit to the data. Currently the options are "2_component", "3_component", "slots", and "slots_averaging". | 
| id_var | The column name coding for participant id. | 
| set_size_var | The column name (if applicable) coding for the set size of each response. | 
| condition_var | The column name (if applicable) coding for the condition of each response. | 
| n_col | An integer controlling the number of columns in the resulting plot. | 
| return_data | A boolean (TRUE or FALSE) indicating whether the data for the plot should be returned. | 
| palette | A character stating the preferred colour palette to use. To see all available palettes, type?scale_colour_brewer into the console. | 
Value
If return_data is set to FALSE (which it is by
default),the function returns a ggplot2 object visualising the mean model
parameters across participants (if applicable) per set-size (if applicable)
and condition (if applicable).
If return_data is set to TRUE, the function returns a
list with two components:
-  plot:The ggplot2 object.
-  data:A data frame with the data used to generate the plot.
Plot summary statistics of behavioural data
Description
Function to plot model-free summary statistics of behavioural data. Users can plot mean absolute error, resultant vector length, and precision of the behavioural data.
Usage
plot_summary_statistic(
  data,
  statistic = "precision",
  unit = "degrees",
  id_var = "id",
  response_var = "response",
  target_var = "target",
  set_size_var = NULL,
  condition_var = NULL,
  return_data = FALSE,
  palette = "Dark2"
)
Arguments
| data | A data frame with columns containing: participant identifier ('id_var'); the participants' response per trial ('response_var'); the target value ('target_var'); and, if applicable, the set size of each response ('set_size_var'), and the condition of each response ('condition_var'). | 
| statistic | The summary statistic to plot. This can be set to "mean_absolute_error", "resultant_vector_length", or "precision". | 
| unit | The unit of measurement in the data frame: "degrees" (measurement is in degrees, from 0 to 360); "degrees_180 (measurement is in degrees, but limited to 0 to 180); or "radians" (measurement is in radians, from pi to 2 * pi, but could also be already in -pi to pi). | 
| id_var | The column name coding for participant id. If the data is from a single participant (i.e., there is no id column) set to "NULL". | 
| response_var | The column name coding for the participants' responses. | 
| target_var | The column name coding for the target value. | 
| set_size_var | The column name (if applicable) coding for the set size of each response. | 
| condition_var | The column name (if applicable) coding for the condition of each response. | 
| return_data | A boolean (TRUE or FALSE) indicating whether the data for the plot should be returned. | 
| palette | A character stating the preferred colour palette to use. To see all available palettes, type ?scale_colour_brewer into the console. | 
Value
If return_data is set to FALSE (which it is by default),
the function returns a ggplot2 object visualising the summary statistic
averaged across participants (if applicable) per set-size (if applicable)
and condition (if applicable).
If return_data is set to TRUE, the function returns a
list with two components:
-  plot:The ggplot2 object.
-  data:A data frame with the data used to generate the plot.
Examples
plot_summary_statistic(bays2009_full,
                      unit = "radians",
                      statistic = "precision",
                      set_size_var = "set_size",
                      condition_var = "duration")
Generate simulated data from mixture models
Description
Generate simulated data from mixture models
Usage
simulate_mixtur(n_trials, model, kappa, p_u, p_n, K, set_size)
Arguments
| n_trials | an integer indicating how many trials to simulate | 
| model | a string indicating the model to be fit to the data. Currently the options are "2_component", "3_component", "slots", and "slots_averaging". | 
| kappa | a numeric value indicating the concentration parameter of the von Mises distribution to use in the simulations. Note, when simulating from the 2_component or 3_component model, if multiple values are provided to the set_size argument, kappa must be a vector of parameter values to use for each set size). | 
| p_u | a numeric value indicating the probability of uniform guessing to use when simulating from the 2_component and 3_component models. Note, when simulating from the 2_component or 3_component model, if multiple values are provided to the set_size argument, p_u must be a vector of parameter values to use for each set size). | 
| p_n | a numeric value indicating the probability of a non-target response when simulating from the 3_component model. Note, when simulating from the 2_component or 3_component model, if multiple values are provided to the set_size argument, p_n must be a vector of parameter values to use for each set size). | 
| K | a numeric value indicating the capacity value to use when simulating from the slots and slots_averaging models. | 
| set_size | a numeric value (or vector) indicating the set size(s) to use in the simulations | 
Value
Returns a data frame containing simulated responses from the requested model per set-size (if applicable).
Examples
# simulate from the slots model
slots_data <- simulate_mixtur(n_trials = 1000,
                             model = "slots",
                             kappa = 8.2,
                             K = 2.5,
                             set_size = c(2, 4, 6, 8))
# simulate one set size from the 3_component model
component_data <- simulate_mixtur(n_trials = 1000,
                                 model = "3_component",
                                 kappa = 8.2,
                                 p_u = .1,
                                 p_n = .15,
                                 set_size = 4)
# simulate multiple set sizes from the 3_component model
component_data_multiple_sets <- simulate_mixtur(n_trials = 1000,
                                               model = "3_component",
                                               kappa = c(10, 8, 6),
                                               p_u = c(.1, .1, .1),
                                               p_n = c(.1, .15, .2),
                                               set_size = c(2, 4, 6))