data_fit_paper.m 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. % fit model to data
  2. load('rep_randwalk.mat')
  3. nsub=max(allArray.NSub);
  4. secondhalf=false;
  5. if secondhalf
  6. idx=allArray.NT>600 | (allArray.NT>200 & allArray.NT<400);
  7. %idx=~idx; % take first instead of second half
  8. idx=allArray.RandLevel==2 | idx; % take half, but only for random walk
  9. allArray=allArray(idx,:);
  10. end
  11. % round physical presented duration (100 ms)
  12. allArray.duration = round(allArray.dur *10)/10;
  13. durs=unique(allArray.duration(allArray.NSub==1));
  14. allArray.sim=zeros(size(allArray.duration));
  15. % take only valid data
  16. % allArray = allArray(allArray.valid==1,:);
  17. % alternative, leaves temporal structure
  18. allArray.repDur(allArray.valid==0)=NaN;
  19. cond={'random walk','randomized'};
  20. parfit=zeros(nsub,2,1);
  21. linfit=zeros(nsub,2,2);
  22. simfit=zeros(nsub,2,2);
  23. tic
  24. for j=2:-1:1
  25. figure
  26. for i=1:nsub
  27. idx=(allArray.NSub==i) & (allArray.RandLevel==j);
  28. % original model, just 1 parameter
  29. [px,ci,resnorm,simres]=fitdata1pv([allArray.dur(idx) allArray.repDur(idx)]);
  30. parfit(i,j,1)=px;
  31. err=simres-allArray.repDur(idx);
  32. idn=isfinite(err);
  33. stid=allArray.dur(idx);
  34. repd=allArray.repDur(idx);
  35. linfit(i,j,:)=polyfit(stid(idn),repd(idn),1);
  36. if j==1
  37. % predict response from parameter fitted for other condition
  38. [~, ~, ~, simres, ~]=kmodel1pv(parfit(i,3-j,1),[allArray.dur(idx) allArray.repDur(idx)]);
  39. else
  40. % simulate response with fitted parameters for this condition
  41. [~, ~, ~, simres, ~]=kmodel1pv(parfit(i,j,1),[allArray.dur(idx) allArray.repDur(idx)]);
  42. end
  43. allArray.sim(idx)=simres;
  44. simfit(i,j,:)=polyfit(stid(idn),simres(idn),1);
  45. subplot(4,4,i)
  46. prcterr=(allArray.repDur(idx)-allArray.dur(idx))./allArray.dur(idx)*100;
  47. prcterrsim=(simres-allArray.dur(idx))./allArray.dur(idx)*100;
  48. plot(allArray.dur(idx),allArray.repDur(idx),'.',allArray.dur(idx),simres,'.')
  49. ylim([0 3])
  50. %plot(allArray.dur(idx),prcterr,'.',allArray.dur(idx),prcterrsim,'.')
  51. %ylim([-50 50])
  52. meanprct=grpstats(prcterr,allArray.duration(idx));
  53. [meanrepdur,stdrepdur]=grpstats(allArray.repDur(idx),allArray.duration(idx),{'mean','std'});
  54. durs=unique(allArray.duration(idx));
  55. meanprctsim=grpstats(prcterrsim,allArray.duration(idx));
  56. [meanrepsim,stdrepsim]=grpstats(simres,allArray.duration(idx),{'mean','std'});
  57. end
  58. end
  59. toc
  60. %%
  61. i=nsub;
  62. % i=5;
  63. % i=8;
  64. figure('name',['data from subject ' int2str(i)])
  65. clr=colororder;
  66. % randomized
  67. j=2;
  68. idx=(allArray.NSub==i) & (allArray.RandLevel==j);
  69. subplot(1,2,1)
  70. hold on
  71. plot([0 2],linfit(i,j,1)*[0 2]+linfit(i,j,2),'Color',clr(1,:),'linewidth',2)
  72. plot([0 2],simfit(i,j,1)*[0 2]+simfit(i,j,2),'--','Color',clr(2,:),'linewidth',2)
  73. plot(allArray.dur(idx),allArray.repDur(idx),'.','Color',clr(1,:))
  74. plot(allArray.dur(idx),allArray.sim(idx),'.','Color',clr(2,:))
  75. plot([0 3],[0 3],'--k')
  76. hold off
  77. xlim([0 2])
  78. ylim([0 2.5])
  79. xlabel('stimulus duration (s)')
  80. ylabel('reproduced duration (s)')
  81. legend('experiment','model simulation')
  82. title('randomized condition')
  83. set(gca,'Fontsize',16)
  84. text('Parent',gca,'FontSize',36,'String','A','Position',[-0.4 2.5 0]);
  85. % calculate error (response-actual)
  86. errA=allArray.repDur(idx)-allArray.dur(idx);
  87. presdurA=allArray.dur(idx);
  88. simerrA=allArray.sim(idx)-allArray.dur(idx);
  89. % now for random walk
  90. j=1;
  91. idx=(allArray.NSub==i) & (allArray.RandLevel==j);
  92. subplot(1,2,2)
  93. hold on
  94. plot([0 2],linfit(i,j,1)*[0 2]+linfit(i,j,2),'Color',clr(1,:),'linewidth',2)
  95. plot([0 2],simfit(i,j,1)*[0 2]+simfit(i,j,2),'--','Color',clr(2,:),'linewidth',2)
  96. plot(allArray.dur(idx),allArray.repDur(idx),'.','Color',clr(1,:))
  97. plot(allArray.dur(idx),allArray.sim(idx),'.','Color',clr(2,:))
  98. plot([0 3],[0 3],'--k')
  99. hold off
  100. xlim([0 2])
  101. ylim([0 2.5])
  102. xlabel('stimulus duration (s)')
  103. ylabel('reproduced duration (s)')
  104. legend('experiment','model prediction')
  105. title('random walk condition')
  106. set(gca,'Fontsize',16)
  107. text('Parent',gca,'FontSize',36,'String','B','Position',[-0.4 2.5 0]);
  108. set(gcf,'Position',[560 556 836 392])
  109. % calculate error (response-actual)
  110. errB=allArray.repDur(idx)-allArray.dur(idx);
  111. presdurB=allArray.dur(idx);
  112. simerrB=allArray.sim(idx)-allArray.dur(idx);
  113. %%
  114. figure('name',['data from subject ' int2str(i) ' over trial'])
  115. subplot(2,1,1)
  116. j=2;
  117. idx=(allArray.NSub==i) & (allArray.RandLevel==j);
  118. plot([allArray.dur(idx),allArray.repDur(idx),allArray.sim(idx)],'.-','Markersize',10)
  119. xlabel('trial')
  120. ylabel('duration (s)')
  121. legend('stimulus','reproduction','simulation')
  122. set(gca,'Fontsize',16)
  123. title('randomized')
  124. subplot(2,1,2)
  125. j=1;
  126. idx=(allArray.NSub==i) & (allArray.RandLevel==j);
  127. plot([allArray.dur(idx),allArray.repDur(idx),allArray.sim(idx)],'.-','Markersize',10)
  128. xlabel('trial')
  129. ylabel('duration (s)')
  130. legend('stimulus','reproduction','prediction')
  131. set(gca,'Fontsize',16)
  132. title('random walk')
  133. %%
  134. allArray.repError = allArray.repDur - allArray.dur;
  135. allArray.simError = allArray.sim - allArray.dur;
  136. avgdata = grpstats(allArray, {'NSub','RandLevel','duration'},{'mean','sem'}, 'DataVars','repError');
  137. avgdatadur = grpstats(allArray, {'NSub','RandLevel','duration'},{'mean','sem'}, 'DataVars','repDur');
  138. avgsim = grpstats(allArray, {'NSub','RandLevel','duration'},{'mean','sem'}, 'DataVars','simError');
  139. avgsimdur = grpstats(allArray, {'NSub','RandLevel','duration'},{'mean','sem'}, 'DataVars','sim');
  140. avgdata.prcterr=avgdata.mean_repError./avgdata.duration*100;
  141. avgsim.prcterr=avgsim.mean_simError./avgsim.duration*100;
  142. gavgdata = grpstats(avgdata, {'RandLevel','duration'},{'mean','sem'}, 'DataVars','mean_repError');
  143. gavgdatadur = grpstats(avgdatadur, {'RandLevel','duration'},{'mean','sem'}, 'DataVars','mean_repDur');
  144. gavgsim = grpstats(avgsim, {'RandLevel','duration'},{'mean','sem'}, 'DataVars','mean_simError');
  145. gavgsimdur = grpstats(avgsimdur, {'RandLevel','duration'},{'mean','sem'}, 'DataVars','mean_sim');
  146. gavgdata.prcterr=gavgdata.mean_mean_repError./gavgdata.duration*100;
  147. gavgsim.prcterr=gavgsim.mean_mean_simError./gavgsim.duration*100;
  148. gavgprct=grpstats(avgdata, {'RandLevel','duration'},{'mean','sem'}, 'DataVars','prcterr');
  149. gavgsimprct=grpstats(avgsim, {'RandLevel','duration'},{'mean','sem'}, 'DataVars','prcterr');
  150. %% plot for Vierordt paper
  151. figure
  152. idx=gavgdata.GroupCount>2;
  153. subplot(1,2,1)
  154. hold on
  155. errorbar(gavgprct.duration(gavgprct.RandLevel == 1 & idx)-0.01, gavgprct.mean_prcterr(gavgprct.RandLevel == 1 & idx),gavgprct.sem_prcterr(gavgprct.RandLevel == 1 & idx),'k-o','MarkerFaceColor','k','MarkerSize',10);
  156. errorbar(gavgprct.duration(gavgprct.RandLevel == 2 & idx)+0.01, gavgprct.mean_prcterr(gavgprct.RandLevel == 2 & idx),gavgprct.sem_prcterr(gavgprct.RandLevel == 2 & idx),'k-o','MarkerSize',10);
  157. plot([0 10],[0 0],'--k')
  158. xlim([0 2])
  159. ylim([-30 60])
  160. title('experiment')
  161. legend('random walk','randomized')
  162. xlabel('mean target time (s)')
  163. ylabel('percentage error of reproduction')
  164. set(gca,'Fontsize',16)
  165. text('Parent',gca,'FontSize',36,'String','A','Position',[-0.4 63 0]);
  166. hold off
  167. subplot(1,2,2)
  168. hold on
  169. errorbar(gavgsimprct.duration(gavgsimprct.RandLevel == 1 & idx)-0.01, gavgsimprct.mean_prcterr(gavgsimprct.RandLevel == 1 & idx),gavgsimprct.sem_prcterr(gavgsimprct.RandLevel == 1 & idx),'k-o','MarkerFaceColor','k','MarkerSize',10);
  170. errorbar(gavgsimprct.duration(gavgsimprct.RandLevel == 2 & idx)+0.01, gavgsimprct.mean_prcterr(gavgsimprct.RandLevel == 2 & idx),gavgsimprct.sem_prcterr(gavgsimprct.RandLevel == 2 & idx),'k-o','MarkerSize',10);
  171. plot([0 10],[0 0],'--k')
  172. xlim([0 2])
  173. ylim([-30 60])
  174. title('simulation')
  175. xlabel('mean target time (s)')
  176. ylabel('percentage error of reproduction')
  177. set(gca,'Fontsize',16)
  178. text('Parent',gca,'FontSize',36,'String','B','Position',[-0.4 63 0]);
  179. hold off
  180. set(gcf,'Position',[560 556 836 392])