diff --git a/actions/comparisons-allcells/attributes.yaml b/actions/comparisons-allcells/attributes.yaml new file mode 100644 index 000000000..99b205cb3 --- /dev/null +++ b/actions/comparisons-allcells/attributes.yaml @@ -0,0 +1,4 @@ +registered: '2021-02-15T18:58:15' +data: + notebook: 20_comparisons_allcells.ipynb + html: 20_comparisons_allcells.html diff --git a/actions/comparisons-allcells/data/20_comparisons_allcells.html b/actions/comparisons-allcells/data/20_comparisons_allcells.html new file mode 100644 index 000000000..215ea85b3 --- /dev/null +++ b/actions/comparisons-allcells/data/20_comparisons_allcells.html @@ -0,0 +1,14200 @@ + + +
+ +%load_ext autoreload
+%autoreload 2
+
import os
+import pathlib
+import numpy as np
+import matplotlib
+import matplotlib.pyplot as plt
+import re
+import shutil
+import pandas as pd
+import scipy.stats
+from functools import reduce
+import statsmodels
+import seaborn as sns
+import exdir
+import expipe
+from distutils.dir_util import copy_tree
+import septum_mec
+import spatial_maps as sp
+import head_direction.head as head
+import septum_mec.analysis.data_processing as dp
+import septum_mec.analysis.registration
+from septum_mec.analysis.plotting import violinplot, savefig, despine
+
+from septum_mec.analysis.statistics import load_data_frames, make_paired_tables, make_statistics_table
+
project_path = dp.project_path()
+project = expipe.get_project(project_path)
+actions = project.actions
+
+output_path = pathlib.Path("output") / "comparisons-allcells"
+(output_path / "statistics").mkdir(exist_ok=True, parents=True)
+(output_path / "figures").mkdir(exist_ok=True, parents=True)
+
+
data, labels, colors, queries = load_data_frames()
+
data.keys()
+
columns = [
+ 'average_rate',
+# 'spatial_average_rate',
+ 'gridness',
+ 'sparsity',
+ 'selectivity',
+ 'information_rate',
+ 'information_specificity',
+ 'max_rate',
+ 'interspike_interval_cv',
+ 'burst_event_ratio',
+ 'in_field_mean_rate',
+ 'out_field_mean_rate',
+ 'max_field_mean_rate',
+ 'specificity',
+ 'speed_score',
+ 'spacing',
+ 'field_area',
+ 'head_mean_vec_len',
+ 'border_score'
+]
+
results, labels = make_paired_tables(data, columns)
+
results['gridcell']['average_rate']
+
# TODO: control for information rate
+
stat = {}
+stat_values = {}
+for cell_type, result in results.items():
+ stat[cell_type], stat_values[cell_type] = make_statistics_table(result, labels)
+
stat['gridcell'].T
+
for cell_type, sta in stat.items():
+ sta.to_latex(output_path / "statistics" / f"statistics_{cell_type}.tex")
+ sta.to_csv(output_path / "statistics" / f"statistics_{cell_type}.csv")
+
for cell_type, cell_results in results.items():
+ for key, result in cell_results.items():
+ result.to_latex(output_path / "statistics" / f"values_{cell_type}_{key}.tex")
+ result.to_csv(output_path / "statistics" / f"values_{cell_type}_{key}.csv")
+
title_xlabel = {
+ 'information_rate': ('Spatial information','bits/s'),
+ 'information_specificity': ("Spatial information specificity","bits/spike"),
+ 'specificity': ("Spatial specificity", ""),
+ 'average_rate': ("Average rate", "spikes/s"),
+# 'spatial_average_rate': ("Spatial average rate", "spikes/s"),
+ 'max_rate': ("Max rate", "spikes/s"),
+ 'interspike_interval_cv': ("ISI CV", "Coefficient of variation"),
+ 'in_field_mean_rate': ("In-field rate", "spikes/s"),
+ 'out_field_mean_rate': ("Out-of-field rate", "spikes/s"),
+ 'burst_event_ratio': ("Bursting ratio", ""),
+ 'gridness': ("Gridness", "Gridness"),
+ 'speed_score': ("Speed score", "Speed score"),
+ 'spacing': ('Field spacing', 'cm'),
+ 'field_area': ('Field area', 'cm$^2$'),
+ 'border_score': ('Border Score', ''),
+ 'head_mean_vec_len': ('Head direction score', ''),
+ 'max_field_mean_rate': ('Max field mean rate', 'spike/s'),
+ 'selectivity': ('Selectivity', ''),
+ 'sparsity': ('Sparsity', '')
+}
+
set(columns) - set(title_xlabel.keys()).intersection(set(columns))
+
plt.rc('axes', titlesize=12)
+plt.rcParams.update({
+ 'font.size': 12,
+ 'figure.figsize': (3.7, 2.2),
+ 'figure.dpi': 150
+})
+
for cell_type, cell_results in results.items():
+ for key, result in cell_results.items():
+ if key not in title_xlabel:
+ continue
+ fig = plt.figure()
+ plt.suptitle(cell_type + ' ' + title_xlabel[key][0])
+ legend_lines = []
+ for color, label in zip(colors, labels):
+ legend_lines.append(matplotlib.lines.Line2D([0], [0], color=color, label=label))
+ sns.kdeplot(data=result.loc[:,labels], cumulative=True, legend=False, palette=colors, common_norm=False)
+ plt.xlabel(title_xlabel[key][1])
+ plt.legend(
+ handles=legend_lines,
+ bbox_to_anchor=(1.04,1), borderaxespad=0, frameon=False)
+ plt.tight_layout()
+ plt.grid(False)
+ despine()
+ savefig(output_path / "figures" / f'{cell_type}_{key}')
+
%matplotlib inline
+plt.rc('axes', titlesize=12)
+plt.rcParams.update({
+ 'font.size': 12,
+ 'figure.figsize': (1.7*3, 3),
+ 'figure.dpi': 150
+})
+
def violinplot(df, labels, colors, statistics=None):
+ data = np.array([df.loc[:,label].dropna().to_numpy() for label in labels])
+ pos = np.array([i * 0.6 for i in range(len(data))])
+ labels = np.array(labels)
+# print(pos)
+ violins = plt.violinplot(data, pos, showmedians=True, showextrema=False)
+
+ for i, b in enumerate(violins['bodies']):
+ b.set_color(colors[i])
+ b.set_alpha (0.8)
+
+ # for i, body in enumerate(violins['cbars']):
+ # body.set_color('C{}'.format(i))
+
+ for category in ['cbars', 'cmins', 'cmaxes', 'cmedians']:
+ if category in violins:
+ violins[category].set_color(['k', 'k'])
+ violins[category].set_linewidth(2.0)
+ plt.xticks(pos, labels, rotation=45)
+ plt.gca().spines['top'].set_visible(False)
+ plt.gca().spines['right'].set_visible(False)
+
+
+ if statistics is not None:
+ tests = [[0,1], [2,3], [0,2]]
+ ds = [0,0,1]
+ for test, d in zip(tests, ds):
+ pvalue = statistics.loc[' - '.join(labels[test])]
+ # significance
+ if pvalue < 0.0001:
+ significance = "****"
+ elif pvalue < 0.001:
+ significance = "***"
+ elif pvalue < 0.01:
+ significance = "**"
+ elif pvalue < 0.05:
+ significance = "*"
+ else:
+ significance = "ns"
+
+ x1, x2 = pos[test]
+ data_max = np.max([a.max() for a in data[test]])
+ data_min = np.min([a.min() for a in data[test]])
+ y = (data_max * 1.05)
+ h = 0.025 * (data_max - data_min)
+ d_ = d * 0.15 * (data_max - data_min)
+ plt.plot([x1, x1, x2, x2], np.array([y - h, y, y, y - h]) + d_, c='k')
+ plt.text((x1 + x2) / 2, y + h + d_, significance, ha='center', va='bottom')
+
+
+
+# plt.gca().spines['top'].set_visible(False)
+# plt.gca().spines['right'].set_visible(False)
+
for cell_type, cell_results in results.items():
+ for key, result in cell_results.items():
+ if key not in title_xlabel:
+ continue
+ fig = plt.figure()
+ plt.suptitle(cell_type + ' ' + title_xlabel[key][0])
+ violinplot(result, labels=labels, colors=colors, statistics=stat_values[cell_type][key])
+ plt.ylabel(title_xlabel[key][1])
+# plt.tight_layout()
+ plt.grid(False)
+ despine()
+ savefig(output_path / "figures" / f'{cell_type}_violin_{key}')
+
action = project.require_action("comparisons-allcells")
+
copy_tree(output_path, str(action.data_path()))
+
septum_mec.analysis.registration.store_notebook(action, "20_comparisons_allcells.ipynb")
+
+
\n", + " | entity | \n", + "unit_idnum | \n", + "channel_group | \n", + "date | \n", + "Baseline I | \n", + "11 Hz | \n", + "Baseline II | \n", + "30 Hz | \n", + "
---|---|---|---|---|---|---|---|---|
51 | \n", + "1833 | \n", + "8 | \n", + "0 | \n", + "20719 | \n", + "7.900527 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
85 | \n", + "1833 | \n", + "13 | \n", + "0 | \n", + "20719 | \n", + "NaN | \n", + "5.415361 | \n", + "6.456882 | \n", + "9.526984 | \n", + "
86 | \n", + "1833 | \n", + "14 | \n", + "0 | \n", + "20719 | \n", + "NaN | \n", + "16.681112 | \n", + "16.498883 | \n", + "NaN | \n", + "
58 | \n", + "1833 | \n", + "23 | \n", + "0 | \n", + "200619 | \n", + "16.171078 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
127 | \n", + "1833 | \n", + "26 | \n", + "0 | \n", + "200619 | \n", + "NaN | \n", + "NaN | \n", + "6.990117 | \n", + "6.953565 | \n", + "
... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "
139 | \n", + "1849 | \n", + "835 | \n", + "4 | \n", + "150319 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "3.680061 | \n", + "
43 | \n", + "1849 | \n", + "851 | \n", + "5 | \n", + "60319 | \n", + "23.736187 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
65 | \n", + "1849 | \n", + "932 | \n", + "7 | \n", + "280219 | \n", + "5.661950 | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
74 | \n", + "1849 | \n", + "937 | \n", + "7 | \n", + "280219 | \n", + "NaN | \n", + "9.485790 | \n", + "NaN | \n", + "NaN | \n", + "
105 | \n", + "1849 | \n", + "939 | \n", + "7 | \n", + "280219 | \n", + "NaN | \n", + "NaN | \n", + "12.721755 | \n", + "NaN | \n", + "
137 rows × 8 columns
\n", + "\n", + " | Baseline I | \n", + "11 Hz | \n", + "Baseline II | \n", + "30 Hz | \n", + "LMM Baseline I - 11 Hz | \n", + "LMM Baseline I - Baseline II | \n", + "LMM Baseline I - 30 Hz | \n", + "LMM 11 Hz - Baseline II | \n", + "LMM 11 Hz - 30 Hz | \n", + "LMM Baseline II - 30 Hz | \n", + "
---|---|---|---|---|---|---|---|---|---|---|
Average rate | \n", + "9.8e+00 ± 9.3e-01 (63) | \n", + "1.1e+01 ± 1.0e+00 (56) | \n", + "1.0e+01 ± 1.0e+00 (46) | \n", + "8.5e+00 ± 1.1e+00 (35) | \n", + "6.9e-01, -6.0e-01 | \n", + "8.2e-01, 3.1e-01 | \n", + "8.4e-01, 3.3e-01 | \n", + "5.1e-01, 5.9e-01 | \n", + "6.2e-01, -1.2e+00 | \n", + "6.8e-01, -5.1e-01 | \n", + "
Gridness | \n", + "3.7e-01 ± 5.6e-02 (63) | \n", + "4.0e-01 ± 5.1e-02 (56) | \n", + "5.3e-01 ± 3.7e-02 (46) | \n", + "5.7e-01 ± 4.9e-02 (35) | \n", + "8.5e-01, -2.8e-02 | \n", + "NaN | \n", + "4.1e-01, -1.5e-01 | \n", + "2.2e-01, 1.5e-01 | \n", + "3.2e-01, 1.2e-01 | \n", + "8.6e-01, -2.7e-02 | \n", + "
Sparsity | \n", + "6.6e-01 ± 2.4e-02 (63) | \n", + "7.1e-01 ± 3.1e-02 (56) | \n", + "6.6e-01 ± 3.2e-02 (46) | \n", + "6.4e-01 ± 3.7e-02 (35) | \n", + "2.5e-01, -2.6e-02 | \n", + "9.3e-01, -5.2e-03 | \n", + "5.0e-01, -4.1e-02 | \n", + "7.5e-02, -2.5e-02 | \n", + "NaN | \n", + "5.8e-01, -1.9e-02 | \n", + "
Selectivity | \n", + "5.3e+00 ± 4.3e-01 (63) | \n", + "5.4e+00 ± 5.9e-01 (56) | \n", + "6.2e+00 ± 6.7e-01 (46) | \n", + "6.8e+00 ± 6.7e-01 (35) | \n", + "4.1e-01, 1.9e-01 | \n", + "6.6e-01, 6.6e-01 | \n", + "5.5e-01, -9.3e-01 | \n", + "3.8e-01, 3.7e-01 | \n", + "1.6e-01, 1.1e+00 | \n", + "9.3e-01, 4.1e-02 | \n", + "
Information rate | \n", + "1.4e+00 ± 8.6e-02 (63) | \n", + "9.3e-01 ± 6.9e-02 (56) | \n", + "1.3e+00 ± 1.0e-01 (46) | \n", + "1.1e+00 ± 1.1e-01 (35) | \n", + "1.7e-02, 4.0e-01 | \n", + "4.3e-02, -9.7e-02 | \n", + "4.3e-06, 3.0e-01 | \n", + "1.0e-01, 3.3e-01 | \n", + "1.6e-01, 2.5e-01 | \n", + "9.5e-01, 2.7e-02 | \n", + "
Information specificity | \n", + "2.5e-01 ± 3.4e-02 (63) | \n", + "2.2e-01 ± 4.5e-02 (56) | \n", + "2.3e-01 ± 3.4e-02 (46) | \n", + "2.4e-01 ± 3.8e-02 (35) | \n", + "NaN | \n", + "2.3e-01, -3.0e-02 | \n", + "6.4e-01, 2.0e-02 | \n", + "3.2e-01, 5.6e-02 | \n", + "2.2e-01, 5.6e-02 | \n", + "3.3e-01, 2.0e-02 | \n", + "
Max rate | \n", + "3.6e+01 ± 2.1e+00 (63) | \n", + "3.6e+01 ± 2.2e+00 (56) | \n", + "4.2e+01 ± 2.4e+00 (46) | \n", + "3.7e+01 ± 2.5e+00 (35) | \n", + "7.6e-01, 1.3e+00 | \n", + "3.4e-01, 3.3e+00 | \n", + "7.8e-01, 1.9e+00 | \n", + "1.7e-01, 5.5e+00 | \n", + "9.6e-02, 6.5e+00 | \n", + "7.2e-01, 1.7e+00 | \n", + "
Interspike interval cv | \n", + "2.2e+00 ± 8.9e-02 (63) | \n", + "2.0e+00 ± 1.4e-01 (56) | \n", + "2.2e+00 ± 8.0e-02 (46) | \n", + "2.3e+00 ± 1.1e-01 (35) | \n", + "8.3e-02, 1.7e-01 | \n", + "NaN | \n", + "8.3e-01, 5.5e-02 | \n", + "NaN | \n", + "9.4e-02, 4.1e-01 | \n", + "9.6e-01, 1.4e-02 | \n", + "
Burst event ratio | \n", + "2.3e-01 ± 1.1e-02 (63) | \n", + "2.3e-01 ± 1.2e-02 (56) | \n", + "2.3e-01 ± 1.1e-02 (46) | \n", + "1.8e-01 ± 1.2e-02 (35) | \n", + "7.7e-01, -4.8e-03 | \n", + "7.4e-01, -1.1e-02 | \n", + "4.7e-03, 5.7e-02 | \n", + "7.7e-01, 3.5e-03 | \n", + "NaN | \n", + "1.3e-02, 3.9e-02 | \n", + "
In-field mean rate | \n", + "1.5e+01 ± 1.2e+00 (63) | \n", + "1.6e+01 ± 1.3e+00 (56) | \n", + "1.7e+01 ± 1.2e+00 (46) | \n", + "1.3e+01 ± 1.3e+00 (35) | \n", + "9.7e-01, -6.9e-02 | \n", + "7.5e-01, 4.7e-01 | \n", + "3.6e-01, 1.8e+00 | \n", + "4.6e-01, 1.2e+00 | \n", + "6.9e-01, -9.9e-01 | \n", + "6.7e-01, 5.9e-01 | \n", + "
Out-field mean rate | \n", + "7.3e+00 ± 7.9e-01 (63) | \n", + "8.8e+00 ± 9.0e-01 (56) | \n", + "7.8e+00 ± 8.6e-01 (46) | \n", + "6.0e+00 ± 8.7e-01 (35) | \n", + "5.1e-01, -7.0e-01 | \n", + "7.3e-01, 3.3e-01 | \n", + "6.5e-01, 6.8e-01 | \n", + "7.3e-01, 2.2e-01 | \n", + "3.1e-01, -1.9e+00 | \n", + "9.1e-01, 9.4e-02 | \n", + "
Max-field mean rate | \n", + "1.2e+01 ± 1.3e+00 (35) | \n", + "1.1e+01 ± 1.6e+00 (31) | \n", + "1.7e+01 ± 2.6e+00 (33) | \n", + "7.8e+00 ± 1.2e+00 (19) | \n", + "2.6e-01, 4.1e+00 | \n", + "8.9e-01, 1.3e+00 | \n", + "1.0e+00, -1.6e-02 | \n", + "3.8e-01, 5.3e+00 | \n", + "NaN | \n", + "9.8e-01, -2.2e-01 | \n", + "
Specificity | \n", + "4.2e-01 ± 2.9e-02 (63) | \n", + "3.9e-01 ± 3.5e-02 (56) | \n", + "4.3e-01 ± 3.1e-02 (46) | \n", + "4.7e-01 ± 4.0e-02 (35) | \n", + "2.0e-01, 2.6e-02 | \n", + "9.3e-01, -1.0e-02 | \n", + "5.5e-01, 4.1e-02 | \n", + "5.9e-01, 2.4e-02 | \n", + "4.2e-01, 4.5e-02 | \n", + "7.6e-01, -1.5e-02 | \n", + "
Speed score | \n", + "1.1e-01 ± 1.1e-02 (63) | \n", + "9.4e-02 ± 1.2e-02 (56) | \n", + "8.7e-02 ± 8.0e-03 (46) | \n", + "7.4e-02 ± 9.9e-03 (35) | \n", + "5.4e-01, 1.3e-02 | \n", + "6.8e-01, 9.4e-03 | \n", + "5.6e-01, 3.3e-02 | \n", + "1.5e-01, 3.6e-02 | \n", + "8.4e-01, 1.7e-02 | \n", + "NaN | \n", + "
Spacing | \n", + "5.6e-01 ± 2.0e-02 (63) | \n", + "5.4e-01 ± 2.0e-02 (56) | \n", + "5.2e-01 ± 1.6e-02 (46) | \n", + "4.9e-01 ± 1.5e-02 (35) | \n", + "3.0e-01, 3.5e-02 | \n", + "4.4e-01, -2.9e-02 | \n", + "2.2e-01, 6.5e-02 | \n", + "7.1e-01, 8.8e-03 | \n", + "1.7e-01, -4.1e-02 | \n", + "1.5e-01, 2.5e-02 | \n", + "
Field area | \n", + "4.5e-01 ± 7.6e-03 (63) | \n", + "4.3e-01 ± 7.8e-03 (56) | \n", + "4.4e-01 ± 8.6e-03 (46) | \n", + "4.4e-01 ± 9.3e-03 (35) | \n", + "2.3e-01, 1.5e-02 | \n", + "6.6e-01, -7.3e-03 | \n", + "7.8e-01, -6.6e-03 | \n", + "4.5e-01, 2.2e-03 | \n", + "8.6e-01, -2.6e-03 | \n", + "9.0e-01, 1.2e-03 | \n", + "
Head mean vec len | \n", + "8.7e-02 ± 8.5e-03 (63) | \n", + "7.7e-02 ± 8.6e-03 (56) | \n", + "6.7e-02 ± 7.1e-03 (46) | \n", + "8.8e-02 ± 7.9e-03 (35) | \n", + "7.5e-01, 6.8e-03 | \n", + "8.2e-04, -1.3e-02 | \n", + "6.7e-01, -6.8e-03 | \n", + "2.4e-01, -2.8e-02 | \n", + "8.7e-01, 2.3e-03 | \n", + "5.6e-01, -9.6e-03 | \n", + "
Border score | \n", + "2.1e-01 ± 1.3e-02 (63) | \n", + "2.1e-01 ± 1.2e-02 (56) | \n", + "1.8e-01 ± 1.3e-02 (46) | \n", + "1.9e-01 ± 1.5e-02 (35) | \n", + "9.5e-01, -2.4e-03 | \n", + "4.9e-01, -2.9e-02 | \n", + "5.8e-01, 2.0e-02 | \n", + "5.2e-08, -3.7e-02 | \n", + "9.5e-01, -2.1e-03 | \n", + "5.8e-01, -3.6e-02 | \n", + "