|
| 1 | +data { |
| 2 | + |
| 3 | + //General fixed parameters for the experiment/models |
| 4 | + int<lower = 1> Nsubjects; |
| 5 | + int<lower = 1> Nblocks; |
| 6 | + int<lower = 1> Ntrials; |
| 7 | + int<lower = 1> Ntrials_per_subject[Nsubjects]; |
| 8 | + int<lower = 4> Narms; |
| 9 | + int<lower = 2> Nraffle; |
| 10 | + int<lower = 0> fold[Nsubjects,Ntrials]; |
| 11 | + real testfold; |
| 12 | + |
| 13 | + //Behavioral data: |
| 14 | + int<lower = 0> choice[Nsubjects,Ntrials]; |
| 15 | + int<lower = 0> unchosen[Nsubjects,Ntrials]; |
| 16 | + int<lower = 0> reward[Nsubjects,Ntrials]; |
| 17 | + int<lower = 0> offer1[Nsubjects,Ntrials]; |
| 18 | + int<lower = 0> offer2[Nsubjects,Ntrials]; |
| 19 | + int<lower = 0> selected_offer[Nsubjects,Ntrials]; |
| 20 | + int<lower = 0> first_trial_in_block[Nsubjects,Ntrials]; |
| 21 | + |
| 22 | + |
| 23 | +} |
| 24 | + |
| 25 | + |
| 26 | +transformed data{ |
| 27 | + int<lower = 1> Nparameters=3; |
| 28 | + vector[Narms] Qvalue_initial; |
| 29 | + Qvalue_initial = rep_vector(0.5, Narms); |
| 30 | +} |
| 31 | + |
| 32 | + |
| 33 | + |
| 34 | + |
| 35 | +parameters { |
| 36 | + //population level parameters |
| 37 | + vector [Nparameters] population_locations; |
| 38 | + vector<lower=0>[Nparameters] population_scales; |
| 39 | + |
| 40 | + //individuals level |
| 41 | + vector[Nsubjects] alpha_confirmatory_random_effect; |
| 42 | + vector[Nsubjects] alpha_disconfirmatory_random_effect; |
| 43 | + vector[Nsubjects] beta_random_effect; |
| 44 | +} |
| 45 | + |
| 46 | + |
| 47 | +transformed parameters { |
| 48 | + |
| 49 | + vector<lower=0, upper=1>[Nsubjects] alpha_confirmatory; |
| 50 | + vector<lower=0, upper=1>[Nsubjects] alpha_disconfirmatory; |
| 51 | + vector [Nsubjects] beta; |
| 52 | + matrix [Ntrials,Nsubjects] p_ch_action; |
| 53 | + matrix [Ntrials,Nsubjects] Qdiff_external; |
| 54 | + matrix [Ntrials,Nsubjects] Qval1_external; |
| 55 | + matrix [Ntrials,Nsubjects] Qval2_external; |
| 56 | + matrix [Ntrials,Nsubjects] Qval3_external; |
| 57 | + matrix [Ntrials,Nsubjects] Qval4_external; |
| 58 | + matrix [Ntrials,Nsubjects] PE_external; |
| 59 | + |
| 60 | + |
| 61 | + |
| 62 | + //RL |
| 63 | + for (subject in 1:Nsubjects) { |
| 64 | + //internal variabels |
| 65 | + real Qdiff; |
| 66 | + real PE; |
| 67 | + real Qval[Narms]; |
| 68 | + |
| 69 | + //set indvidual parameters |
| 70 | + alpha_confirmatory[subject] = inv_logit(population_locations[1] + population_scales[1] * alpha_confirmatory_random_effect[subject]); |
| 71 | + alpha_disconfirmatory[subject] = inv_logit(population_locations[2] + population_scales[2] * alpha_disconfirmatory_random_effect[subject]); |
| 72 | + beta[subject] = (population_locations[3] + population_scales[3] * beta_random_effect [subject]); |
| 73 | + |
| 74 | + //likelihood estimation |
| 75 | + for (trial in 1:Ntrials_per_subject[subject]){ |
| 76 | + if(fold[subject,trial]!=testfold){ |
| 77 | + |
| 78 | + //reset Qvalues (first trial only) |
| 79 | + if (first_trial_in_block[subject,trial] == 1) { |
| 80 | + Qval = rep_array(0.5, Narms); |
| 81 | + } |
| 82 | + |
| 83 | + //calculate probability for each action |
| 84 | + Qdiff = Qval[offer2[subject,trial]]- Qval[offer1[subject,trial]]; |
| 85 | + |
| 86 | + p_ch_action[trial,subject] = inv_logit(beta[subject]*Qdiff); |
| 87 | + |
| 88 | + //update Qvalues |
| 89 | + if(reward[subject,trial]==1){ |
| 90 | + Qval[choice[subject,trial]] = Qval[choice[subject,trial]]+alpha_confirmatory[subject]*(reward[subject,trial] - Qval[choice[subject,trial]]); |
| 91 | + Qval[unchosen[subject,trial]] = Qval[unchosen[subject,trial]]+alpha_confirmatory[subject]*((1-reward[subject,trial]) - Qval[unchosen[subject,trial]]); |
| 92 | + } |
| 93 | + else{ |
| 94 | + Qval[choice[subject,trial]] = Qval[choice[subject,trial]]+alpha_disconfirmatory[subject]*(reward[subject,trial] - Qval[choice[subject,trial]]); |
| 95 | + Qval[unchosen[subject,trial]] = Qval[unchosen[subject,trial]]+alpha_disconfirmatory[subject]*((1-reward[subject,trial]) - Qval[unchosen[subject,trial]]); |
| 96 | + } |
| 97 | + //appened to external variabels |
| 98 | + Qdiff_external[trial,subject] = Qdiff; |
| 99 | + Qval1_external[trial,subject] = Qval[1]; |
| 100 | + Qval2_external[trial,subject] = Qval[2]; |
| 101 | + Qval3_external[trial,subject] = Qval[3]; |
| 102 | + Qval4_external[trial,subject] = Qval[4]; |
| 103 | + PE_external[trial,subject] = PE; |
| 104 | + } |
| 105 | + } |
| 106 | + |
| 107 | + } |
| 108 | + |
| 109 | +} |
| 110 | + |
| 111 | + |
| 112 | +model { |
| 113 | + |
| 114 | + // population level |
| 115 | + population_locations ~ normal(0,2); |
| 116 | + population_scales ~ cauchy(0,2); |
| 117 | + |
| 118 | + // indvidual level |
| 119 | + alpha_confirmatory_random_effect ~ std_normal(); |
| 120 | + alpha_disconfirmatory_random_effect ~ std_normal(); |
| 121 | + beta_random_effect ~ std_normal(); |
| 122 | + |
| 123 | + |
| 124 | + for (subject in 1:Nsubjects){ |
| 125 | + for (trial in 1:Ntrials_per_subject[subject]){ |
| 126 | + if(fold[subject,trial]!=testfold){ //fit parameters only for training set |
| 127 | + target+= bernoulli_logit_lpmf(selected_offer[subject,trial] | beta[subject] * Qdiff_external[trial,subject]); |
| 128 | + } |
| 129 | + } |
| 130 | + } |
| 131 | +} |
| 132 | + |
| 133 | +generated quantities { |
| 134 | + |
| 135 | + matrix[Ntrials,Nsubjects] log_lik; |
| 136 | + vector[Narms] Qval; |
| 137 | + vector[Nraffle] Qoffer; |
| 138 | + real PE; |
| 139 | +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 140 | +//Likelihood function per subject per trial |
| 141 | +log_lik=rep_matrix(0,Ntrials,Nsubjects); |
| 142 | + for (subject in 1:Nsubjects) { |
| 143 | + |
| 144 | + for (trial in 1:Ntrials_per_subject[subject]){ |
| 145 | + |
| 146 | + if(fold[subject,trial] == testfold) { |
| 147 | + |
| 148 | + //reset Qvalues (first trial only) |
| 149 | + if (first_trial_in_block[subject,trial] == 1) { |
| 150 | + Qval =rep_vector(0.5, Narms); |
| 151 | + } |
| 152 | + //offer values |
| 153 | + Qoffer[1]=Qval[offer1[subject,trial]]; |
| 154 | + Qoffer[2]=Qval[offer2[subject,trial]]; |
| 155 | + log_lik[trial,subject] = bernoulli_logit_lpmf(selected_offer[subject, trial] | beta[subject] * Qoffer); |
| 156 | + |
| 157 | + |
| 158 | + |
| 159 | + //update Qvalues |
| 160 | + if(reward[subject,trial]==1){ |
| 161 | + Qval[choice[subject,trial]] = Qval[choice[subject,trial]]+alpha_confirmatory[subject]*(reward[subject,trial] - Qval[choice[subject,trial]]); |
| 162 | + Qval[unchosen[subject,trial]] = Qval[unchosen[subject,trial]]+alpha_confirmatory[subject]*((1-reward[subject,trial]) - Qval[unchosen[subject,trial]]); |
| 163 | + } |
| 164 | + else{ |
| 165 | + Qval[choice[subject,trial]] = Qval[choice[subject,trial]]+alpha_disconfirmatory[subject]*(reward[subject,trial] - Qval[choice[subject,trial]]); |
| 166 | + Qval[unchosen[subject,trial]] = Qval[unchosen[subject,trial]]+alpha_disconfirmatory[subject]*((1-reward[subject,trial]) - Qval[unchosen[subject,trial]]); |
| 167 | + } |
| 168 | + |
| 169 | + |
| 170 | + } |
| 171 | + } |
| 172 | + } |
| 173 | +} |
0 commit comments