[numbers] add partial solution
This commit is contained in:
parent
1ddd3bb700
commit
656c37a0d6
146
projects/project_numbers/solution/main.m
Normal file
146
projects/project_numbers/solution/main.m
Normal file
@ -0,0 +1,146 @@
|
||||
clear all
|
||||
close all
|
||||
|
||||
%% loading, splitting data and metadata, data sorting, and definition of constants
|
||||
load('../data/Neuron22.mat', 'data_unsorted')
|
||||
sample_rate = 1000;
|
||||
conditions = data_unsorted(:, 1);
|
||||
spike_data = data_unsorted(:, 2:end);
|
||||
data_sorted = sortrows(data_unsorted, 1, 'descend');
|
||||
sorted_conditions = data_sorted(:,1);
|
||||
sorted_spike_data = data_sorted(:, 2:end);
|
||||
|
||||
condition_colors = ["red", "green", "blue", "k"];
|
||||
segments = ["Fixation", "Stimulus ON", "Delay"];
|
||||
segment_times = [-0.5, 0; 0.001, 0.8; 0.801, 1.8];
|
||||
|
||||
%% Scatterplots of the spike responses
|
||||
fig = scatterplot(spike_data, conditions, sample_rate, segments, segment_times, condition_colors);
|
||||
fig = format_figure(fig, [15, 10]);
|
||||
saveas(fig, "scatterplot_unsorted", "pdf")
|
||||
|
||||
fig = scatterplot(sorted_spike_data, sorted_conditions, sample_rate, segments, segment_times, condition_colors);
|
||||
fig = format_figure(fig, [15, 10]);
|
||||
saveas(fig, "scatterplot_sorted", "pdf");
|
||||
|
||||
%% Firing rate analysis
|
||||
bin_width = 0.1;
|
||||
[rates, bins] = get_firing_rates(spike_data, sample_rate, bin_width);
|
||||
fig = plot_firing_rates(conditions, rates, bins, segments, segment_times, condition_colors);
|
||||
fig = format_figure(fig, [15, 10]);
|
||||
saveas(fig, "firing_rates", "pdf")
|
||||
|
||||
fig = plot_average_rates(rates, bins, conditions, segments, segment_times, condition_colors);
|
||||
fig = format_figure(fig, [10,10]);
|
||||
saveas(fig, "rate_comparison", "pdf")
|
||||
|
||||
%% function definitions
|
||||
function f = plot_average_rates(rates, bins, conditions, segments, segment_times, condition_colors)
|
||||
f = figure();
|
||||
unique_conditions = sort(unique(conditions));
|
||||
bins = bins + segment_times(1,1);
|
||||
max_rate = floor(max(rates(:))/5) * 5;
|
||||
for i = 1:length(segments)
|
||||
subplot(1, length(segments), i)
|
||||
hold on
|
||||
box_data = [];
|
||||
grouping_data = [];
|
||||
for j = 1:length(unique_conditions)
|
||||
condition_rates = mean(rates(conditions == unique_conditions(j), ...
|
||||
bins >= segment_times(i,1) & bins < segment_times(i, 2)));
|
||||
box_data = cat(1, box_data, condition_rates);
|
||||
grouping_data = cat(1, grouping_data, ...
|
||||
ones(length(condition_rates),1) * unique_conditions(j));
|
||||
end
|
||||
boxplot(box_data, grouping_data, "Widths", 0.3, "ColorGroup", condition_colors)
|
||||
xticklabels(1:length(unique_conditions))
|
||||
xlabel("Number of dots")
|
||||
if i == 1
|
||||
ylabel("Firing rate [Hz]")
|
||||
end
|
||||
ylim([0, max_rate])
|
||||
box("off")
|
||||
title(segments(i))
|
||||
end
|
||||
end
|
||||
|
||||
function f = format_figure(f, size)
|
||||
f.Color = "White";
|
||||
f.PaperSize = size;
|
||||
f.PaperPosition = [0, 0, size(1), size(2)];
|
||||
end
|
||||
|
||||
function f = plot_firing_rates(conditions, rates, bins, segments, segment_times, condition_colors)
|
||||
f = figure();
|
||||
unique_conditions = sort(unique(conditions));
|
||||
|
||||
for i = 1:length(unique_conditions)
|
||||
condition = unique_conditions(i);
|
||||
subplot(length(unique_conditions), 1, i)
|
||||
hold on
|
||||
e = errorbar(bins + segment_times(1,1), mean(rates(conditions == condition, :)), std(rates), ...
|
||||
"Color", condition_colors(condition-1), "DisplayName", ...
|
||||
sprintf("Number of points: %i", condition-1));
|
||||
xlim([segment_times(1,1)-0.1, segment_times(end, end) + 0.1])
|
||||
ylim([0, 5])
|
||||
ylabel("Firing rate [Hz]")
|
||||
if i < length(unique_conditions)
|
||||
xticklabels([])
|
||||
else
|
||||
xlabel("Time [s]")
|
||||
end
|
||||
|
||||
for j = 1:length(segments)
|
||||
if i == 1
|
||||
label_x_pos = segment_times(j,2) - (segment_times(j, 2) - segment_times(j, 1))/2;
|
||||
t = text(label_x_pos, 5.5, segments(j));
|
||||
t.HorizontalAlignment = "center";
|
||||
t.FontSize = 10;
|
||||
end
|
||||
if j < length(segments)
|
||||
plot([segment_times(j, 2), segment_times(j, 2)], ...
|
||||
[0, 5],'k--', 'linewidth', 1.5)
|
||||
end
|
||||
end
|
||||
legend(e);
|
||||
box('off')
|
||||
end
|
||||
end
|
||||
|
||||
function [rates, bins] = get_firing_rates(data, sample_rate, bin_width)
|
||||
|
||||
time = (0:size(data, 2)-1) ./ sample_rate;
|
||||
edges = 0:bin_width:time(end)+bin_width;
|
||||
rates = zeros(size(data, 1), length(edges)-1);
|
||||
for i = 1:size(data, 1)
|
||||
rates(i, :) = histcounts(time(data(i,:) == 1), edges);
|
||||
end
|
||||
bins = edges(1:end-1);
|
||||
end
|
||||
|
||||
function f = scatterplot(data, conditions, sample_rate, segments, segment_times, colors)
|
||||
|
||||
f = figure();
|
||||
hold on
|
||||
time = (0:size(data, 2)-1) ./ sample_rate + segment_times(1,1);
|
||||
for i = 1:size(data, 1)
|
||||
c = colors(conditions(i) - 1);
|
||||
spike_times = time(data(i,:) == 1);
|
||||
scatter(spike_times, ones(length(spike_times),1) * i, c)
|
||||
end
|
||||
xlabel('Time [s]')
|
||||
ylabel('Trials')
|
||||
for i = 1:length(segments)
|
||||
label_x_pos = segment_times(i,2) - (segment_times(i, 2) - segment_times(i, 1))/2;
|
||||
t = text(label_x_pos, 275, segments(i));
|
||||
t.HorizontalAlignment = "center";
|
||||
t.FontSize = 10;
|
||||
if i < length(segments)
|
||||
plot([segment_times(i, 2), segment_times(i, 2)],[0, size(data,1)],'k--', 'linewidth', 1.5)
|
||||
end
|
||||
end
|
||||
ylim([0, size(data, 1) + 50])
|
||||
yticks(0:50:250)
|
||||
box off
|
||||
hold off
|
||||
end
|
Reference in New Issue
Block a user