diff --git a/pointprocesses/lecture/pointprocessscetchA.eps b/pointprocesses/lecture/pointprocessscetchA.eps index 17a8e91..f862701 100644 --- a/pointprocesses/lecture/pointprocessscetchA.eps +++ b/pointprocesses/lecture/pointprocessscetchA.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchA.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Wed Oct 28 18:47:55 2015 +%%CreationDate: Mon Nov 2 19:55:25 2015 %%DocumentFonts: %%BoundingBox: 50 50 373 135 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchA.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (benda) + /Author (jan) % /Producer (gnuplot) % /Keywords () - /CreationDate (Wed Oct 28 18:47:55 2015) + /CreationDate (Mon Nov 2 19:55:25 2015) /DOCINFO pdfmark end } ifelse diff --git a/pointprocesses/lecture/pointprocessscetchB.eps b/pointprocesses/lecture/pointprocessscetchB.eps index 19d3b78..a246da8 100644 --- a/pointprocesses/lecture/pointprocessscetchB.eps +++ b/pointprocesses/lecture/pointprocessscetchB.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchB.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Wed Oct 28 18:47:56 2015 +%%CreationDate: Mon Nov 2 19:57:38 2015 %%DocumentFonts: %%BoundingBox: 50 50 373 237 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchB.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (benda) + /Author (jan) % /Producer (gnuplot) % /Keywords () - /CreationDate (Wed Oct 28 18:47:56 2015) + /CreationDate (Mon Nov 2 19:57:38 2015) /DOCINFO pdfmark end } ifelse diff --git a/programming/lectures/programming.tex b/programming/lectures/programming.tex new file mode 100644 index 0000000..414b8a8 --- /dev/null +++ b/programming/lectures/programming.tex @@ -0,0 +1,491 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{\tr{Programming basics}{Grundlagen der Programmierung in Matlab}} + +\section{Variablen und Datentypen} + +\subsection{Variablen} + +Eine Variable ist ein Zeiger auf eine Stelle im Speicher. Dieser +Zeiger hat einen Namen, den Variablennamen, und einen Datentyp +(Abbildung \ref{variablefig}).Im Speicher wird der Wert der Variablen +bin\"ar gespeichert. Wird auf den Wert der Variable zugegriffen, wird +dieses Bitmuster je nach Datentyp interpretiert. Das Beispiel in +Abbildung \ref{variablefig} zeigt, dass das gleiche Bitmuster im einen +Fall als 8-Bit Integer Datentyp zur Zahl 38 interpretiert wird und im +anderen Fall als Character zum kaufm\"annischen ``und'' ausgewertet +wird. In Matlab sind Datentypen nicht von sehr zentraler +Bedeutung. Wir werden uns dennoch sp\"ater etwas genauer mit ihnen +befassen. + +\begin{figure} +\centering +\begin{subfigure}{.5\textwidth} + \includegraphics[width=0.8\textwidth]{variable} + \label{variable:a} +\end{subfigure}% +\begin{subfigure}{.5\textwidth} + \includegraphics[width=.8\textwidth]{variableB} + \label{variable:b} +\end{subfigure} +\caption{\textbf{Variablen.} Variablen sind Zeiger auf eine Adresse + im Speicher, die einen Namen und einen Datentypen beinhalten. Im + Speicher ist der Wert der Variable bin\"ar gespeichert. Abh\"angig + vom Datentyp wird dieses Bitmuster unterschiedlich + interpretiert.}\label{variablefig} +\end{figure} + + +\subsection{Erzeugen von Variablen} +In Matlab kann eine Variable auf der Kommandozeile, in einem Skript +oder einer Funktion an beliebiger Stelle erzeugen. Das folgende +Listing zeigt zwei M\"oglichkeiten: +\footnotesize +\begin{lstlisting}[label=varListing1, caption=Erzeugen von Variablen] +>> y = [] +y = + [] +>> +>> x = 38 +x = + 38 +\end{lstlisting} +\normalsize + +Die Zeile 1 kann etwa so gelesen werden:''Erzeuge eine Variable mit +dem Namen y und weise ihr einen leeren Wert zu.'' Das +Gleichheitszeichen ist der sogenannte +\textit{Zuweisungsoperator}. Zeile 5 definiert eine Variable x, der +nun der Zahlenwert 38 zugewiesen wird. Da Matlab, wenn nicht anders +angegeben immer den ``double'' Datentypen benutzt, haben beide +Variablen diesen Datentyp. + +\footnotesize +\begin{lstlisting}[label=varListing2, caption={Erfragen des Datentyps einer Variable, Listen aller definierten Variablen.}] +>>disp(class(x)) + double +>> +>> who % oder whos um mehr Information zu bekommen +\end{lstlisting} +\normalsize + +Bei der Namensgebung ist zu beachten, dass Matlab auf Gro{\ss}- und +Kleinschreibung achtet und ein Variablennane mit einem alphabethischen +Zeichen beginnen muss. Des Weiteren sind Umlaute, Sonder- und +Leerzeichen in Variablennamen nicht erlaubt. + + +\subsection{Arbeiten mit Variablen} + +Nat\"urlich kann man mit den Variablen auch arbeiten, bzw +rechnen. Matlab kennt alle normalen arithmetischen Operatoren wie +\code{+, -, *. /}. Die Potenz wird \"uber das Dach Symbol \code{\^} +dargestellt. Das folgende Listing zeigt, wie sie benutzt werden. + +\footnotesize +\begin{lstlisting}[label=varListing3, caption={Rechnen mit Variablen.}] +>> x = 1; +>> x + 10 +ans = + 11 +>> +>> x % x wurde nicht veraendert +ans = + 1 +>> +>> y = 2; +>> +>> x + y +ans = + 3 +>> +>> z = x + y +z = + 3 +>> +>> z = z * 5; +>> z +z = + 15 +>> +>> clear z +\end{lstlisting} +\normalsize + +Beachtenswert ist z.B. in Zeilen 3 und 6, dass wir mit dem Inhalt +einer Variablen rechnen k\"onnen, ohne dass dadurch ihr Wert +ver\"andert w\"urde. Wenn der Wert einer Variablen ver\"andert werden +soll, dann muss dieser der Variable expliyit zugewiesen werden (mit +dem \code{=} Zuweisungsoperator, z.B. Zeilen 16, 20). Zeile 25 zeigt +wie eine einzelne Variable gel\"oscht wird. + + +\subsection{Datentypen} + +Der Datentyp bestimmt, wie die im Speicher abgelegten Bitmuster +interpretiert werden. Die Wichtigsten Datentpyen sind folgende: + +\begin{itemize} +\item \textit{integer} - Ganze Zahlen. Hier gibt es mehrere + Unterarten, die wir in Matlab (meist) ignorieren k\"onnen. +\item \textit{double} - Flie{\ss}kommazahlen. +\item \textit{complex} - Komplexe Zahlen. +\item \textit{logical} - Boolesche Werte, die als wahr + (\textit{true}) oder falsch (\textit{false}) interpretiert werden. +\item \textit{char} - ASCII Zeichen +\end{itemize} + +Unter den numerischen Datentypen gibt es verschiedene Arten mit +unterschiedlichem Speicherbedarf und Wertebreich. + +\begin{table}[] +\centering +\caption{Gel\"aufige Datentypen und ihr Wertebereich.} +\label{dtypestab} +\begin{tabular}{l|l|c|cl} +Datentyp & Speicherbedarf & Wertebereich & Beispiel \\ \cline{1-4} +double & 64 bit & & Flie{\ss}kommazahlen.\\ \cline{1-4} +int & 64 bit & $-2^{31} bis 2^{31}-1$ & Ganzzahlige Werte \\ \cline{1-4} +int16 & 64 bit & $-2^{15} bis 2^{15}-1$ & Digitalisierte Spannungen. \\ \cline{1-4} +uint8 & 64 bit & 0 bis 255 & Digitalisierte Imaging Daten. \\ \cline{1-4} + & & & +\end{tabular} +\end{table} + + +Matlab arbeitet meist mit dem ``double'' Datentyp wenn numerische +Daten gespeichert werden. Dennoch lohnt es sich, sich ein wenig mit +den Datentypen auseinanderzusetzen. Ein Szenario, dass in der +Neurobiologie nicht selten ist, ist, dass wir die elektrische +Aktivit\"at einer Nervenzelle messen. Die gemessenen Spannungen werden +mittels Messkarte digitalisiert und auf dem Rechner +gespeichert. Typischerweise k\"onnen mit solchen Messkarten Spannungen +im Bereich $\pm 10$\,V gemessen werden. Die Aufl\"osung der Wandler +betr\"agt typischerweise 16 bit. Das heisst, dass der gesamte +Spannungsbereich in $2^{16}$ Schritte aufgeteilt ist. Um Speicherplatz +zu sparen ist es sinnvoll, die gemessenen Daten als ``int16'' Werte im +Rechner abzulegen. Die Daten als ``echte'' Spannungen, also als +Flie{\ss}kommawerte, abzulegen w\"urde den 4-fachen Speicherplatz +ben\"otigen. + + + +\section{Vektoren und Matrizen} + +\begin{definition}[Vektoren und Matrizen] + Vektoren und Matrizen sind die wichtigsten Datenstrukturen in + Matlab. In andern Programmiersprachen spricht man von ein- + bzw. mehrdimensionalen Feldern. Felder sind Datenstrukturen, die + mehrere Werte des geleichen Datentyps in einer Variablen + vereinen. Da Matalb seinen Ursprung in der Verarbeitung von + mathematischen Vektoren und Matrizen hat werden sie hier auch so + genannt.\\ + + In Wahrheit existiert auch in Matlab kein Unterschied zwischen + beiden Datenstrukturen. Im Hintergrund sind auch Vektoren + 2-diemsensionale Matrizen bei denen eine Dimension die Gr\"o{\ss}e 1 + hat. +\end{definition} + + +\subsection{Vektoren} + +Im Gegensatz zu den Variablen, die einzelene Werte beinhalten, +Skalare, kann ein Vektor mehrere Werte des gleichen Datentyps +beinhalten (Abbildung \ref{vectorfig} B). Die Variable ``test'' +enth\"alt in diesem Beispiel vier ganzzahlige Werte. + + +\begin{figure} + \includegraphics[width=0.8\columnwidth]{scalarArray} + \caption{\textbf{Skalare und Vektoren. A)} Eine skalare Variable kann + genau einen Wert tragen. \textbf{B)} Ein Vektor kann mehrer + Werte des gleichen Datentyps (z.B. ganzzahlige Integer Werte) + beinhalten. Matlab kennt den Zeilen- (row-) und Spaltenvektor + (columnvector).}\label{vectorfig} +\end{figure} + +Das folgende Listing zeigt, wie einfache Vektoren erstellt werden +k\"onnen. + +\footnotesize +\begin{lstlisting}[label=arrayListing1, caption={Erstellen einfacher Zeilenvektoren.}] +>> a = [0 1 2 3 4 5 6 7 8 9] % Erstellen eines Zeilenvektors + a = + 0 1 2 3 4 5 6 7 8 9 +>> +>> b = (0:9) % etwas bequemer + b = + 0 1 2 3 4 5 6 7 8 9 +>> +>> c = (0:2:10) + c = + 0 2 4 6 8 10 +\end{lstlisting} +\normalsize + +Die L\"ange eines Vektors kann mithilfe der Funktion \code{length()} +bestimmt werden. \"Ahnliche Information kann man \"uber die Funktion +\code{size()} erhalten. Im Falle des Vektors \code{a} von oben erh\"alt +man folgende Ausgabe: + +\footnotesize +\begin{lstlisting}[label=arrayListing2, caption={Gr\"o{\ss}e von Vektoren.}] +>> length(a) +ans = + 10 +>> size(a) +ans = + 1 10 +\end{lstlisting} +\normalsize + +Diese Ausgabe zeigt, dass Vektoren im Grunde 2-dimensional sind. Bei +einem Zeilenvektor hat die erste Dimension die Gr\"o{\ss}e +1. \code{length(a)} gibt die l\"angste Ausdehnung an. + +\footnotesize +\begin{lstlisting}[label=arrayListing3, caption={Spaltenvektoren.}] +>> b = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] % Erstellen eines Spaltenvektors + b = + 1 + 2 + .... + 9 + 10 +>> length(b) +ans = + 10 +>> size(b) +ans = + 10 1 +>> b = b'; % Transponieren +>> size(b) +ans = + 1 10 +\end{lstlisting} + +Der \code{'}- Operator transponiert den Spaltenvektor zu einem +Zeilenvektor. + +\subsubsection{Zugriff auf Inhalte von Vektoren} +\begin{figure} + \includegraphics[width=0.4\columnwidth]{arrayIndexing} + \caption{\textbf{Indices von Vektoren.} Jedes Feld eines Vektors hat + einen Index mit dem auf den jeweiligen Inhalt zugegriffen werden + kann.}\label{vectorindexingfig} +\end{figure} + +Der Zugriff auf die Inhalte eines Vektors erfolgt \"uber den Index +(Abbildung \ref{vectorindexingfig}). Jedes Feld in einem Vektor hat +einen \textit{Index} \"uber den auf die Werte des Vektors zugegriffen +werden kann. Dabei spielt es keine Rolle, ob es sich um einen Zeilen- +oder Spaltenvektor handlet. \textbf{Achtung!} Anders als viele andere +Sprachen beginnt Matlab mit dem Index 1. Die Listings +\ref{arrayListing4} und \ref{arrayListing5} zeigen wie man mit dem +Index auf die Inhalte zugreifen kann. + +\footnotesize +\begin{lstlisting}[label=arrayListing4, caption={Zugriff auf den Inhalt von Vektoren I}] +>> a = (11:20); +>> a(1) % das 1. Element +ans = + 11 +>> a(5) % das 5. Element +ans = + 15 +>> a(end) % das letzte Element +ans = + 20 +\end{lstlisting} +\normalsize + +Hierbei kann man auf einzelne Werte zugreifen oder, analog zur +Erzeugung von Vektoren, die \code{:} Notation verwenden um auf mehrere +Element gleichzeitig zuzugreifen. + +\footnotesize +\begin{lstlisting}[caption={Zugriff auf den Inhalt von Vektoren I}, label=arrayListing5] +>> a([1 3 5]) % das 1., 3. und 5. Element +ans = + 11 13 15 +>> a(2:4) % alle element von Index 2 bis 4 +ans = + 12 13 14 +>> a(1:2:end) %jedes zweite Element +ans = + 11 13 15 17 19 +\end{lstlisting} +\normalsize + +\paragraph{Frage:} +Der R\"uckgabewert von \code{size(a)} ist wieder ein Vektor der +L\"ange 2. Wie k\"onnte man also die Gr\"o{\ss}e von \code{a} in der +zweiten Dimension herausfinden? + +\paragraph{Antwort:} +Man speichert den R\"uckgabewert in einer Variable (\code{s = size(a);}) +und gibt den Inhalt an der Stelle 2 aus (\code{disp(s(2))}). + + +\subsubsection{Operationen auf Vektoren} + +Nat\"urlich kann man mit Vektoren auch rechnen. Listing +\ref{arrayListing5} zeigt Rechnungen mit Vektoren. + +\footnotesize +\begin{lstlisting}[caption={Rechnen mit Vektoren.},label=arrayListing5] +>> a = (0:2:8); +>> a + 5 % addiere einen Skalar +ans = + 5 7 9 11 13 + +>> a - 5 % subtrahiere einen Skalar +ans = + -5 -3 -1 1 3 + +>> a .* 2 % Multiplication +ans = + 0 4 8 12 16 + +>> a ./ 2 % Division +ans = + 0 1 2 3 4 + +>> a(1:3) + a(2:4) % Addieren von 2 Vektoren +ans = + 2 6 10 +>> +>> a(1:2) + a(2:4) % Vektoren muessen gleich gross sein! + ??? Error using ==> plus + Matrix dimensions must agree. +\end{lstlisting} +\normalsize + +Wird ein Vektor mit einem skalaren Wert verrechnet, dann ist das +Problemlos m\"oglich. Bei der Multiplikation (Zeile 10), der Division +(Zeile 14) und auch der Potenzierung sollte man mit vorangestellem '.' +klar machen, dass es sich um einen \textit{elementweise} Verarbeitung +handelt. F\"ur diese elementweisen Operationen kennt Matlab die +Operatoren \code{.*, ./} und \code{.\^}. Die einfachen Operatoren sind +im Kontext von Vektoren und Matrizen anders belegt, als man es +vielleicht erwarten w\"urde. Es sind dann die entsprechenden +Matrixoperationen, die man aus der linearen Algebrar kennt (s.u.). + +Zu Beachten ist des Weiteren noch die Fehlermeldung am SChluss von +Listing \ref{arrayListing5}. Wenn zwei Vektoren (elementweise) +miteinander verrechnet werden sollen muss nicht nur die Anzahl Element +übereinstimmen sondern es muss auch das Layout (Zeilen- oder +Spaltenvektoren) \"ubereinstimmen. + + +Will man Elemente aus einem Vektor entfernen, dann weist man den +entsprechenden Zellen einen leeren Wert (\code{[]}) zu. + +\footnotesize +\begin{lstlisting}[label=arrayListing6, caption={L\"oschen von Elementen aus einem Vektor.}] +>> a = (0:2:8); +>> length(a) +ans = + 5 + +>> a(1) = [] % loesche das erste Element +a = 2 4 6 8 + +>> a([1 3]) = [] +a = 4 8 + +>> length(a) +ans = + 2 +\end{lstlisting} + +Neben dem L\"oschen von Vektorinhalten kann man Vektoren auch +erweitern oder zusammensetzen. Auch hier muss das Layout der Vektoren +\"ubereinstimmen (Listing \ref{arrayListing7}, Zeile 12). Will man +einen Vektor erweitern, kann man \"uber das Ende hinaus +zuweisen. Matlab erweitert dann die Variable. Auch hierbei muss auf +das Layout geachtet werden. Zudem ist dieser Vorgang +``rechenintensiv'' und man sollte, soweit m\"oglich, vermeiden +Vektoren bei Bedarf einfach zu erweitern. + +\footnotesize +\begin{lstlisting}[caption={Zusammenf\"ugen und erweitern von Vektoren.}, label=arrayListing7] +>> a = (0:2:8); +>> b = (10:2:19); +>> c = [a b] % erstelle einen Vektor aus einer Liste von Vektoren + c = + 0 2 4 6 8 10 12 14 16 18 +>> length(c) +ans = + 10 +>> length(a) + length(b) +ans = + 10 +>> c = [a b']; +Error using horzcat +Dimensions of matrices being concatenated are not consistent. + +>> b(6:8) = [1 2 3 4]; +\end{lstlisting} + + +\subsection{Matrizen} + +\begin{figure} + \includegraphics[width=0.5\columnwidth]{matrices} + \caption{\textbf{Indices von Vektoren.} Jedes Feld eines Vektors hat + einen Index mit dem auf den jeweiligen Inhalt zugegriffen werden + kann.}\label{vectorindexingfig} +\end{figure} + + +\begin{figure} + \includegraphics[width=0.9\columnwidth]{matrixIndexing} + \caption{\textbf{Indices von Vektoren.} Jedes Feld eines Vektors hat + einen Index mit dem auf den jeweiligen Inhalt zugegriffen werden + kann.}\label{vectorindexingfig} +\end{figure} + +\begin{figure} + \includegraphics[width=0.9\columnwidth]{matrixLinearIndexing} + \caption{\textbf{Indices von Vektoren.} Jedes Feld eines Vektors hat + einen Index mit dem auf den jeweiligen Inhalt zugegriffen werden + kann.}\label{vectorindexingfig} +\end{figure} + + + +\section{Boolesche Operationen} + + +\section{Logisches Indizieren} + + +\section{Kontrollstrukturen} + +\begin{definition}[Kontrollstrukturen] + In der Regel wird ein Programm Zeile f\"ur Zeile von oben nach unten + ausgef\"uhrt. Manchmal muss der Kontrollfluss aber so gesteuert + werden, dass bestimmte Teile des Programmcodes wiederholt oder nur + unter bestimmten Bedingungen ausgef\"uhrt werden. Von grosser + Bedeutung sind hier zwei Strukturen: + \begin{enumerate} + + \item Schleifen. + \item Bedingte Anweisungen und Verzweigungen. + \end{enumerate} +\end{definition} + + +\section{Skripte und Funktionen} + + +\section{Graphische Darstellung von Daten} + + +\begin{figure} + \includegraphics[width=0.9\columnwidth]{./images/convincing} + \caption{Die Folgen schlecht annotierter + Plots. \url{www.xkcd.com}} \label{xkcdplotting} +\end{figure} \ No newline at end of file diff --git a/scientificcomputing-script.tex b/scientificcomputing-script.tex index 891303c..faeaf4d 100644 --- a/scientificcomputing-script.tex +++ b/scientificcomputing-script.tex @@ -1,4 +1,4 @@ -\documentclass[12pt]{report} +g\documentclass[12pt]{report} \input{header} diff --git a/spike_trains/lecture/images/psth_comparison.pdf b/spike_trains/lecture/images/psth_comparison.pdf index b9a5275..0e37e59 100644 Binary files a/spike_trains/lecture/images/psth_comparison.pdf and b/spike_trains/lecture/images/psth_comparison.pdf differ diff --git a/spike_trains/lecture/images/reconstruction.pdf b/spike_trains/lecture/images/reconstruction.pdf index 7f5f663..5c48206 100644 Binary files a/spike_trains/lecture/images/reconstruction.pdf and b/spike_trains/lecture/images/reconstruction.pdf differ diff --git a/spike_trains/lecture/images/sta.pdf b/spike_trains/lecture/images/sta.pdf index db21b29..47187f1 100644 Binary files a/spike_trains/lecture/images/sta.pdf and b/spike_trains/lecture/images/sta.pdf differ diff --git a/spike_trains/lecture/psth_sta.tex b/spike_trains/lecture/psth_sta.tex index 59f4b6c..404b34a 100644 --- a/spike_trains/lecture/psth_sta.tex +++ b/spike_trains/lecture/psth_sta.tex @@ -26,9 +26,11 @@ Eine klassische Darstellung zeitabh\"angiger neuronaler Aktivit\"at ist das sogenannte Peri Stimulus Zeithistogramm (peri stimulus time histogram, PSTH). Es wird der zeitliche Verlauf der Feuerrate $r(t)$ dargestellt. Die Einheit der Feuerrate ist Hertz, das heisst, die -Anzahl Aktionspotentiale pro Sekunde. Dabei gibt es verschiedene -Methoden diese zu bestimmen. Drei solcher Methoden sind in Abbildung -\ref{psthfig} dargestellt. +Anzahl Aktionspotentiale pro Sekunde. Es verschiedene Methoden diese +zu bestimmen. Drei solcher Methoden sind in Abbildung \ref{psthfig} +dargestellt. Alle Methoden haben ihre Berechtigung und ihre Vor- und +Nachteile. Im folgenden werden die drei Methoden aus Abbildung +\ref{psthfig} n\"aher erl\"autert. \begin{figure} \includegraphics[width=\columnwidth]{psth_comparison} @@ -40,48 +42,93 @@ Methoden diese zu bestimmen. Drei solcher Methoden sind in Abbildung Gauss Kern bestimmt.}\label{psthfig} \end{figure} + \paragraph{Instantane Feuerrate} Ein sehr einfacher Weg, die zeitabh\"angige Feuerrate zu bestimmen ist -die sogenannte \textit{instantane Feuerrate}. Dabie wird die Feuerrate +die sogenannte \textit{instantane Feuerrate}. Dabei wird die Feuerrate aus dem Kehrwert des \textit{Interspike Intervalls}, der Zeit zwischen -zwei aufeinanderfolgender Aktionspotentiale, bestimmt. Die -abgesch\"atzte Feuerrate ist g\"ultig f\"ur das gesammte Interspike -Intervall. Sie ist sehr einfach zu berechnen und hat den Vorteil keine -Annahme \"uber eine relevante Zeitskala (der codierung oder des -Auslesemechanismus der postsynaptischen Zelle) zu machen. $r(t)$ ist -keine kontinuierliche Funktion, die Spr\"unge in der Feuerrate können f\"ur -manche Analysen nachteilig sein. +zwei aufeinander folgenden Aktionspotentialen (Abbildung \ref{isipsth} +A), bestimmt. Die abgesch\"atzte Feuerrate (Abbildung \ref{isipsth} B) +ist g\"ultig f\"ur das gesammte Interspike Intervall +\ref{isipsth}. Diese Methode hat den Vorteil, dass sie sehr einfach zu +berechnen ist und keine Annahme \"uber eine relevante Zeitskala (der +Kodierung oder des Auslesemechanismus der postsynaptischen Zelle) +macht. $r(t)$ ist allerdings keine kontinuierliche Funktion, die +Spr\"unge in der Feuerrate k\"onnen f\"ur manche Analysen nachteilig +sein. Des Weiteren ist die Feuerrate nie null, auch wenn lange keine +Aktionspotentiale generiert wurden. + +\begin{figure}[!htb] + \includegraphics[width=\columnwidth]{isi_method} + \caption{\textbf{Bestimmung des PSTH aus dem Interspike + Interval. A)} Skizze eines Rasterplots einer einzelnen + neuronalen Antwort. Jeder vertikale Strich notiert den Zeitpunkt + eines Aktionspotentials. Die Pfeile zwischen aufeinanderfolgenden + Aktionspotentialen illustrieren das Interspike + Interval. \textbf{B)} Der Kehrwert des Interspike Intervalls ist + die Feuerrate.}\label{isipsth} +\end{figure} + \paragraph{Binning Methode} -Bei der Binning Methode wird die Zeitachse in gleichm\"aßige Abschnitte -(Bins) eingeteilt und die Anzahl Aktionspotentiale, die in die -jeweiligen Bins fallen gez\"ahlt. Um diese Z\"ahlungen in die Feuerrate -umzurechnen muss noch mit der Binweite normiert werden. \textbf{Tipp:} -Um die Anzahl Spikes pro Bin zu berechnen kann die \code{hist} -Funktion benutzt werden. Das so berechnete PSTH hat wiederum eine -stufige Form, die von der Wahl der Binweite anh\"angt. Die Binweite -bestimmt die zeitliche Auflösung mit der Darstellung. \"Anderungen in -der Feuerrate, die innerhalb eines Bins vorkommen koennen nicht -aufglöst werden. Die Wahl der Binweite stellt somit eine Annahme \"uber -die relevante Zeitskala der Verarbeitung dar. Auch hier ist $r(t)$ -keine koninuierliche Funktion. +Bei der Binning Methode wird die Zeitachse in gleichm\"aßige +Abschnitte (Bins) eingeteilt und die Anzahl Aktionspotentiale, die in +die jeweiligen Bins fallen, gez\"ahlt (Abbildung \ref{binpsth} A). Um +diese Z\"ahlungen in die Feuerrate umzurechnen muss noch mit der +Binweite normiert werden. Die bestimmte Feuerrate gilt f\"ur das +gesamte Bin (Abbildung \ref{binpsth} B). \textbf{Tipp:} Um die Anzahl +Spikes pro Bin zu berechnen kann die \code{hist} Funktion benutzt +werden. Das so berechnete PSTH hat wiederum eine stufige Form, die von +der Wahl der Binweite anh\"angt. Die Binweite bestimmt die zeitliche +Aufl\"osung der Darstellung. \"Anderungen in der Feuerrate, die +innerhalb eines Bins vorkommen k\"onnen nicht aufgl\"ost werden. Die +Wahl der Binweite stellt somit eine Annahme \"uber die relevante +Zeitskala der Verarbeitung dar. Auch hier ist $r(t)$ keine +koninuierliche Funktion. + +\begin{figure}[h!] + \includegraphics[width=\columnwidth]{bin_method} + \caption{\textbf{Bestimmung des PSTH mit der Binning Methode. A)} + Skizze eines Rasterplots einer einzelnen neuronalen Antwort. Jeder + vertikale Strich notiert den Zeitpunkt eines + Aktionspotentials. Die roten gestrichelten Linien stellen die + Grenzen der Bins dar und die Zahlen geben den Spike Count pro Bin + an. \textbf{B)} Die Feuerrate erh\"alt man indem das + Zeithistogramm mit der Binweite normiert.}\label{binpsth} +\end{figure} \paragraph{Faltungsmethode} -Bei der Faltungsmethode geht man anders vor. Die Aktionspotentialfolge -wird ``bin\"ar'' dargestellt. Eine Antwort wird als Vektor dargestellt, -in dem die Zeitpunkte der Aktionspotentiale als 1 notiert werden. Alle -anderen Elemente des Vektors sind 0. Anschlie{\ss}end wir dieser -bin\"are Spiketrain mit einem Gausskern bestimmter Breite gefaltet. +Bei der Faltungsmethode geht man etwas anders vor. Die +Aktionspotentialfolge wird ``bin\"ar'' dargestellt. Das heisst, dass +eine Antwort als Vektor dargestellt wird, in welchem die Zeitpunkte der +Aktionspotentiale als 1 notiert werden. Alle anderen Elemente des +Vektors sind 0. Anschlie{\ss}end wir dieser bin\"are Spiketrain mit +einem Gauss Kern bestimmter Breite gefaltet. \[r(t) = \int_{-\infty}^{\infty}d\tau \omega(\tau)\rho(t-\tau) \], wobei $\omega(\tau)$ der Filterkern und $\rho(t)$ die bin\"are Antwort ist. Bildlich geprochen wird jede 1 in $rho(t)$ durch den Filterkern -ersetzt. Die Faltungsmethode f\"uhrt, anders als die anderen Methoden, -zu einer kontinuierlichen Funktion was f\"ur spektrale Analysen von -Vorteil sein kann. Die Wahl der Kernbreite bestimmt, \"ahnlich zur -Binweite, die zeitliche Aufl\"osung von $r(t)$. Man macht eine Annahme -\"uber die relevante Zeitskala. +ersetzt (Abbildung \ref{convpsth} A). Wenn der Kern richtig normiert +wurde (Integral 1), ergibt sich die Feuerrate direkt aus der +\"Uberlagerung der Kerne (Abb. \ref{convpsth} B). Die Faltungsmethode +f\"uhrt, anders als die anderen Methoden, zu einer kontinuierlichen +Funktion was f\"ur spektrale Analysen von Vorteil sein kann. Die Wahl +der Kernbreite bestimmt, \"ahnlich zur Binweite, die zeitliche +Aufl\"osung von $r(t)$. Man macht also eine Annahme \"uber die +relevante Zeitskala. + +\begin{figure}[h!] + \includegraphics[width=\columnwidth]{conv_method} + \caption{\textbf{Schematische Darstellung der Faltungsmethode. A)} + Rasterplot einer einzelnen neuronalen Antwort. Jeder vertikale + Strich notiert den Zeitpunkt eines Aktionspotentials. In der + Faltung werden die mit einer 1 notierten Aktionspotential durch + den Faltungskern ersetzt. \textbf{B)} Bei korrekter Normierung des + Kerns ergibt sich die Feuerrate direkt aus der \"Uberlagerung der + Kerne.}\label{convpsth} +\end{figure} + \section{Spike triggered Average}