Figure3B_AMUA.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. clear all
  2. new_fs=150;
  3. t_ax=[-.1:1/new_fs:.4];
  4. baseline=[-.05 0.0133];
  5. timewin=[-.05 .25];
  6. t_ax_plot=t_ax(min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))));
  7. badchan=48;
  8. t_ax_short=t_ax_plot;
  9. load('C:\Users\Ryzard Auksztulewicz\Desktop\omissions_bmcbiol_repo\data\ryszard_preprocessed_20200413_AMUA.mat')
  10. for p=[5 8:12]
  11. rates_exp=[];
  12. mean_response=[];
  13. seg_length=[];
  14. cols=cell(0);
  15. linestyles=cell(0);
  16. legendlabels=cell(0);
  17. for j=1:3
  18. data_present=length(preceding_all_amua{p,j});
  19. if data_present>0
  20. notrls=size(preceding_all_amua{p,j},3);
  21. % shuffle data
  22. for k=1:size(preceding_all_amua{p,j},1)
  23. for l=1:size(preceding_all_amua{p,j},3)
  24. preceding_all_amua{p,j}(k,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),l)=randsample(preceding_all_amua{p,j}(k,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),l),length(find(t_ax>=timewin(1)&t_ax<=timewin(2))));
  25. end
  26. end
  27. for k=1:size(omissions_all_amua{p,j},1)
  28. for l=1:size(omissions_all_amua{p,j},3)
  29. omissions_all_amua{p,j}(k,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),l)=randsample(omissions_all_amua{p,j}(k,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),l),length(find(t_ax>=timewin(1)&t_ax<=timewin(2))));
  30. end
  31. end
  32. for k=1:size(preceding_all_amua{p,j},3)
  33. for l=1:size(preceding_all_amua{p,j},1)
  34. for_detrend=[mean(preceding_all_amua{p,j}(l,min(find(t_ax>=baseline(1))):max(find(t_ax<=baseline(2))),k)) mean(preceding_all_amua{p,j}(l,min(find(t_ax>=timewin(2)+baseline(1))):max(find(t_ax<=timewin(2))),k))];
  35. for_detrend=for_detrend-mean(for_detrend);
  36. preceding_all_amua_dt{p,j}(l,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),k)=preceding_all_amua{p,j}(l,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),k)-linspace(for_detrend(1),for_detrend(2),length(find(t_ax>=timewin(1)&t_ax<=timewin(2))));
  37. end
  38. end
  39. for k=1:size(preceding_all_amua{p,j},3)
  40. for l=1:size(preceding_all_amua{p,j},1)
  41. for_detrend=[mean(omissions_all_amua{p,j}(l,min(find(t_ax>=baseline(1))):max(find(t_ax<=baseline(2))),k)) mean(omissions_all_amua{p,j}(l,min(find(t_ax>=timewin(2)+baseline(1))):max(find(t_ax<=timewin(2))),k))];
  42. for_detrend=for_detrend-mean(for_detrend);
  43. omissions_all_amua_dt{p,j}(l,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),k)=omissions_all_amua{p,j}(l,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),k)-linspace(for_detrend(1),for_detrend(2),length(find(t_ax>=timewin(1)&t_ax<=timewin(2))));
  44. end
  45. end
  46. preceding_all_amua_bc{p,j}=preceding_all_amua_dt{p,j}-repmat(nanmean(preceding_all_amua_dt{p,j}(:,min(find(t_ax>=baseline(1))):max(find(t_ax<=baseline(2))),:),2),[1 size(preceding_all_amua_dt{p,j},2) 1]);
  47. omissions_all_amua_bc{p,j}=omissions_all_amua_dt{p,j}-repmat(nanmean(omissions_all_amua_dt{p,j}(:,min(find(t_ax>=baseline(1))):max(find(t_ax<=baseline(2))),:),2),[1 size(omissions_all_amua_dt{p,j},2) 1]);
  48. end
  49. end
  50. mean_evoked=[];
  51. for j=1:3
  52. if length(preceding_all_amua{p,j})>0
  53. mean_evoked=[mean_evoked nanmean(preceding_all_amua_bc{p,j}(:,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),:),3)];
  54. end
  55. end
  56. totalrange=range(mean_evoked,2);
  57. for j=1:3
  58. if length(preceding_all_amua{p,j})>0
  59. preceding_all_amua_bc{p,j}=preceding_all_amua_bc{p,j}./repmat(totalrange,[1 size(preceding_all_amua_bc{p,j},2) size(preceding_all_amua_bc{p,j},3)]);
  60. omissions_all_amua_bc{p,j}=omissions_all_amua_bc{p,j}./repmat(totalrange,[1 size(omissions_all_amua_bc{p,j},2) size(omissions_all_amua_bc{p,j},3)]);
  61. end
  62. end
  63. allstd=[];
  64. for j=1:size(preceding_all_amua_bc,2)
  65. try
  66. allstd=[allstd; squeeze(mean(std(omissions_all_amua_bc{p,j}(setdiff(1:64,badchan),find(t_ax>=timewin(1)&t_ax<=timewin(2)),:),[],2),1))];
  67. catch
  68. end
  69. end
  70. stdcutoff=median(allstd)+3*std(allstd);
  71. for j=1:size(preceding_all_amua_bc,2)
  72. try
  73. badtrls=find(squeeze(mean(std(omissions_all_amua_bc{p,j}(setdiff(1:64,badchan),find(t_ax>=timewin(1)&t_ax<=timewin(2)),:),[],2),1))>stdcutoff);
  74. omissions_all_amua_bc{p,j}(:,:,badtrls)=NaN;
  75. catch
  76. end
  77. end
  78. allstd=[];
  79. for j=1:size(preceding_all_amua_bc,2)
  80. try
  81. allstd=[allstd; squeeze(mean(std(preceding_all_amua_bc{p,j}(setdiff(1:64,badchan),find(t_ax>=timewin(1)&t_ax<=timewin(2)),:),[],2),1))];
  82. catch
  83. end
  84. end
  85. stdcutoff=median(allstd)+3*std(allstd);
  86. for j=1:size(preceding_all_amua_bc,2)
  87. try
  88. badtrls=find(squeeze(mean(std(preceding_all_amua_bc{p,j}(setdiff(1:64,badchan),find(t_ax>=timewin(1)&t_ax<=timewin(2)),:),[],2),1))>stdcutoff);
  89. preceding_all_amua_bc{p,j}(:,:,badtrls)=NaN;
  90. catch
  91. end
  92. end
  93. for j=1:3
  94. if length(preceding_all_amua{p,j})>0
  95. mean_response=[mean_response nanmean(preceding_all_amua_bc{p,j}(:,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),:),3) nanmean(omissions_all_amua_bc{p,j}(:,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),:),3)];
  96. rates_exp=[rates_exp j+1];
  97. seg_length=[seg_length size(nanmean(preceding_all_amua_bc{p,j}(:,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),:),3),2) size(nanmean(omissions_all_amua_bc{p,j}(:,min(find(t_ax>=timewin(1))):max(find(t_ax<=timewin(2))),:),3),2)];
  98. end
  99. end
  100. mean_response(badchan,:)=0;
  101. for c=1:64
  102. alltrls=[];
  103. for k=1:size(preceding_all_amua_bc,2)
  104. try
  105. alltrls=[alltrls nanmean(squeeze(preceding_all_amua_bc{p,k}(c,find(t_ax>=0&t_ax<=timewin(2)),:)),1)];
  106. catch
  107. end
  108. end
  109. [h,p_prec(c),ci,stats]=ttest(alltrls);
  110. end
  111. for c=1:64
  112. alltrls=[];
  113. for k=1:size(omissions_all_amua_bc,2)
  114. try
  115. alltrls=[alltrls nanmean(squeeze(omissions_all_amua_bc{p,k}(c,find(t_ax>=0&t_ax<=timewin(2)),:)),1)];
  116. catch
  117. end
  118. end
  119. [h,p_omi(c),ci,stats]=ttest(alltrls);
  120. end
  121. p_sort=sort([p_prec p_omi]);
  122. for i=1:length(p_sort)
  123. if p_sort(i)<=.05*i/length(p_sort)
  124. p_fdr(i)=1;
  125. else
  126. p_fdr(i)=0;
  127. end
  128. end
  129. p_fdr_thresh=p_sort(max(find(p_fdr==1)));
  130. if length(p_fdr_thresh)==0
  131. p_fdr_thresh=0;
  132. end
  133. selchans=setdiff(1:64,badchan);
  134. try
  135. amps_all=[];
  136. lats_all=[];
  137. for c=selchans
  138. mean_conds=reshape(mean_response(c,:),[45 size(mean_response,2)/45]);
  139. if mean(sign(mean(mean_conds)))<0
  140. [p c]
  141. mean_conds=-mean_conds;
  142. mean_response(c,:)=-mean_response(c,:);
  143. end
  144. for k=1:size(mean_response,2)/45
  145. [amps,lats]=findpeaks(mean_conds(:,k));
  146. lats_all(c,k)=t_ax_short(lats(find(abs(amps)==max(abs(amps)))));
  147. amps_all(c,k)=amps(find(abs(amps)==max(abs(amps))));
  148. end
  149. end
  150. lats_all=lats_all(selchans,:);
  151. amps_all=amps_all(selchans,:);
  152. mean_conds_all{p}=mean_response;
  153. mean_lats_all{p}=lats_all;
  154. mean_amps_all{p}=amps_all;
  155. selchans_all{p}=selchans;
  156. rates_all{p}=rates_exp;
  157. catch
  158. mean_conds_all{p}=0;
  159. mean_lats_all{p}=0;
  160. mean_amps_all{p}=0;
  161. selchans_all{p}=0;
  162. rates_all{p}=0;
  163. p
  164. end
  165. end
  166. choose_rates=[2 3 4];
  167. anova_lats=[];
  168. anova_amps=[];
  169. anova_rats=[];
  170. anova_rate=[];
  171. anova_stim=[];
  172. anova_chan=[];
  173. ppoi=[5 8:12];
  174. colscols=[0 0 .5; 0 0 1; .5 .5 1];
  175. for i=ppoi
  176. if length(rates_all{i})>0 && length([find(rates_all{i}==choose_rates(1)) find(rates_all{i}==choose_rates(2))])==2
  177. selchoi=find(median(mean_amps_all{i}(:,[2 4 6]),2)<0);
  178. mean_lats_all{i}(selchoi,:)=NaN;
  179. mean_amps_all{i}(selchoi,:)=NaN;
  180. for r=1:length(choose_rates)
  181. rateind=find(rates_all{i}==choose_rates(r));
  182. nchans=length(find(~isnan(mean_lats_all{i}(:,(rateind-1)*2+1))));
  183. anova_lats=[anova_lats; mean_lats_all{i}(find(~isnan(mean_lats_all{i}(:,(rateind-1)*2+1))),(rateind-1)*2+1)];
  184. anova_amps=[anova_amps; mean_amps_all{i}(find(~isnan(mean_amps_all{i}(:,(rateind-1)*2+1))),(rateind-1)*2+1)];
  185. anova_rats=[anova_rats; ones(nchans,1)*i];
  186. anova_rate=[anova_rate; ones(nchans,1)*r];
  187. anova_stim=[anova_stim; ones(nchans,1)*1];
  188. anova_chan=[anova_chan; (1:nchans)'];
  189. anova_lats=[anova_lats; mean_lats_all{i}(find(~isnan(mean_lats_all{i}(:,(rateind-1)*2+2))),(rateind-1)*2+2)];
  190. anova_amps=[anova_amps; mean_amps_all{i}(find(~isnan(mean_amps_all{i}(:,(rateind-1)*2+2))),(rateind-1)*2+2)];
  191. anova_rats=[anova_rats; ones(nchans,1)*i];
  192. anova_rate=[anova_rate; ones(nchans,1)*r];
  193. anova_stim=[anova_stim; ones(nchans,1)*2];
  194. anova_chan=[anova_chan; (1:nchans)'];
  195. end
  196. end
  197. end
  198. M = zeros(4,4);
  199. M(3,4) = 1;
  200. anovan(anova_amps(~isnan(anova_amps)),{anova_stim(~isnan(anova_amps)) anova_rate(~isnan(anova_amps)) anova_rats(~isnan(anova_amps))},'varnames',{'stim' 'rate' 'rat'},'random',[3],'model','full','display','on')
  201. anovan(anova_lats(~isnan(anova_amps)),{anova_stim(~isnan(anova_amps)) anova_rate(~isnan(anova_amps)) anova_rats(~isnan(anova_amps))},'varnames',{'stim' 'rate' 'rat'},'random',[3],'model','full','display','on')
  202. figure;
  203. subplot(1,4,2)
  204. hold on
  205. unique_rats=unique(anova_rats);
  206. for i=1:length(unique_rats)
  207. for j=1:length(choose_rates)
  208. scatter(mean(anova_lats(find(anova_rats==unique_rats(i)&anova_stim==1&anova_rate==choose_rates(j)-1))),mean(anova_amps(find(anova_rats==unique_rats(i)&anova_stim==1&anova_rate==choose_rates(j)-1))),25,colscols(j,:),'filled')
  209. scatter(mean(anova_lats(find(anova_rats==unique_rats(i)&anova_stim==2&anova_rate==choose_rates(j)-1))),mean(anova_amps(find(anova_rats==unique_rats(i)&anova_stim==2&anova_rate==choose_rates(j)-1))),25,colscols(j,:))
  210. line([mean(anova_lats(find(anova_rats==unique_rats(i)&anova_stim==1&anova_rate==choose_rates(j)-1))) mean(anova_lats(find(anova_rats==unique_rats(i)&anova_stim==2&anova_rate==choose_rates(j)-1)))],[mean(anova_amps(find(anova_rats==unique_rats(i)&anova_stim==1&anova_rate==choose_rates(j)-1))) mean(anova_amps(find(anova_rats==unique_rats(i)&anova_stim==2&anova_rate==choose_rates(j)-1)))],'color',colscols(j,:))
  211. end
  212. end
  213. xlim([timewin(1) timewin(2)])
  214. xlabel('peak latency (s)')
  215. ylabel('peak amplitude')
  216. line([-.2 1],[0 0],'linestyle','--','color',[.5 .5 .5])
  217. line([0 0],[-.2 1],'linestyle','--','color',[.5 .5 .5])
  218. subplot(1,4,3)
  219. hold on
  220. for i=1:length(choose_rates)
  221. plotmean=mean(anova_lats(find(anova_stim==2&anova_rate==choose_rates(i)-1)));
  222. plotsem=std(anova_lats(find(anova_stim==2&anova_rate==choose_rates(i)-1)))/sqrt(length(anova_lats(find(anova_stim==2&anova_rate==choose_rates(i)-1))));
  223. bar(3*choose_rates(i)+.5,plotmean,'facecolor','white','edgecolor',colscols(i,:))
  224. line([3*choose_rates(i)+.5 3*choose_rates(i)+.5],[plotmean-plotsem plotmean+plotsem],'color',colscols(i,:))
  225. plotmean=mean(anova_lats(find(anova_stim==1&anova_rate==choose_rates(i)-1)));
  226. plotsem=std(anova_lats(find(anova_stim==1&anova_rate==choose_rates(i)-1)))/sqrt(length(anova_lats(find(anova_stim==2&anova_rate==choose_rates(i)-1))));
  227. bar(3*choose_rates(i)-.5,plotmean,'facecolor',colscols(i,:))
  228. line([3*choose_rates(i)-.5 3*choose_rates(i)-.5],[plotmean-plotsem plotmean+plotsem],'color',colscols(i,:))
  229. end
  230. ylabel('peak latency (s)')
  231. xlim([4 14])
  232. xticks(6:3:12)
  233. xticklabels(2:4)
  234. xlabel('rate (Hz)')
  235. ylim([0 .16])
  236. subplot(1,4,4)
  237. hold on
  238. for i=1:length(choose_rates)
  239. plotmean=mean(anova_amps(find(anova_stim==2&anova_rate==choose_rates(i)-1)));
  240. plotsem=std(anova_amps(find(anova_stim==2&anova_rate==choose_rates(i)-1)))/sqrt(length(anova_lats(find(anova_stim==2&anova_rate==choose_rates(i)-1))));
  241. bar(3*choose_rates(i)+.5,plotmean,'facecolor','white','edgecolor',colscols(i,:))
  242. line([3*choose_rates(i)+.5 3*choose_rates(i)+.5],[plotmean-plotsem plotmean+plotsem],'color',colscols(i,:))
  243. plotmean=mean(anova_amps(find(anova_stim==1&anova_rate==choose_rates(i)-1)));
  244. plotsem=std(anova_amps(find(anova_stim==1&anova_rate==choose_rates(i)-1)))/sqrt(length(anova_lats(find(anova_stim==2&anova_rate==choose_rates(i)-1))));
  245. bar(3*choose_rates(i)-.5,plotmean,'facecolor',colscols(i,:))
  246. line([3*choose_rates(i)-.5 3*choose_rates(i)-.5],[plotmean-plotsem plotmean+plotsem],'color',colscols(i,:))
  247. end
  248. ylabel('peak amplitude')
  249. xlim([4 14])
  250. xticks(6:3:12)
  251. xticklabels(2:4)
  252. xlabel('rate (Hz)')
  253. ylim([0 .8])
  254. clear all_ps
  255. subplot(1,4,1)
  256. plot_data=[mean_conds_all{5}(selchans_all{5},:); mean_conds_all{8}(selchans_all{8},:); mean_conds_all{9}(selchans_all{9},:); mean_conds_all{10}(selchans_all{10},:); mean_conds_all{11}(selchans_all{11},:); mean_conds_all{12}(selchans_all{12},:)];
  257. plot_mask=[];
  258. for i=ppoi
  259. plot_mask=cat(1,plot_mask,repmat(reshape(mean_amps_all{i},[size(mean_amps_all{i},1) 1 6]),[1 length(t_ax_short) 1]));
  260. end
  261. plot_mask(find(~isnan(plot_mask)))=1;
  262. plot_data=reshape(plot_data,[size(plot_data,1) 45 6]);
  263. plot_data=plot_data.*plot_mask;
  264. for i=1:size(plot_data,2)
  265. to_anova=squeeze(plot_data(:,i,:));
  266. anova_rate=[ones(size(to_anova,1),2) ones(size(to_anova,1),2)*2 ones(size(to_anova,1),2)*3];
  267. anova_stim=[ones(size(to_anova,1),1) ones(size(to_anova,1),1)*2 ones(size(to_anova,1),1) ones(size(to_anova,1),1)*2 ones(size(to_anova,1),1) ones(size(to_anova,1),1)*2];
  268. anova_rats=[ones(length(selchans_all{5}),6); ones(length(selchans_all{8}),6)*2; ones(length(selchans_all{9}),6)*3; ones(length(selchans_all{10}),6)*4; ones(length(selchans_all{11}),6)*5; ones(length(selchans_all{12}),6)*6];
  269. anova_chan=[repmat(1:length(selchans_all{5}),[6 1])'; repmat(1:length(selchans_all{8}),[6 1])'; repmat(1:length(selchans_all{9}),[6 1])'; repmat(1:length(selchans_all{10}),[6 1])'; repmat(1:length(selchans_all{11}),[6 1])'; repmat(1:length(selchans_all{12}),[6 1])'];
  270. all_ps(i,:)=anovan(to_anova(:),{anova_stim(:) anova_rate(:) anova_rats(:)},'varnames',{'stim' 'rate' 'rat'},'random',[3],'model','full','display','off');
  271. end
  272. all_ps=all_ps(:,[1 2 4]); % stim, rate, stim*rate
  273. for i=1:size(all_ps,2)
  274. sorted_p=sort(all_ps(:,i));
  275. p_fdr=sorted_p*0;
  276. for j=1:length(p_fdr)
  277. if sorted_p(j)<=.025*j/length(p_fdr)
  278. p_fdr(j)=1;
  279. end
  280. end
  281. if length(find(p_fdr==1))>0
  282. p_thresh(i)=sorted_p(max(find(p_fdr==1)));
  283. else
  284. p_thresh(i)=0;
  285. end
  286. end
  287. p_thresh
  288. hold on
  289. shadedErrorBar(t_ax(-1+find(t_ax>=timewin(1)&t_ax<=timewin(2))),nanmean(plot_data(:,:,1),1),nanstd(plot_data(:,:,1),[],1)/sqrt(size(plot_data,1)),{'-','color',[0 0 .5]},1);
  290. shadedErrorBar(t_ax(-1+find(t_ax>=timewin(1)&t_ax<=timewin(2))),nanmean(plot_data(:,:,2),1),nanstd(plot_data(:,:,2),[],1)/sqrt(size(plot_data,1)),{'--','color',[0 0 .5]},1);
  291. shadedErrorBar(t_ax(-1+find(t_ax>=timewin(1)&t_ax<=timewin(2))),nanmean(plot_data(:,:,3),1),nanstd(plot_data(:,:,3),[],1)/sqrt(size(plot_data,1)),{'-','color',[0 0 1]},1);
  292. shadedErrorBar(t_ax(-1+find(t_ax>=timewin(1)&t_ax<=timewin(2))),nanmean(plot_data(:,:,4),1),nanstd(plot_data(:,:,4),[],1)/sqrt(size(plot_data,1)),{'--','color',[0 0 1]},1);
  293. shadedErrorBar(t_ax(-1+find(t_ax>=timewin(1)&t_ax<=timewin(2))),nanmean(plot_data(:,:,5),1),nanstd(plot_data(:,:,5),[],1)/sqrt(size(plot_data,1)),{'-','color',[.5 .5 1]},1);
  294. shadedErrorBar(t_ax(-1+find(t_ax>=timewin(1)&t_ax<=timewin(2))),nanmean(plot_data(:,:,6),1),nanstd(plot_data(:,:,6),[],1)/sqrt(size(plot_data,1)),{'--','color',[.5 .5 1]},1);
  295. xlim([timewin(1)+.01 timewin(2)-.01])
  296. ylabel('amplitude')
  297. xlabel('time (s)')
  298. line([-.2 1],[0 0],'linestyle','--','color',[.5 .5 .5])
  299. line([0 0],[-.2 .8],'linestyle','--','color',[.5 .5 .5])