corr_sim.m 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. %% routine for the simulation to show NMF vs correlation and generating figure 1
  2. %% adding necessary directories and loading data
  3. clear all
  4. clc
  5. close all
  6. filepath = fileparts(pwd);
  7. addpath(strcat(filepath,filesep,'Toolboxes',filesep,'PopulationSpikeTrainFactorizationV1.0',filesep));
  8. addpath(strcat(filepath,filesep,'Aux_functions',filesep));
  9. addpath(strcat(filepath,filesep,'Toolboxes',filesep,'BCT',filesep,'2019_03_03_BCT',filesep));
  10. %% Simulations to show examples of correlation vs NMF
  11. n_neurons = 10;
  12. n_bins = 60*10;
  13. base_line_rate = 1;
  14. n_permutes = 100;
  15. % case 1
  16. correlated_neurons = 2:7;
  17. correlated_time = 1:300;
  18. SNR = 1.5;
  19. rates = 0.1*randn(n_neurons,n_bins) + base_line_rate;
  20. rates(correlated_neurons,correlated_time) = 0.1*rand(length(correlated_neurons),length(correlated_time)) + SNR*base_line_rate;
  21. rates(9:10,end/2:end) = rates(9:10,end/2:end) + 0.5;
  22. C_real = corr(rates');
  23. corr_sh = zeros(n_neurons,n_neurons,n_permutes);
  24. for permute=1:n_permutes
  25. shuffled_spikes = rates;
  26. for unit=1:n_neurons
  27. shuffled_spikes(unit,:) = rates(unit,randperm(n_bins));
  28. end
  29. corr_sh(:,:,permute) = corr(shuffled_spikes');
  30. end
  31. th_corr = prctile(corr_sh,99,3);
  32. th_corr(th_corr < 0) = 0;
  33. C_th = C_real.*(C_real > th_corr);
  34. [M,Q] = community_louvain(C_th);
  35. var_explained = zeros(1,n_neurons/2);
  36. for i=1:n_neurons/2
  37. N_modules = i;
  38. [~,~,err] = nmf(rates',N_modules);
  39. var_explained(i) = 1 - (err./norm(rates,'fro'));
  40. end
  41. [idxOfBestPoint] = elbow_finder(var_explained);
  42. [W,H] = nmf(rates',idxOfBestPoint,[],2,500,[],[],5);
  43. H_norm = normalize(H,2,'range');
  44. W_norm = normalize(W,'range');
  45. subplot(3,4,1);imagesc(rates);colormap gray; colorbar;axis square;title('spike rates');
  46. ylabel('Neurons');caxis([1,3])
  47. subplot(3,4,2);imagesc(C_th>0);colormap gray; colorbar;axis square;caxis([0,1]);
  48. plot_comunity(M);title('thresholded correlation');
  49. subplot(3,4,3);imagesc(H_norm');colormap gray;axis square;colorbar;title('spatial modules');
  50. subplot(3,4,4);imagesc(W_norm');colormap gray;axis square;colorbar;title('temporal modules');
  51. % case 2
  52. rates = 0.1*rand(n_neurons,n_bins) + base_line_rate;
  53. correlated_neurons_1 = 2:4;
  54. correlated_neurons_2 = 5:7;
  55. correlated_time_1 = 1:300/4;
  56. correlated_time_2 = correlated_time_1(end):300/2;
  57. correlated_time_3 = correlated_time_2(end):300;
  58. SNR = 2;
  59. rates(correlated_neurons_1,correlated_time_1) = 0.1*randn(length(correlated_neurons_1),length(correlated_time_1)) + SNR*base_line_rate;
  60. rates(correlated_neurons_2,correlated_time_2) = 0.1*randn(length(correlated_neurons_2),length(correlated_time_2)) + SNR*base_line_rate;
  61. rates(correlated_neurons,correlated_time_3) = 0.1*randn(length(correlated_neurons),length(correlated_time_3)) + 1.1*SNR*base_line_rate;
  62. rates(9:10,end/2:end) = rates(9:10,end/2:end) + 0.5;
  63. C_real = corr(rates');
  64. corr_sh = zeros(n_neurons,n_neurons,n_permutes);
  65. for permute=1:n_permutes
  66. shuffled_spikes = rates;
  67. for unit=1:n_neurons
  68. shuffled_spikes(unit,:) = rates(unit,randperm(n_bins));
  69. end
  70. corr_sh(:,:,permute) = corr(shuffled_spikes');
  71. end
  72. th_corr = prctile(corr_sh,99,3);
  73. th_corr(th_corr < 0) = 0;
  74. C_th = C_real.*(C_real > th_corr);
  75. [M,Q] = community_louvain(C_th);
  76. var_explained = zeros(1,n_neurons/2);
  77. for i=1:n_neurons/2
  78. N_modules = i;
  79. [~,~,err] = nmf(rates',N_modules);
  80. var_explained(i) = 1 - (err./norm(rates,'fro'));
  81. end
  82. [idxOfBestPoint] = elbow_finder(var_explained);
  83. [W,H] = nmf(rates',idxOfBestPoint,[],2,500,[],[],5);
  84. H_norm = normalize(H,2,'range');
  85. W_norm = normalize(W,'range');
  86. subplot(3,4,5);imagesc(rates);colormap gray; colorbar;axis square;
  87. ylabel('Neurons');caxis([1,3])
  88. subplot(3,4,6);imagesc(C_th>0);colormap gray; colorbar;axis square;caxis([0,1]);
  89. plot_comunity(M);
  90. subplot(3,4,7);imagesc(H_norm');colormap gray;axis square;colorbar
  91. subplot(3,4,8);imagesc(W_norm');colormap gray;axis square;colorbar
  92. % case 3
  93. correlated_neurons = 2:7;
  94. correlated_time_1 = 1:150;
  95. correlated_time_2 = n_bins-150:n_bins;
  96. base_line_rate = 1;
  97. SNR = 1.5;
  98. rates = 0.1*randn(n_neurons,n_bins) + base_line_rate;
  99. rates(correlated_neurons,correlated_time_1) = 0.1*randn(length(correlated_neurons),length(correlated_time_1)) + SNR*base_line_rate;
  100. rates(correlated_neurons,correlated_time_2) = 0.1*randn(length(correlated_neurons),length(correlated_time_2)) + SNR*base_line_rate;
  101. rates(9:10,end/2:end) = rates(9:10,end/2:end) + 0.5;
  102. C_real = corr(rates');
  103. corr_sh = zeros(n_neurons,n_neurons,n_permutes);
  104. for permute=1:n_permutes
  105. shuffled_spikes = rates;
  106. for unit=1:n_neurons
  107. shuffled_spikes(unit,:) = rates(unit,randperm(n_bins));
  108. end
  109. corr_sh(:,:,permute) = corr(shuffled_spikes');
  110. end
  111. th_corr = prctile(corr_sh,99,3);
  112. th_corr(th_corr < 0) = 0;
  113. C_th = C_real.*(C_real > th_corr);
  114. [M,Q] = community_louvain(C_th);
  115. var_explained = zeros(1,n_neurons/2);
  116. for i=1:n_neurons/2
  117. N_modules = i;
  118. [~,~,err] = nmf(rates',N_modules);
  119. var_explained(i) = 1 - (err./norm(rates,'fro'));
  120. end
  121. [idxOfBestPoint] = elbow_finder(var_explained);
  122. [W,H] = nmf(rates',idxOfBestPoint,[],2,500,[],[],5);
  123. H_norm = normalize(H,2,'range');
  124. W_norm = normalize(W,'range');
  125. subplot(3,4,9);imagesc(rates);colormap gray; colorbar;axis square
  126. ylabel('Neurons');xlabel('Time (ms)');caxis([1,3])
  127. subplot(3,4,10);imagesc(C_th>0);colormap gray; colorbar;axis square;caxis([0,1]);
  128. plot_comunity(M);
  129. subplot(3,4,11);imagesc(H_norm');colormap gray;axis square;colorbar
  130. subplot(3,4,12);imagesc(W_norm');colormap gray;axis square;colorbar
  131. %% Generating the figure relating this concept to cortical Rhythms
  132. % type 1
  133. n_neurons = 10;
  134. n_bins = 60*10;
  135. base_line_rate = 0.1;
  136. rates = 0.001*rand(n_neurons,n_bins) + base_line_rate;
  137. correlated_neurons = 2:7;
  138. correlated_time = 1:300;
  139. SNR = 2;
  140. rates(correlated_neurons,correlated_time) = rand(length(correlated_neurons),length(correlated_time)) + 1.1*SNR*base_line_rate;
  141. rates(9:10,end/2:end) = rates(9:10,end/2:end) + 1;
  142. to_raster = cell(1,n_neurons);
  143. for neuron=1:n_neurons
  144. to_raster{neuron} = PechePourPoisson(rates(neuron,:),0.1)';
  145. end
  146. t = 0:0.01:60;
  147. LFP = cos(2*pi*t/10) + cos(pi*t/10) + cos(pi*t/100);
  148. LFP(1:3000) = LFP(1:3000) - 2.5*cos(0.3*pi*t(1:3000)/2);
  149. figure();
  150. subplot(2,1,1);plotSpikeRaster(to_raster,'plottype','vertline');
  151. subplot(2,1,2);plot(t(1:3000),LFP(1:3000));hold all
  152. plot(t(3001:end),LFP(3001:end));
  153. % type 2
  154. n_neurons = 10;
  155. n_bins = 60*10;
  156. base_line_rate = 0.1;
  157. rates = 0.001*rand(n_neurons,n_bins) + base_line_rate;
  158. correlated_neurons = 2:7;
  159. correlated_neurons_1 = 2:4;
  160. correlated_neurons_2 = 5:7;
  161. correlated_time_1 = 1:300/4;
  162. correlated_time_2 = correlated_time_1(end):300/2;
  163. correlated_time_3 = correlated_time_2(end):300;
  164. SNR = 2;
  165. rates(correlated_neurons_1,correlated_time_1) = rand(length(correlated_neurons_1),length(correlated_time_1)) + 0.9*SNR*base_line_rate;
  166. rates(correlated_neurons_2,correlated_time_2) = rand(length(correlated_neurons_2),length(correlated_time_2)) + 0.9*SNR*base_line_rate;
  167. rates(correlated_neurons,correlated_time_3) = rand(length(correlated_neurons),length(correlated_time_3)) + 1.1*SNR*base_line_rate;
  168. rates(9:10,end/2:end) = rates(9:10,end/2:end) + 1;
  169. to_raster = cell(1,n_neurons);
  170. for neuron=1:n_neurons
  171. to_raster{neuron} = PechePourPoisson(rates(neuron,:),0.1)';
  172. end
  173. t = 0:0.01:60;
  174. LFP = cos(2*pi*t/10) + cos(pi*t/10) + cos(pi*t/100);
  175. LFP(1:750) = LFP(1:750) - 1.5*cos(8*pi*t(1:750)/10);
  176. LFP(751:1500) = LFP(751:1500) + 2*cos(4*pi*t(751:1500)/10);
  177. LFP(1501:3000) = - 1.5*cos(8*pi*t(1501:3000)/10) + 2*cos(4*pi*t(1501:3000)/10) + LFP(1501:3000);
  178. LFP(751) = mean([LFP(750),LFP(752)]);
  179. LFP(1501) = mean([LFP(1500),LFP(1502)]);
  180. figure();
  181. subplot(2,1,1);plotSpikeRaster(to_raster,'plottype','vertline');
  182. subplot(2,1,2);plot(t(1:750),LFP(1:750));hold all
  183. plot(t(751:1500),LFP(751:1500));plot(t(1501:3000),LFP(1501:3000));
  184. plot(t(3001:end),LFP(3001:end));
  185. % type 3
  186. n_neurons = 10;
  187. n_bins = 60*10;
  188. base_line_rate = 0.1;
  189. rates = 0.001*rand(n_neurons,n_bins) + base_line_rate;
  190. correlated_neurons = 2:7;
  191. correlated_time_1 = 1:300/4;
  192. correlated_time_2 = 3*n_bins/4:n_bins;
  193. SNR = 2;
  194. rates(correlated_neurons,correlated_time_1) = rand(length(correlated_neurons),length(correlated_time_1)) + 0.9*SNR*base_line_rate;
  195. rates(correlated_neurons,correlated_time_2) = rand(length(correlated_neurons),length(correlated_time_2)) + 0.9*SNR*base_line_rate;
  196. rates(9:10,end/2:end) = rates(9:10,end/2:end) + 1;
  197. to_raster = cell(1,n_neurons);
  198. for neuron=1:n_neurons
  199. to_raster{neuron} = PechePourPoisson(rates(neuron,:),0.1)';
  200. end
  201. t = 0:0.01:60;
  202. LFP = cos(2*pi*t/10) + cos(pi*t/10) + cos(pi*t/100);
  203. LFP(1:750) = LFP(1:750) - 2*cos(4*pi*t(1:750)/10);
  204. LFP(750:3000) = 2*sin(pi*t(750:3000)/10);
  205. LFP(4500:end) = LFP(4500:end) + 3.5*sin(8*pi*t(4500:end)/10) - 2*cos(4*pi*t(4500:end)/10);
  206. figure();
  207. subplot(2,1,1);plotSpikeRaster(to_raster,'plottype','vertline');
  208. subplot(2,1,2);plot(t(1:750),LFP(1:750));hold all
  209. plot(t(751:3000),LFP(751:3000));
  210. plot(t(3001:4500),LFP(3001:4500));
  211. plot(t(4500:end),LFP(4500:end));