Figure3A_MUA.m 16 KB

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