Кодирование нового плагина для бандитских задач с использованием jsPsych - PullRequest
0 голосов
/ 15 октября 2019

Я использую новый шаблон плагина 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;

})();
...