diff --git a/programming/code/firing_rates.py b/programming/code/firing_rates.py index 5d5d8f9..b38dac8 100644 --- a/programming/code/firing_rates.py +++ b/programming/code/firing_rates.py @@ -44,13 +44,13 @@ def get_instantaneous_rate(times, max_t=30., dt=1e-4): def plot_isi_rate(spike_times, max_t=30, dt=1e-4): - times = np.squeeze(spike_times[0][0])[:100000] - time, rate = get_instantaneous_rate(times, max_t=100000*dt) + times = np.squeeze(spike_times[0][0])[:50000] + time, rate = get_instantaneous_rate(times, max_t=50000*dt) rates = np.zeros((len(rate), len(spike_times))) for i in range(len(spike_times)): - _, rates[:, i] = get_instantaneous_rate(np.squeeze(spike_times[i][0])[:100000], - max_t=100000*dt) + _, rates[:, i] = get_instantaneous_rate(np.squeeze(spike_times[i][0])[:50000], + max_t=50000*dt) avg_rate = np.mean(rates, axis=1) rate_std = np.std(rates, axis=1) @@ -59,7 +59,7 @@ def plot_isi_rate(spike_times, max_t=30, dt=1e-4): ax2 = fig.add_subplot(312) ax3 = fig.add_subplot(313) - ax1.vlines(times[times < (100000*dt)], ymin=0, ymax=1, color="dodgerblue", lw=1.5) + ax1.vlines(times[times < (50000*dt)], ymin=0, ymax=1, color="dodgerblue", lw=1.5) ax1.set_ylabel("skpikes", fontsize=12) set_axis_fontsize(ax1, 12) @@ -112,13 +112,13 @@ def plot_bin_rate(spike_times, bin_width, max_t=30, dt=1e-4): ax1.vlines(times[times < (100000*dt)], ymin=0, ymax=1, color="dodgerblue", lw=1.5) ax1.set_ylabel("skpikes", fontsize=12) - ax1.set_xlim([0, 10]) + ax1.set_xlim([0, 5]) set_axis_fontsize(ax1, 12) ax2.plot(time, rate, label="binned rate, trial 1") ax2.set_ylabel("firing rate [Hz]", fontsize=12) ax2.legend(fontsize=12) - ax2.set_xlim([0, 10]) + ax2.set_xlim([0, 5]) set_axis_fontsize(ax2, 12) ax3.fill_between(time, avg_rate+rate_std, avg_rate-rate_std, color="dodgerblue", @@ -127,7 +127,7 @@ def plot_bin_rate(spike_times, bin_width, max_t=30, dt=1e-4): ax3.set_xlabel("times [s]", fontsize=12) ax3.set_ylabel("firing rate [Hz]", fontsize=12) ax3.legend(fontsize=12) - ax3.set_xlim([0, 10]) + ax3.set_xlim([0, 5]) ax3.set_ylim([0, 450]) set_axis_fontsize(ax3, 12) @@ -165,13 +165,13 @@ def plot_conv_rate(spike_times, sigma=0.05, max_t=30, dt=1e-4): ax1.vlines(times[times < (100000*dt)], ymin=0, ymax=1, color="dodgerblue", lw=1.5) ax1.set_ylabel("skpikes", fontsize=12) - ax1.set_xlim([0, 10]) + ax1.set_xlim([0, 5]) set_axis_fontsize(ax1, 12) ax2.plot(time, rate, label="convolved rate, trial 1") ax2.set_ylabel("firing rate [Hz]", fontsize=12) ax2.legend(fontsize=12) - ax2.set_xlim([0, 10]) + ax2.set_xlim([0, 5]) set_axis_fontsize(ax2, 12) ax3.fill_between(time, avg_rate+rate_std, avg_rate-rate_std, color="dodgerblue", @@ -180,19 +180,19 @@ def plot_conv_rate(spike_times, sigma=0.05, max_t=30, dt=1e-4): ax3.set_xlabel("times [s]", fontsize=12) ax3.set_ylabel("firing rate [Hz]", fontsize=12) ax3.legend(fontsize=12) - ax3.set_xlim([0, 10]) + ax3.set_xlim([0, 5]) ax3.set_ylim([0, 450]) set_axis_fontsize(ax3, 12) fig.set_size_inches(15, 10) fig.subplots_adjust(left=0.1, bottom=0.125, top=0.95, right=0.95) fig.set_facecolor("white") - fig.savefig("../lectures/images/concolved_rate.png") + fig.savefig("../lectures/images/convolved_rate.png") plt.close() if __name__ == "__main__": spike_times = spio.loadmat('lifoustim.mat')["spikes"] - # plot_isi_rate(spike_times) - # plot_bin_rate(spike_times, 0.05) - plot_conv_rate(spike_times, 0.05) + plot_isi_rate(spike_times) + plot_bin_rate(spike_times, 0.05) + plot_conv_rate(spike_times, 0.025) diff --git a/programming/lectures/plotting_spike_trains.tex b/programming/lectures/plotting_spike_trains.tex index 13d9e06..0926fbd 100644 --- a/programming/lectures/plotting_spike_trains.tex +++ b/programming/lectures/plotting_spike_trains.tex @@ -176,14 +176,14 @@ } \only <4> { \begin{figure} - \includegraphics[width=0.4\columnwidth]{images/badbarright} + \includegraphics[width=0.3\columnwidth]{images/badbarright} \end{figure} \vspace{0.5cm} \url{https://en.wikipedia.org/wiki/Misleading_graph} } \only <5> { \begin{figure} - \includegraphics[width=0.4\columnwidth]{images/badbarleft} + \includegraphics[width=0.3\columnwidth]{images/badbarleft} \end{figure} \vspace{0.5cm} \url{https://en.wikipedia.org/wiki/Misleading_graph} @@ -352,19 +352,18 @@ saveas(fig, 'spike_detection.pdf', 'pdf') \item Deutliche Unterscheidbarkeit von Kurven. \item Keine suggestive Darstellung. \item Ausgewogenheit von Linienst\"arken Schrift- und Plotgr\"o{\ss}e. - \item Vermeidung von Suggestiven Darstellungen. \item Fehlerbalken, wenn sie angebracht sind. \end{enumerate} \end{frame} \begin{frame}[plain] -\huge{2. Spiketrain Analyse I} +\huge{2. Spiketrain Analyse} \end{frame} \begin{frame} - \frametitle{Spiketrain Analyse I} + \frametitle{Spiketrain Analyse} \framesubtitle{Rasterplot} \begin{figure} \centering @@ -374,92 +373,221 @@ saveas(fig, 'spike_detection.pdf', 'pdf') \begin{frame} - \frametitle{Spiketrain Analyse I} + \frametitle{Spiketrain Analyse} \framesubtitle{Rasterplot} \"Ubung: \begin{enumerate} - \item Ladet die Datei: electrorecptor\_spike\_times.mat aus dem + \item Ladet die Datei: \code{lifoustim.mat} aus dem Ilias Ordner. \item Der Datensatz enth\"alt die Zeiten von Aktionspotentialen. - \item Schaut euch den Inhalt und skizziert wie das Problem gel\"ost - werden k\"onnte. - \item Erzeugt einen Rasterplot. + \item Erzeugt einen sch\"onen Rasterplot der Zellantworten, speichert ihn. + \item Welche Information liefert er, welche Information ist schwer + abzulesen? + \end{enumerate} +\end{frame} + +\begin{frame} + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH} + + Darstellung der Feurreate eines Neuron als Funktion der Zeit. Es + gibt verschiedene Methoden dieses \textbf{P}eri \textbf{S}timulus + \textbf{T}ime \textbf{H}istogram zu erstellen. + \begin{enumerate} + \item Auf Basis der \textit{instantanen} Feuerrate. + \item Auf Basis des Zeithistogramms. + \item Durch Faltung der Zellantwort mit einem Gauss Kern. \end{enumerate} \end{frame} \begin{frame} - \frametitle{Spiketrain Analyse I} - \framesubtitle{Feuerrate \"uber - die Zeit} + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH --- Instantane Feuerrate ---} + \Large{Berechnung des PSTHs durch die Instantane Feurerrate:} + \normalsize \begin{enumerate} \item Die Feuerrate kann aus dem Abstand zwischen zwei aufeinanderfolgenden Aktionspotentialen (\textbf{Interspikeinterval}) berechnet werden. \pause - \item Auch als \textbf{Instantane Feuerrate} bezeichnet. + \item Die \textbf{Instantane Feuerrate} wird aus dem Kehrwert des + Interspikeintervals berechnet. \end{enumerate} +\end{frame} + + +\begin{frame} + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH --- Instantane Feuerrate ---} \begin{figure} \centering - \includegraphics[width=0.5\columnwidth]{images/isi} + \includegraphics[width=0.9\columnwidth]{images/instantaneous_rate} \end{figure} \end{frame} \begin{frame} - \frametitle{Spiketrain Analyse I} - \framesubtitle{Feuerrate \"uber - die Zeit} + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH --- Instantane Feuerrate ---} + Berechnung des PSTHs durch die Instantane Feurerrate: + \textbf{Vorteile:} + \begin{enumerate} - \item Z.B. das \textbf{P}eri- \textbf{S}timulus - \textbf{T}ime - - \textbf{H}istogram, \textbf{PSTH} - \item Wird berechnet indem die Zeit in ``bins'' geteilt wird die - Anzahl Spikes pro bin gezaehlt werden. - \item Die Anzahl wird dann in eine Feuerrate umgerechnet. - \end{enumerate}\pause + \item Sehr einfach zu Berechnen. + \item Macht keine Annahmen \"uber ein Zeitraster, oder die Zeitskala + der neuronalen Verarbeitung. + \end{enumerate} + + \textbf{Nachteile:} + \begin{enumerate} + \item Die Feuerrate ist nie null, auch wenn f\"ur lange Zeit kein + Aktionspotential auftritt. + \item Verh\"alt sich im Fourrier Raum nicht sehr sch\"on. + \end{enumerate} +\end{frame} + + +\begin{frame} + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH --- Binning Methode ---} + \Large{Binning Methode:} + \normalsize + \begin{enumerate} + \item Die Zeitachse wird in gleich gro{\ss}e Abschnitte ``bins'' + unterteilt. + \item F\"ur jedes ``bin'' wird die Anzahl vorkommender + Aktionspotentiale gez\"ahlt. + \item Der Spike-count pro bin muss nun noch in die Rate umgerechnet + werden. + \end{enumerate} +\end{frame} + + +\begin{frame} + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH --- Binning Methode ---} \begin{figure} - \centering - \includegraphics[width=0.5\columnwidth]{images/binning} + \includegraphics[width=0.9\columnwidth]{images/binned_rate} \end{figure} \end{frame} +\begin{frame} + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH --- Binning Methode ---} + + Berechnung des PSTHs durch die Binning Methode: + + \textbf{Vorteile:} + \begin{enumerate} + \item Sehr einfach zu Berechnen. + \item Zeigt nur da Aktivit\"at an, wo auch Aktionspotentiale + generiert wurden. + \end{enumerate} + + \textbf{Nachteile:} + \begin{enumerate} + \item Mach Annahmen \"uber die relevante Zeitskala neuronaler + Verarbeitung. + \item Die Zeitachse wird diskretisiert. + \item Verh\"alt sich im Fourrier Raum nicht sehr sch\"on. + \end{enumerate} +\end{frame} + + +\begin{frame}[fragile] + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH --- Faltungsmethode ---} + \Large{Faltung mit einem Gauss Kern:} + \normalsize + \[r_{est}(t) = \int_{-\infty}^{\infty}d\tau \omega(\tau)\rho(t-\tau) \] + + wobei $\omega(\tau)$ der Gauss Kern und $\rho(t)$ die Antwortfunktion ist. + + Gl\"ucklicherweise m\"ussen wir das nicht selbst implementieren... +\end{frame} + + \begin{frame}[fragile] - \frametitle{Spiketrain Analyse I} - \framesubtitle{Feuerrate \"uber die Zeit} + \frametitle{Spiketrain Analyse} + \framesubtitle{Zeitabh\"angige Feuerrate, PSTH --- Faltungsmethode ---} + \large Algortihmus: + \normalsize \begin{enumerate} - \item Z.B. das \textbf{P}eri- \textbf{S}timulus - \textbf{T}ime - - \textbf{H}istogram, \textbf{PSTH} - \item Wird berechnet indem man die Aktivit\"at bin\"ar ausdr\"uckt. - \item Jede 1 wird dann duch einen ``Kern'' ersetzt. - \item Der Vorgang heisst Faltung (\verb+conv+). - \end{enumerate}\pause + \item Die neuronalen Antworten werden ``bin\"ar'' ausgedr\"uckt. + \item Ein Filterkern wird berechnet, der das Integral 1 hat. + \item Mithilfe der Faltung (\code{conv} Funktion) wird jede 1 durch + den ``Kern'' ersetzt.\\ + \code{conv(x, kern, 'mode', 'same')} + \end{enumerate} +\end{frame} + + +\begin{frame} + \frametitle{Spiketrain Analyse} + \framesubtitle{Feurerrate als Funktion der Zeit --- Faltungsmethode ---} \begin{figure} - \centering - \includegraphics[width=0.5\columnwidth]{images/conv} + \includegraphics[width=0.9\columnwidth]{images/convolved_rate} \end{figure} \end{frame} -\begin{frame} [fragile] - \frametitle{Spiketrain Analyse I} - \framesubtitle{\"Ubung} - \begin{enumerate} - \item Berechnet die Feuerrate eines Neurons mit einer der drei Methoden. - \item Die Abbildung soll f\"ur eine einspaltige Abbildung im - \textit{Journal of Neuroscience} geeignet sein - (\url{http://www.jneurosci.org/site/misc/ifa_illustrations.xhtml}). - \item Erzeugt/ver\"andert/erweitert das Programm zum plotten so, dass - die Abbildung automatisch erstellt und gespeichert wird. - \item Speichert die Abbildung als pdf. - \item Ladet den Stimulus aus dem Ilias Ordner und benutzt die - \verb+subplot+ Funktion um den Stimulus zu der neuronalen - Aktivit\"at zu plotten. - \end{enumerate} +\begin{frame} + \frametitle{Spiketrain Analyse} + \framesubtitle{Feurerrate als Funktion der Zeit --- Faltungsmethode ---} + \textbf{Vorteile:} + \begin{enumerate} + \item Sehr ``nat\"urliche'' erscheinende Darstellung. + \item Sehr gutes Verhalten im Fourrier Raum. + \end{enumerate} + + \textbf{Nachteile:} + \begin{enumerate} + \item Relativ rechenintensiv. + \item Macht Annahmen \"uber die Zeitskalen neuronaler Verarbeitung. + \end{enumerate} +\end{frame} + +\begin{frame}[plain] + \huge{3. Analyse der Beziehung zwischen Stimulus und Antwort} +\end{frame} + + +\begin{frame}[fragile] + \frametitle{Spiketrain Analyse} + \framesubtitle{Spike-Triggered-Average} + \begin{itemize} + \item[] Die Antworten darzustellen ist gut und sch\"on, aber was sagt es uns?\pause + \item[] Idealerweise wollen wir die Antworten in Beziehung zum + hervorrufenden Stimulus setzen. + \item[] Eine Methode ist der sogenannte \textbf{Spike-Triggered-Average} (STA). + \end{itemize} \end{frame} + \begin{frame}[fragile] \frametitle{Spiketrain Analyse} \framesubtitle{Spike-Triggered-Average} + + Der STA stellt den (mittleren) Stimulus dar, der zu einem + Aktionspotential gef\"uhrt hat: + + \begin{equation} + STA(\tau) = \frac{1}{\langle n \rangle} \left\langle \displaystyle\sum_{i=1}^{n}{s(t_i - \tau)} \right\rangle + \end{equation} + Wobei: $\tau$ ist eine bestimmte Zeit relativ zur Zeit eines + Aktionspotentials, $t_i$ ist der Zeitpunkt eines APs, $s(t)$ ist der + Stimulus.\\ + + Leider m\"ussen wir das selbst implementieren... +\end{frame} + + +\begin{frame}[fragile] + \frametitle{Spiketrain Analyse} + \framesubtitle{Spike-Triggered-Average} + \large{Algorithmus:} + \normalsize \begin{enumerate} \item Der \textbf{STA} ist der mittlere Stimulus, der zu einem Aktionspotential f\"uhrt. \item F\"ur jeden Spike wird ein entsprechender Abschnitt um die Zeit des Spikes herausgeschnitten. @@ -471,4 +599,45 @@ saveas(fig, 'spike_detection.pdf', 'pdf') \end{figure} \end{frame} +\begin{frame}[fragile] + \frametitle{Spiketrain Analyse} + \framesubtitle{Spike-Triggered-Average} + \vspace{-1em} + \begin{figure} + \centering + \includegraphics[width=0.6\columnwidth]{images/sta} + \end{figure} + \pause + \vspace{-0.5em} + Welche Information liefert der \textbf{STA}? + \small + \begin{enumerate} + \item Gibt es eine Beziehung zwischen Stimulus und Antwort?\pause + \item Gibt es eine Verz\"ogerung zwischen Stimulus und Antwort? Wie + gro{\ss} ist diese?\pause + \item Wie weit h\"angt das Auftreten eines Aktionspotentials von der + Vergangenheit ab? \pause + \item Kann die Zelle in die Zukunft sehen? + \end{enumerate} +\end{frame} + \end{document} + + + +\begin{frame} [fragile] + \frametitle{Spiketrain Analyse} + \framesubtitle{\"Ubung} + \begin{enumerate} + \item Berechnet die Feuerrate eines Neurons mit einer der drei Methoden. + \item Die Abbildung soll f\"ur eine einspaltige Abbildung im + \textit{Journal of Neuroscience} geeignet sein + (\url{http://www.jneurosci.org/site/misc/ifa_illustrations.xhtml}). + \item Erzeugt/ver\"andert/erweitert das Programm zum plotten so, dass + die Abbildung automatisch erstellt und gespeichert wird. + \item Speichert die Abbildung als pdf. + \item Ladet den Stimulus aus dem Ilias Ordner und benutzt die + \verb+subplot+ Funktion um den Stimulus zu der neuronalen + Aktivit\"at zu plotten. + \end{enumerate} +\end{frame} \ No newline at end of file