Я использую новый шаблон плагина jsPsych, чтобы создать плагин для моего эксперимента. Я относительно неопытен в кодировании, и я впервые пытаюсь кодировать, моделируя другие плагины по умолчанию.
Мой плагин представляет собой вариант задачи с 2 вооруженными бандитами, когда одна рука начинается с 10 очков, а другая - запускается. с 20 баллами. В зависимости от того, на что нажимают участники, рука с более низкими точками будет иметь вероятность увеличения в 0,075 на 20 пунктов при каждом испытании. Будет проведено 300 испытаний.
ПРИМЕР 1-е испытание: участник выбирает левую руку.
Что я хочу сделать, это записать данные для выбранной руки (отклик клавиатуры), текущая точка вознаграждения 1-горука (rewardL), текущая точка вознаграждения 2-й руки (rewardR), общее количество очков (totalreward) за каждое испытание. Однако мой сценарий даже не загружается должным образом.
Я также хочу показывать общее количество очков и текущее вознаграждение за выбранную руку в качестве обратной связи после каждого испытания. Но я не знаю, как жестко закодировать это в моем эксперименте.
Посоветуйте, пожалуйста, как решить эти проблемы.
jsPsych.plugins['bandit-task'] = (function(){
var plugin = {};
plugin.info = {
name: 'bandit-task',
description: ''
parameters: {
stimuli: {
type: jsPsych.plugins.parameterType.IMAGE,
pretty_name: 'Stimuli',
default: undefined,
array: true,
description: 'The images to be displayed'
},
choice_left: {
type: jsPsych.plugins.parameterType.KEYCODE,
pretty_name: 'Left choice',
default: 'Z',
description: ''
},
choice_right: {
type: jsPsych.plugins.parameterType.KEYCODE,
pretty_name: 'Right choice',
default: 'M',
description:''
},
response_ends_trial: {
type: jsPsych.plugins.parameterType.BOOL,
pretty_name: 'Response ends trial',
default: true,
description: 'If true, trial will end when subject makes a response.'
},
rewardz: {
type: jsPsych.plugins.parameterType.INT,
pretty_name: 'rewardz',
default: 10,
description: ''
},
rewardm:{
type: jsPsych.plugins.parameterType.INT,
pretty_name: 'rewardm',
default: 20,
description:''
},
totalreward: {
type: jsPsych.plugins.parameterType.INT,
pretty_name: 'totalreward',
default: 0,
description: ''
},
}
}
plugin.trial = function(display_element, trial) {
var probability = 0;
var rewardz = trial.rewardz;
var rewardm = trial.rewardm;
var choice = trial.choices;
var totalreward = trial.totalreward;
display_element.innerHTML = '<img class="jspsych-bandit-task" src="'+trial.stimuli[0]+'"></img>';
// function to handle responses by the subject
var after_response = function(info) {
var zchoice = typeof trial.choice_left == 'string' ? jsPsych.pluginAPI.convertKeyCharacterToKeyCode(trial.choice_left) : trial.choice_left;
var mchoice = typeof trial.choice_right == 'string' ? jsPsych.pluginAPI.convertKeyCharacterToKeyCode(trial.choice_right) : trial.choice_right;
if (info.key == zchoice) {
probability = Math.floor(Math.random()*1000);
if (probability < 76 && rewardz < rewardm){
rewardz += 20;
totalreward += rewardz;
} else {
totalreward += rewardm;
}
}
if (info.key == mchoice) {
probability = Math.floor(Math.random()*1000);
if probability < 76 && rewardm < rewardz){
rewardm += 20;
totalreward += rewardm;
} else {
totalreward += rewardz;
}
}
var trial_data = {
"rewardz": rewardz,
"rewardm": rewardm,
"totalreward": totalreward,
"stimulus": JSON.stringify([trial.stimuli[0], trial.stimuli[1]]),
"key_press": info.key
};
jsPsych.finishTrial(trial_data);
}
// start the response listener
jsPsych.pluginAPI.getKeyboardResponse({
callback_function: after_response,
valid_responses: [trial.choice_left, trial.choice_right],
persist: false,
allow_held_key: false
});
};
return plugin;
})();