jsPsych/docs/reference/jspsych-randomization.md
Josh de Leeuw 522aa2cdbf
Adding a simulation mode (#2287)
Implements simulation mode in the core library, supporting API features, and plugin support in most plugins.
2021-11-23 15:12:30 -05:00

551 lines
15 KiB
Markdown

# jsPsych.randomization
The jsPsych.randomization module contains methods that are useful for generating random lists of trial variables.
---
## jsPsych.randomization.factorial
```javascript
jsPsych.randomization.factorial(factors, repetitions, unpack)
```
### Parameters
| Parameter | Type | Description |
| ----------- | ------- | ---------------------------------------- |
| factors | object | The `factors` object should contain a property for each different factor. Each property-factor should have a value of an array, with each element of the array corresponding to a level of the factor. |
| repetitions | integer | The number of times to repeat each unique combination of the factors in the output sample. |
| unpack | boolean | If `true` then the output will be an object with a property for each factor in the original `factors` object. The value of each property-factor will be an array containing the levels of the factor in a random order. The order will be consistent across each property-factor (e.g., the first element of each property-factor will specify one unique combination of the factors). If `false`, then the return value will be an array of objects where each property-factor contains only a single value. |
### Return value
The return value depends on the `unpack` parameter. See description of the parameter above, and examples below.
### Description
This method takes a list of factors and their levels, and creates a full factorial design by creating each unique combination of the factors. The returned set of combinations is in a random order.
### Examples
#### Create full factorial design
```javascript
var factors = {
stimulus: ['a.jpg', 'b.jpg'],
ms_delay: [100, 200]
}
var full_design = jsPsych.randomization.factorial(factors, 1);
/*
output:
full_design = [
{stimulus: 'a.jpg', ms_delay: 200},
{stimulus: 'b.jpg', ms_delay: 200},
{stimulus: 'b.jpg', ms_delay: 100},
{stimulus: 'a.jpg', ms_delay: 100},
]
*/
```
#### Create full factorial design with repeats
```javascript
var factors = {
stimulus: ['a.jpg', 'b.jpg'],
ms_delay: [100, 200]
}
var full_design = jsPsych.randomization.factorial(factors, 2);
/*
output:
full_design = [
{stimulus: 'b.jpg', ms_delay: 200},
{stimulus: 'b.jpg', ms_delay: 100},
{stimulus: 'b.jpg', ms_delay: 100},
{stimulus: 'a.jpg', ms_delay: 100},
{stimulus: 'a.jpg', ms_delay: 200},
{stimulus: 'b.jpg', ms_delay: 200},
{stimulus: 'a.jpg', ms_delay: 100},
{stimulus: 'a.jpg', ms_delay: 200},
]
*/
```
#### Create full factorial design, unpacked
```javascript
var factors = {
stimulus: ['a.jpg', 'b.jpg'],
ms_delay: [100, 200]
}
var full_design = jsPsych.randomization.factorial(factors, 1, true);
/*
output:
full_design = {
stimulus: ['a.jpg','b.jpg','b.jpg','a.jpg'],
ms_delay: [200, 100, 200, 100]
]
*/
```
---
## jsPsych.randomization.randomID
```javascript
jsPsych.randomization.randomID(length)
```
### Parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| length | integer | The length of the randomly generated ID |
### Return value
Returns a string of length `length` where each character is randomly selected from the numbers 0-9 and all lowercase English letters a-z.
### Description
Generates a random string that is likely to be unique. If length is undefined, then the string length is 32.
### Example
```javascript
console.log(jsPsych.randomization.randomID());
// outputs: "t7dwz0e713pc8juuaayyfvpkdd9un239"
console.log(jsPsych.randomization.randomID(8));
// outputs: "3xtpcbck"
```
---
## jsPsych.randomization.randomInt
```javascript
jsPsych.randomization.randomInt(lower, upper)
```
### Parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| lower | integer | The smallest value it is possible to generate |
| upper | integer | The largest value it is possible to generate |
### Return value
An integer
### Description
Generates a random integer from `lower` to `upper`
### Example
```javascript
console.log(jsPsych.randomization.randomInt(2,4));
// outputs: 2 or 3 or 4.
```
---
## jsPsych.randomization.repeat
```javascript
jsPsych.randomization.repeat(array, repetitions, unpack)
```
### Parameters
| Parameter | Type | Description |
| ----------- | ---------------- | ---------------------------------------- |
| array | array | The array of values to randomize & repeat. |
| repetitions | integer or array | The number of times to repeat each element of the `array` in the final sample. If this parameter is defined as an integer, then each element of `array` is repeated the same number of times. This parameter can also be an array of the same length as `array`, in which case each element of `array` will be repeated the number of times defined in the corresponding position of the `repetitions` array. |
| unpack | boolean | If each element of `array` is an object with an equivalent set of properties, then setting `unpack` to `true` will make the return value an object with a property for each of the unique properties among the elements of the `array`. Each property in the output object will be an array containing the values for that property in the randomized order. The order will be consistent across properties. If this is `false` then the output is just an array containing a randomized order of the original `array` elements. |
### Return value
The return value depends on the `unpack` parameter. See description of the parameter above, and examples below.
### Description
This method takes an array of values and generates a new random order of the array, with the option of repeating each element of the array a specified number of times.
If the array elements are objects with the same set of properties, then this method can optionally return a single object where each property is a randomized order of the properties defined in the original set of objects. This is useful for randomizing sets of parameters that are used to define a jsPsych block.
### Examples
#### Shuffle an array, no repeats
```javascript
var myArray = [1,2,3,4,5];
var shuffledArray = jsPsych.randomization.repeat(myArray, 1);
// output: shuffledArray = [3,2,4,1,5]
```
#### Shuffle an array with repeats
```javascript
var myArray = [1,2,3,4,5];
var shuffledArray = jsPsych.randomization.repeat(myArray, 2);
// output: shuffledArray = [1,3,4,2,2,4,5,1,5,3]
```
#### Shuffle an array of objects
```javascript
var trial1 = {
stimulus: 'img/faceA.jpg',
correct_key: 'p',
person_name: 'Joe'
}
var trial2 = {
stimulus: 'img/faceB.jpg',
correct_key: 'p',
person_name: 'Fred'
}
var trial3 = {
stimulus: 'img/faceC.jpg',
correct_key: 'q',
person_name: 'Mary'
}
var myArray = [ trial1, trial2, trial3 ];
var shuffledArray = jsPsych.randomization.repeat(myArray, 2);
// output: shuffledArray = [ trial1, trial3, trial3, trial2, trial1, trial2 ]
```
#### Shuffle an array of objects, with unpack
```javascript
var trial1 = {
stimulus: 'img/faceA.jpg',
correct_key: 'p',
person_name: 'Joe'
}
var trial2 = {
stimulus: 'img/faceB.jpg',
correct_key: 'p',
person_name: 'Fred'
}
var trial3 = {
stimulus: 'img/faceC.jpg',
correct_key: 'q',
person_name: 'Mary'
}
var myArray = [ trial1, trial2, trial3 ];
var shuffledArray = jsPsych.randomization.repeat(myArray, 2, true);
/*
output: shuffledArray = {
stimulus: ['img/faceB.jpg','img/faceA.jpg','img/faceC.jpg','img/faceA.jpg','img/faceC.jpg','img/faceB.jpg'],
correct_key: ['p', 'p', 'q', 'p', 'q', 'p'],
person_name: ['Fred', 'Joe', 'Mary', 'Joe', 'Mary', 'Fred']
}
*/
```
---
## jsPsych.randomization.sampleBernoulli
```javascript
jsPsych.randomization.sampleBernoulli(p)
```
### Parameters
| Parameter | Type | Description |
| ---------- | ------- | ---------------------------------------- |
| p | number | Probability of sampling 1 |
### Return value
Returns 0 with probability `1-p` and 1 with probability `p`.
### Description
Generates a random sample from a Bernoulli distribution.
### Examples
#### Sample a value
```javascript
if(jsPsych.randomization.sampleBernoulli(0.8)){
// this happens 80% of the time
} else {
// this happens 20% of the time
}
```
---
## jsPsych.randomization.sampleExGaussian
```javascript
jsPsych.randomization.sampleExGaussian(mean, standard_deviation, rate, positive=false)
```
### Parameters
| Parameter | Type | Description |
| ---------- | ------- | ---------------------------------------- |
| mean | number | Mean of the normal distribution component of the exGaussian |
| standard_deviation | number | Standard deviation of the normal distribution component of the exGaussian |
| rate | number | Rate of the exponential distribution component of the exGaussian |
| positive | bool | If `true` sample will be constrained to > 0.
### Return value
A random sample from the distribution
### Description
Generates a random sample from an exponentially modified Gaussian distribution.
### Examples
#### Sample a value
```javascript
var rand_sample_exg = jsPsych.randomization.sampleExGaussian(500, 100, 0.01);
```
---
## jsPsych.randomization.sampleExponential
```javascript
jsPsych.randomization.sampleExponential(rate)
```
### Parameters
| Parameter | Type | Description |
| ---------- | ------- | ---------------------------------------- |
| rate | number | Rate of the exponential distribution |
### Return value
A random sample from the distribution
### Description
Generates a random sample from an exponential distribution.
### Examples
#### Sample a value
```javascript
var rand_sample_exg = jsPsych.randomization.sampleExponential(0.01);
```
---
## jsPsych.randomization.sampleNormal
```javascript
jsPsych.randomization.sampleNormal(mean, standard_deviation)
```
### Parameters
| Parameter | Type | Description |
| ---------- | ------- | ---------------------------------------- |
| mean | number | Mean of the normal distribution |
| standard_deviation | number | Standard deviation of the normal distribution |
### Return value
A random sample from the distribution
### Description
Generates a random sample from a normal distribution.
### Examples
#### Sample a value
```javascript
var rand_sample_exg = jsPsych.randomization.sampleNormal(500, 250);
```
---
## jsPsych.randomization.sampleWithReplacement
```javascript
jsPsych.randomization.sampleWithReplacement(array, sampleSize, weights)
```
### Parameters
| Parameter | Type | Description |
| ---------- | ------- | ---------------------------------------- |
| array | array | The array of values to sample from |
| sampleSize | numeric | The number of samples to draw |
| weights | array | The relative weight of each element in `array`. This array is normalized, so the values do not need to sum to 1. The length must match the length of `array`. |
### Return value
An array containing the sample.
### Description
This method returns a sample drawn at random from a set of values with replacement. The relative probability of drawing each item can be controlled by specifying the `weights`.
### Examples
#### Sample with equal probability
```javascript
var myArray = [1,2,3,4,5];
var sample = jsPsych.randomization.sampleWithReplacement(myArray, 10);
// output: sample = [3, 1, 2, 2, 5, 1, 4, 3, 1, 5];
```
#### Sample with unequal probability
```javascript
var myArray = [1,2,3,4,5];
var sample = jsPsych.randomization.sampleWithReplacement(myArray, 10, [6,1,1,1,1]);
// output: sample = [3, 4, 5, 1, 2, 1, 3, 1, 1, 1];
```
---
## jsPsych.randomization.sampleWithoutReplacement
```javascript
jsPsych.randomization.sampleWithoutReplacement(array, sampleSize)
```
### Parameters
| Parameter | Type | Description |
| ---------- | ------- | ---------------------------------- |
| array | array | The array of values to sample from |
| sampleSize | numeric | The number of samples to draw |
### Return value
An array containing the sample.
### Description
This method returns a sample drawn at random from a set of values without replacement. The sample size must be less than or equal to the length of the array.
### Examples
#### Sample without replacement
```javascript
var myArray = [1,2,3,4,5];
var sample = jsPsych.randomization.sampleWithoutReplacement(myArray, 2);
// output: sample = [3,2];
```
---
## jsPsych.randomization.shuffle
```javascript
jsPsych.randomization.shuffle(array)
```
### Parameters
| Parameter | Type | Description |
| --------- | ----- | ------------------------------ |
| array | array | The array of values to shuffle |
### Return value
Returns an array with the same elements as the input array in a random order.
### Description
A simple method for shuffling the order of an array.
### Examples
#### Shuffle an array
```javascript
var myArray = [1,2,3,4,5];
var shuffledArray = jsPsych.randomization.shuffle(myArray);
// output: shuffledArray = [3,2,4,1,5]
```
---
## jsPsych.randomization.shuffleNoRepeats
```javascript
jsPsych.randomization.shuffleNoRepeats(array, equalityTest)
```
### Parameters
| Parameter | Type | Description |
| ------------ | -------- | ---------------------------------------- |
| array | array | The array of values to shuffle |
| equalityTest | function | A function to use to evaluate the equality of neighbors in the array. The function should accept two parameters, which are the two elements to be tested. It should return `true` if they are equal and `false` if not. The default function, if none is specified, is to use the `===` operator. This will work for primitive values, but fail for Objects and Arrays. An example function is given below in the examples. |
### Return value
Returns an array with the same elements as the input array in a random order, with no repeating neighbors.
### Description
Shuffle an array, ensuring that neighboring elements in the array are different.
*Warning: if you provide an array that has very few valid permutations with no neighboring elements, then this method will fail and cause the browser to hang.*
### Examples
#### Basic example
```javascript
var myArray = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
var shuffledArray = jsPsych.randomization.shuffleNoRepeats(myArray);
// output: shuffledArray = [2, 3, 5, 1, 2, 4, 1, 5, 4, 1, 3, 5, 4, 3, 2]
```
#### Custom equalityTest
```javascript
var myObjects = [
{color:"blue"},
{color:"red"},
{color:"yellow"},
{color:"orange"}
];
var repeatedSet = jsPsych.randomization.repeat(myObjects,3);
var shuffled = jsPsych.randomization.shuffleNoRepeats(repeatedSet, function(a,b) { return a.color === b.color });
// console.log(JSON.stringify(shuffled))
// "[{"color":"red"},{"color":"yellow"},{"color":"blue"},{"color":"yellow"},{"color":"orange"},{"color":"red"},{"color":"yellow"},{"color":"orange"},{"color":"blue"},{"color":"orange"},{"color":"red"},{"color":"blue"}]"
```