GJP_analysis_forpaper_3afterrevision.m 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. clear all
  2. clc
  3. close all
  4. % % %% loading the processed data files (takes a while, its big)
  5. load('2fcasts_members_questions_extracted_data.mat');
  6. team2start = 3;
  7. %% removing the values for which there is no brier (because of minimum requirements from previous script, like minimum amount of answers)
  8. for team=1:size(forecast_time2close_all,1)
  9. for question=1:491
  10. N = numel(group_briers_all {team,question});
  11. if numel(group_briers_all {team,question}) == 0
  12. group_forecasts_all{team,question} = [] ;
  13. group_members_all{team,question} = [] ;
  14. group_timestamps_all{team,question} = [] ;
  15. forecast_time2close_all{team,question} = [] ;
  16. end
  17. end
  18. end
  19. %% creating the variables for the data table
  20. for t=team2start:90
  21. team4table{1,t} = repmat(t, numel(cat(2,group_briers_all{t,:})) ,1);
  22. question4table = [];
  23. for q = 1:size(questions2analyze_all{t},1)
  24. question4table = vertcat(question4table, repmat(questions2analyze_all{t}(q), numel(group_briers_all{t,q}) ,1));
  25. end
  26. question4table_all{1,t} = question4table;
  27. member4table{1,t} = cat(1,group_members_all{t,:});
  28. fcast4table{1,t} = cat(1,group_forecasts_all{t,:});
  29. brier4table{1,t} = cat(2,group_briers_all{t,:})';
  30. timestamp4table{1,t} = cat(1,group_timestamps_all{t,:});
  31. time2close4table {1,t} = cat(2,forecast_time2close_all{t,:})';
  32. end
  33. %% creating the data table
  34. team = cat(1,team4table{1,:});
  35. question_code = cat(1,question4table_all{1,:});
  36. question_n = nan(numel(question_code),1);
  37. unique_questions = unique(question_code);
  38. for i = 1:numel(unique_questions)
  39. question_n (ismember(question_code, unique_questions{i} )) = i;
  40. end
  41. member = cat(1,member4table{1,:});
  42. fcast = cat(1,fcast4table{1,:});
  43. brier = cat(1,brier4table{1,:});
  44. timestamp = cat(1,timestamp4table{1,:});
  45. time2close = cat(1,time2close4table{1,:});
  46. Data = table(team,member,question_code,question_n,fcast,brier,timestamp,time2close);
  47. %%%%%% here i randomize the team vector, comment if i want real teams.
  48. Data(Data.team<team2start,:) = [];
  49. % Data.team = Data.team(randperm(length(Data.team)));
  50. % Data.team = Data.fcast(randperm(length(Data.team)));
  51. % Data.timestamp = Data.timestamp(randperm(length(Data.team)));
  52. % b = Data.team;
  53. %% calculating the actual mean brier and standard error for the team and each team member, and testing each tream member against the whole team.
  54. %
  55. for t=team2start:90
  56. membs = unique(Data.member(Data.team==t));
  57. membersperteam_n (t) = numel(unique(Data.member(Data.team==t)));
  58. team_avg_brier(t) = mean(Data.brier(Data.team==t));
  59. team_se_brier(t) = std(Data.brier(Data.team==t)) / sqrt(numel( Data.brier(Data.team==t) ));
  60. clear m_avg_brier m_se_brier Wilcoxon WilcoxonPerformance
  61. for m = 1:numel(membs)
  62. m_avg_brier(m) = mean(Data.brier(Data.team==t & Data.member == membs(m)));
  63. m_se_brier(m) = std(Data.brier(Data.team==t & Data.member == membs(m))) / sqrt(numel( Data.brier(Data.team==t & Data.member == membs(m)) ));
  64. member_avg_brier{t} = m_avg_brier;
  65. member_se_brier{t} = m_se_brier;
  66. Wilcoxon(m) = ranksum (Data.brier(Data.team==t),Data.brier(Data.team==t & Data.member == membs(m)));
  67. if Wilcoxon (m) <= 0.05/2479 && m_avg_brier(m) < team_avg_brier(t)
  68. WilcoxonPerformance(m) = -1; %%% if member is better than team
  69. elseif Wilcoxon (m) <= 0.05/2479 && m_avg_brier(m) > team_avg_brier(t)
  70. WilcoxonPerformance (m) = 1; %%% if member is worse than team
  71. elseif Wilcoxon (m) > 0.05/2479
  72. WilcoxonPerformance (m) = 0; %%% if member is same than team
  73. end
  74. end
  75. Wilcoxon_team_vs_members_pvalues{t} = Wilcoxon;
  76. Wilcoxon_team_vs_members_performance{t} = WilcoxonPerformance;
  77. end
  78. %%
  79. figure
  80. subplot 121
  81. plot (1:10,membersperteam_n(1:10),'s-')
  82. ylabel('# of members')
  83. xlabel('team')
  84. subplot 122
  85. plot (11:90,membersperteam_n(11:90),'s-')
  86. xlabel('team')
  87. %%
  88. figure; set(gcf,'color','w')
  89. semilogy (1:90,membersperteam_n,'.-', 'linewidth' , 2,'markersize',15)
  90. hold on
  91. plot ([1 90],[70 70], 'linewidth' , 2)
  92. xlim([0 91])
  93. set(gca,'XTick',[10:10: 90])
  94. xlim ([0.5 90.5])
  95. set(gca,'XTickLabel',{[10:10:90]})
  96. xlabel('Team')
  97. ylabel('# members')
  98. set(gca,'fontsize',20)
  99. %%
  100. for i = team2start:90
  101. t_perf = Wilcoxon_team_vs_members_performance{i};
  102. t_better(i) = sum (t_perf == -1) / numel(t_perf);
  103. t_worse(i) = sum (t_perf == 1)/ numel(t_perf);
  104. % t_better(i) = sum (t_perf == -1);
  105. % t_worse(i) = sum (t_perf == 1);
  106. t_diff(i) = t_better(i) + t_worse(i);
  107. end
  108. figure; set(gcf,'color','w');
  109. plot (1:90,t_better,1:90,t_worse)
  110. legend('Better than team average','Worse than team average','location','northeast')
  111. xlim([0 91])
  112. set(gca,'XTick',[10:10: 90])
  113. xlim ([0.5 90.5])
  114. set(gca,'XTickLabel',{[10:10:90]})
  115. xlabel('Team')
  116. ylabel('Proportion of team members')
  117. set(gca,'FontSize',20)
  118. sum(t_diff==0)
  119. %%
  120. concatenated_wilcoxonperfs = cat(2,Wilcoxon_team_vs_members_performance{1,:});
  121. disp([ 'Check that the N for the pvalue is = ' num2str(numel(cat(2,Wilcoxon_team_vs_members_performance{1,:})))] )
  122. Nbetter = sum(concatenated_wilcoxonperfs == -1);
  123. Nworse = sum(concatenated_wilcoxonperfs == 1);
  124. Nequal = sum(concatenated_wilcoxonperfs == 0);
  125. disp(['N members better than their team = ' num2str(Nbetter)])
  126. disp(['N members worse than their team = ' num2str(Nworse)])
  127. disp(['N members equal than their team = ' num2str(Nequal)])
  128. %% creating the new variables to analyze
  129. % confidence and absolute performance
  130. % confidence4table = nan(size(Data,1),1);
  131. abs_performance4table = nan(size(Data,1),1);
  132. confidence4table = abs(Data.fcast-0.5);
  133. abs_performance4table (Data.brier < 0.5) = 1;
  134. abs_performance4table (Data.brier > 0.5) = 0;
  135. abs_performance4table (Data.brier == 0.5) = -1;
  136. Data.confidence = confidence4table;
  137. Data.abs_performance = abs_performance4table;
  138. %% calculating correct outcomes for later. vector with 1 if q outcome 1, 0 if 0. Corresponding to the probability forecast.
  139. outcome_vector = nan(size(Data,1),1);
  140. outcome_vector(Data.fcast==0.5) = -1;
  141. outcome_vector(Data.abs_performance==1 & Data.fcast<0.5) = 0;
  142. outcome_vector(Data.abs_performance==0 & Data.fcast<0.5) = 1;
  143. outcome_vector(Data.abs_performance==0 & Data.fcast>0.5) = 0;
  144. outcome_vector(Data.abs_performance==1 & Data.fcast>0.5) = 1;
  145. Data.q_outcome = outcome_vector;
  146. %% descriptive histograms. Sanity check. should be histograms with -1 0 1 for performance and values between 0 and 0.5 for confidence
  147. figure; set(gcf,'color','w');
  148. subplot 121
  149. histogram (Data.abs_performance,'normalization','cdf')
  150. xlabel ('forecast absolute performance')
  151. ylabel ('Cumulative Probability')
  152. subplot 122
  153. histogram(Data.confidence,100,'normalization','pdf')
  154. xlabel ('Forecast Confidence')
  155. %% windowing confidence and absolute performance
  156. tw_start = 110:-10:30;
  157. tw_end = 80:-10:0;
  158. for tw = 1:numel(tw_start)
  159. clear time_index
  160. time_index = Data.time2close < tw_start(tw) & Data.time2close > tw_end(tw);
  161. abs_perf_window(tw) = mean(Data.abs_performance(time_index & Data.fcast ~= 0.5));
  162. confidence_mean_window(tw) = mean(Data.confidence(time_index));
  163. confidence_se_window(tw) = std(Data.confidence(time_index)) / sqrt(numel(Data.confidence(time_index)));
  164. brier_mean_window(tw) = mean(Data.brier(time_index));
  165. brier_se_window(tw) = std(Data.brier(time_index)) / sqrt(numel(Data.brier(time_index)));
  166. end
  167. %%
  168. figure; set(gcf,'color','w');
  169. subplot 211
  170. plot(1:9,abs_perf_window)
  171. set(gca,'XTick',[1:9])
  172. xlim ([0.5 9.5])
  173. set(gca,'XTickLabel',{'110-80','100-70','90-60','80-50','70-40','60-30','50-20','40-10','30-0'})
  174. xlabel('Interval of days before question closure')
  175. ylabel('Proportion of correct absolute forecasts')
  176. subplot 212
  177. errorbar(1:9,confidence_mean_window,confidence_se_window)
  178. ylim([0.28 0.4])
  179. xlim ([0.5 9.5])
  180. set(gca,'XTick',[1:9])
  181. set(gca,'XTickLabel',{'110-80','100-70','90-60','80-50','70-40','60-30','50-20','40-10','30-0'})
  182. xlabel('Interval of days before question closure')
  183. ylabel('Confidence Score')
  184. % subplot 313
  185. % errorbar(1:9,brier_mean_window,brier_se_window)
  186. % xlim ([0.5 9.5])
  187. % set(gca,'XTick',[1:9])
  188. % set(gca,'XTickLabel',{'110-80','100-70','90-60','80-50','70-40','60-30','50-20','40-10','30-0'})
  189. % xlabel('Interval of days before question closure')
  190. % ylabel('Brier Score')
  191. %% calculating the two performances per team per window
  192. min_answers = 5;
  193. for tw = 1:numel(tw_start)
  194. time_index = Data.time2close < tw_start(tw) & Data.time2close > tw_end(tw);
  195. Performance1_window_raw = nan(90,382);
  196. Performance2_window_raw = nan(90,382);
  197. Consensus_fcast_window_raw = nan(90,382);
  198. % outcomes=nan(382,1);
  199. for t = team2start:90
  200. for q = 1:max(Data.question_n)
  201. clear values valuesP1 tans_val
  202. values = Data.brier(Data.team == t & Data.question_n == q & time_index);
  203. valuesP1 = Data.fcast(Data.team == t & Data.question_n == q & time_index);
  204. if numel(values) >= min_answers
  205. Performance2_window_raw(t,q) = nanmean(values);
  206. outcome4briercalc = max( unique(Data.q_outcome(Data.question_n==q)) );
  207. Performance1_window_raw(t,q) = BrierScoreCalc(nanmean(valuesP1),outcome4briercalc);
  208. Consensus_fcast_window_raw(t,q) = nanmean(valuesP1);
  209. end
  210. % outcomes(q) = outcome4briercalc;
  211. end
  212. end
  213. %%%performances by team to plot one line per team instead of the grand
  214. %%%average
  215. Perf1_groupmean_tw (:,tw) = nanmean(Performance1_window_raw,2);
  216. Perf2_groupmean_tw (:,tw) = nanmean(Performance2_window_raw,2);
  217. Perf1_questionmean_tw (:,tw) = nanmean(Performance1_window_raw,1);
  218. Perf2_questionmean_tw (:,tw) = nanmean(Performance2_window_raw,1);
  219. Consensus_groupmean_tw (:,tw) = nanmean(Consensus_fcast_window_raw,2);
  220. Consensus_questionmean_tw (:,tw) = nanmean(Consensus_fcast_window_raw,1);
  221. %%%%%
  222. Performance1_window_mean (tw) = nanmean(Performance1_window_raw(:));
  223. Performance1_window_se (tw) = nanstd(Performance1_window_raw(:)) / sqrt(numel(Performance1_window_raw(~isnan(Performance1_window_raw))));
  224. Performance2_window_mean (tw) = nanmean(Performance2_window_raw(:));
  225. Performance2_window_se (tw) = nanstd(Performance2_window_raw(:)) / sqrt(numel(Performance2_window_raw(~isnan(Performance2_window_raw))));
  226. Performance2_window_mean (tw) = nanmean(Performance2_window_raw(:));
  227. Performance2_window_se (tw) = nanstd(Performance2_window_raw(:)) / sqrt(numel(Performance2_window_raw(~isnan(Performance2_window_raw))));
  228. clear Performance_diff Performance_sum MI
  229. Performance_diff = Performance2_window_raw - Performance1_window_raw;
  230. Performance_sum = Performance2_window_raw + Performance1_window_raw;
  231. Perf2_KW {tw} = Performance2_window_raw(:);
  232. Perf1_KW {tw} = Performance1_window_raw(:);
  233. MI = Performance_diff./Performance_sum;
  234. MI_mean(tw) = nanmean(MI(:));
  235. MI_se(tw) = nanstd(MI(:)) / sqrt( sum(sum(~isnan(MI))) );
  236. % Consensus_sum = Consensus_fcast_window_raw
  237. end
  238. %% one more level of aggregation
  239. for q = 1:size(Consensus_questionmean_tw,1)
  240. for tw = 1:9
  241. if isnan(Consensus_questionmean_tw (q,tw))
  242. Consensus_Brier_tw (q,tw) = nan;
  243. elseif ~isnan(Consensus_questionmean_tw (q,tw))
  244. Consensus_Brier_tw (q,tw) = BrierScoreCalc(Consensus_questionmean_tw (q,tw), max( unique(Data.q_outcome(Data.question_n==q))));
  245. end
  246. Nvalues_for_se(tw) = sum (~isnan(Consensus_questionmean_tw(:,tw)));
  247. end
  248. end
  249. Consensus_mean_2aggregation_tw = nanmean(Consensus_Brier_tw,1);
  250. Consensus_se_2aggregation_tw = nanstd(Consensus_Brier_tw,1) ./ sqrt(Nvalues_for_se);
  251. %% statistical testing
  252. for window = 1:9
  253. mat_testing = nan(90*382,3);
  254. mat_testing(:,1) = Perf2_KW{window}; %% blue
  255. mat_testing(:,2) = Perf1_KW{window}; %% red
  256. index_numel = numel(Consensus_Brier_tw(:,window));
  257. mat_testing(1:index_numel,3) = Consensus_Brier_tw(:,window); %% yellow
  258. % pKW (window) = kruskalwallis(mat_testing);
  259. [pKW(window),tbl{window},stats{window}] = kruskalwallis(mat_testing,[],'off')
  260. end
  261. %%% multiple comparisons
  262. multiple_comparisons = nan(3,11);
  263. multiple_comparisons(1,10:11)= [1 2];
  264. multiple_comparisons(2,10:11)= [2 3];
  265. multiple_comparisons(3,10:11)= [1 3];
  266. for window = 1:9
  267. if pKW(window)*9 < 0.05
  268. multiple_comparisons(1,window) = 3*ranksum (Perf2_KW{window},Perf1_KW{window});
  269. multiple_comparisons(2,window) = 3*ranksum (Consensus_Brier_tw(:,window),Perf1_KW{window});
  270. multiple_comparisons(3,window) = 3*ranksum (Perf2_KW{window},Consensus_Brier_tw(:,window));
  271. end
  272. multiple_comparisons_dunn{window} = multcompare(stats{window},'CType','dunn-sidak');
  273. end
  274. %% %% correcting the KW, multiplying by 9
  275. % c = multcompare(stats{5})
  276. %% GLM preparation
  277. %%%% preparing the data
  278. clear b_curve r_curve y_curve
  279. b_curve = Perf2_KW;
  280. r_curve = Perf1_KW;
  281. for i = 1:9
  282. indb = ~isnan(Perf2_KW{i});
  283. b_curve{i} = Perf2_KW{i}(indb);
  284. indr = ~isnan(Perf1_KW{i});
  285. r_curve{i} = Perf1_KW{i}(indr);
  286. indy = ~isnan(Consensus_Brier_tw(:,i));
  287. y_curve{i} = Consensus_Brier_tw(indy,i);
  288. clear indr indb indy
  289. b_timebins{i} = i*ones(numel(b_curve{i}),1);
  290. r_timebins{i} = i*ones(numel(r_curve{i}),1);
  291. y_timebins{i} = i*ones(numel(y_curve{i}),1);
  292. end
  293. %%%% now concatenating and generating the long vector of data and the
  294. %%%% columns for conditions and time
  295. b_cat = vertcat(b_curve{:});
  296. r_cat = vertcat(r_curve{:});
  297. y_cat = vertcat(y_curve{:});
  298. briers4glm = vertcat(b_cat,r_cat,y_cat);
  299. condition4glm(1:numel(b_cat),1) = 1;
  300. condition4glm((1+numel(b_cat)):(numel(b_cat)+numel(r_cat)),1) = 2;
  301. condition4glm((1+numel(b_cat)+numel(r_cat)):(numel(b_cat)+numel(r_cat)+numel(y_cat)),1) = 3;
  302. timebin4glm = vertcat(b_timebins{:},r_timebins{:},y_timebins{:});
  303. %% running the glm
  304. Accuracy= briers4glm+eps; % Accuracy
  305. Timebin = timebin4glm; % stimuls difficulty
  306. Condition = condition4glm; % diffrent conditions
  307. figure;set(gcf,'color','w')
  308. subplot 121
  309. boxplot (Accuracy,Condition)
  310. subplot 122
  311. boxplot (Accuracy,Timebin)
  312. IntAccTime = Accuracy .* Timebin;
  313. IntCondTime = Condition .* Timebin;
  314. %%% you would make a table for these arrays
  315. MyTable = table(Timebin,Accuracy,Condition,IntAccTime,IntCondTime);
  316. MyTable = unique(MyTable);
  317. %%% then, you would run the functcion
  318. glme = fitglme(MyTable,...
  319. 'Accuracy ~ 1+Condition + Timebin',...
  320. 'Distribution','inverse gaussian','FitMethod','MPL',...
  321. 'DummyVarCoding','effects');
  322. % %%% then, you would run the functcion
  323. % glme = fitglme(MyTable,...
  324. % 'Accuracy ~ 1+Condition + Timebin',...
  325. % 'Distribution','inverse gaussian','FitMethod','MPL',...
  326. % 'DummyVarCoding','effects');
  327. %%% and creat the table for the results
  328. Res_ACC = [glme.Coefficients.Estimate(2:end),glme.Coefficients.SE(2:end),...
  329. glme.Coefficients.Lower(2:end),glme.Coefficients.Upper(2:end),...
  330. glme.Coefficients.tStat(2:end),glme.Coefficients.pValue(2:end)];
  331. %% plotting the medians
  332. nBS=10000;
  333. quantileBS = 0.95;
  334. for i=1:9
  335. medians2plot(1,i) = median(b_curve{i});
  336. medians2plot(2,i) = median(r_curve{i});
  337. medians2plot(3,i) = median(y_curve{i});
  338. means2plot(1,i) = mean(b_curve{i});
  339. means2plot(2,i) = mean(r_curve{i});
  340. means2plot(3,i) = mean(y_curve{i});
  341. CIb(:,i) = median_ci(b_curve{i},nBS,quantileBS);
  342. CIr(:,i) = median_ci(r_curve{i},nBS,quantileBS);
  343. CIy(:,i) = median_ci(y_curve{i},nBS,quantileBS);
  344. end
  345. %% plotting performance across time
  346. figure;set(gcf,'color','w')
  347. errorbar(-97:10:-17,medians2plot(1,:),abs( CIb(1,:)-CIb(2,:)),abs(CIb(3,:)-CIb(2,:)),'linewidth',1.5)
  348. hold on
  349. errorbar(-95:10:-15,medians2plot(2,:),abs( CIr(1,:)-CIr(2,:)),abs(CIr(3,:)-CIr(2,:)),'linewidth',1.5)
  350. errorbar(-93:10:-13,medians2plot(3,:),abs( CIy(1,:)-CIy(2,:)),abs(CIy(3,:)-CIy(2,:)),'linewidth',1.5)
  351. xlim([-100 -10])
  352. set(gca,'XTick',[-95:10:-15])
  353. xlabel('Days before question closure')
  354. ylabel('Brier Score')
  355. legend ({'Individual';'1st order compromise';'2nd order compromise'},'location','southwest')
  356. set(gca,'FontSize',15)
  357. %% comparison of specific time windows within a curve.
  358. ranksum(b_curve{1},b_curve{5})
  359. ranksum(r_curve{1},r_curve{5})
  360. ranksum(y_curve{1},y_curve{5})
  361. %% calculating confidence and absolute performance per time window and per curve of aggregation level
  362. for tw = 1:9
  363. %%% calculate absolute correct
  364. b_prop_correct(tw) = 100 * sum(b_curve{tw}<0.5) / numel(b_curve{tw});
  365. r_prop_correct(tw) = 100 * sum(r_curve{tw}<0.5) / numel(r_curve{tw});
  366. y_prop_correct(tw) = 100 * sum(y_curve{tw}<0.5) / numel(y_curve{tw});
  367. %%% calculate absolute confidence
  368. for i = 1:numel(b_curve{tw})
  369. b_conf_temp(i) = 100 * abs ( Inverse_BrierScoreCalc(b_curve{tw}(i),1) - 0.5) / 0.5;
  370. end
  371. b_confidence {tw} = b_conf_temp;
  372. b_confidence_median(tw) = mean(b_confidence{tw});
  373. b_confidence_SE(tw) = std(b_confidence{tw}) / sqrt(numel(b_confidence{tw}));
  374. for i = 1:numel(r_curve{tw})
  375. r_conf_temp(i) = 100 * abs ( Inverse_BrierScoreCalc(r_curve{tw}(i),1) - 0.5) / 0.5;
  376. end
  377. r_confidence {tw} = r_conf_temp;
  378. r_confidence_median(tw) = mean(r_confidence{tw});
  379. r_confidence_SE(tw) = std(r_confidence{tw}) / sqrt(numel(r_confidence{tw}));
  380. for i = 1:numel(y_curve{tw})
  381. y_conf_temp(i) = 100 * abs ( Inverse_BrierScoreCalc(y_curve{tw}(i),1) - 0.5)/ 0.5;
  382. end
  383. y_confidence {tw} = y_conf_temp;
  384. y_confidence_median(tw) = mean(y_confidence{tw});
  385. y_confidence_SE(tw) = std(y_confidence{tw}) / sqrt(numel(y_confidence{tw}));
  386. clear b_confiidence_temp r_confiidence_temp y_confiidence_temp
  387. end
  388. %%
  389. figure;set(gcf,'color','w')
  390. subplot 211
  391. % plot(-95:10:-15,b_confidence_median)
  392. % hold on
  393. % plot(-95:10:-15,r_confidence_median)
  394. % plot(-95:10:-15,y_confidence_median)
  395. errorbar(-97:10:-17,b_confidence_median,b_confidence_SE,'linewidth',1.3)
  396. hold on
  397. errorbar(-95:10:-15,r_confidence_median,r_confidence_SE,'linewidth',1.3)
  398. errorbar(-93:10:-13,y_confidence_median,y_confidence_SE,'linewidth',1.3)
  399. xlim([-100 -10])
  400. set(gca,'XTick',[-95:10:-15])
  401. % xlabel('Interval of days before question closure')
  402. ylabel('% of max confidence')
  403. % legend ({'Average of individual Briers';'Team Consensus 1st order';'Team Consensus 2nd order'},'location','northwest')
  404. set(gca,'FontSize',10)
  405. subplot 212
  406. plot(-97:10:-17,b_prop_correct,'linewidth',1.3)
  407. hold on
  408. plot(-95:10:-15,r_prop_correct,'linewidth',1.3)
  409. plot(-93:10:-13,y_prop_correct,'linewidth',1.3)
  410. xlim([-100 -10])
  411. set(gca,'XTick',[-95:10:-15])
  412. xlabel('Interval of days before question closure')
  413. ylabel('% of Correct Forecasts')
  414. legend ({'Average of individual Briers';'Team Consensus 1st order';'Team Consensus 2nd order'},'location','northwest')
  415. set(gca,'FontSize',10)
  416. ylim([70 100])
  417. %% figure; set(gcf,'color','w'); OF MEAN (instead of median) PERFORMANCES IN TIME WINDOWS
  418. figure; set(gcf,'color','w');
  419. errorbar (1:9,Performance2_window_mean,Performance2_window_se,'linewidth',3)
  420. hold on
  421. errorbar (1:9,Performance1_window_mean,Performance1_window_se,'linewidth',3)
  422. errorbar (1:9,Consensus_mean_2aggregation_tw,Consensus_se_2aggregation_tw,'linewidth',3)
  423. xlim ([0.5 9.5])
  424. ylim([0.05 0.4])
  425. set(gca,'XTick',[1:9])
  426. set(gca,'XTickLabel',{'110-80','100-70','90-60','80-50','70-40','60-30','50-20','40-10','30-0'})
  427. xlabel('Interval of days before question closure')
  428. ylabel('Brier Score')
  429. legend ({'Average of individual Briers';'Team Consensus 1st order';'Team Consensus 2nd order'},'location','southwest')
  430. set(gca,'FontSize',15)
  431. %% same as above but instead of average, a line per question, averaging only across teams, just a sanity check
  432. figure; set(gcf,'color','w');
  433. for g = 11:90
  434. subplot 121
  435. plot (1:9,Perf1_groupmean_tw (g,:),'b')
  436. hold on
  437. subplot 122
  438. plot (1:9,Perf2_groupmean_tw (g,:) ,'r')
  439. hold on
  440. end
  441. for s = 1:2
  442. subplot(1,2,s)
  443. set(gca,'XTick',[1:9])
  444. set(gca,'XTickLabel',[95:-10:15])
  445. xlabel('Interval of days before question closure')
  446. ylabel('Brier Score')
  447. if s==1
  448. legend ({'Brier of average forecast'})
  449. elseif s==2
  450. legend ( 'Average of individual Briers')
  451. end
  452. title('one line per team')
  453. set(gca,'FontSize',15)
  454. end
  455. figure; set(gcf,'color','w');
  456. for g = 1:382
  457. plot (1:9,Perf1_questionmean_tw (g,:),'b')
  458. hold on
  459. plot (1:9,Perf2_questionmean_tw (g,:) ,'r')
  460. end
  461. set(gca,'XTick',[1:9])
  462. % set(gca,'XTickLabel',{'110-80','100-70','90-60','80-50','70-40','60-30','50-20','40-10','30-0'})
  463. set(gca,'XTickLabel',[95:-10:15])
  464. xlabel('Interval of days before question closure')
  465. ylabel('Brier Score')
  466. legend ({'Brier of average forecast';'Average of individual Briers'})
  467. title('one line per question')
  468. set(gca,'FontSize',15)
  469. %% plot modulation index
  470. figure; set(gcf,'color','w');
  471. errorbar (1:9,MI_mean,MI_se,'linewidth',3)
  472. xlim ([0.5 9.5])
  473. set(gca,'XTick',[1:9])
  474. set(gca,'XTickLabel',{'110-80','100-70','90-60','80-50','70-40','60-30','50-20','40-10','30-0'})
  475. xlabel('Interval of days before question closure')
  476. ylabel('Modulation Index')
  477. % legend ({'Brier of average forecast';'Average of individual Briers'})
  478. set(gca,'FontSize',15)
  479. %%
  480. Performance_diff = Performance2_window_raw - Performance1_window_raw;
  481. Performance_sum = Performance2_window_raw + Performance1_window_raw;
  482. MI = Performance_diff./Performance_sum;
  483. nanmean(MI(:))
  484. %% saving the data table
  485. % writetable(Data,'D:\Ferreiro\BahramiLab\GoodJudgement\Processed_data\Data4publication.txt','Delimiter',',')
  486. % save('D:\Ferreiro\BahramiLab\GoodJudgement\Processed_data\Data4publication.mat', 'Data')