%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Spike-train analysis}
\label{pointprocesseschapter}
\exercisechapter{Spike-train analysis}

\entermde[action potential]{Aktionspotential}{Action potentials}
(\enterm[spike|seealso{action potential}]{spikes}) carry information
within neural systems. More precisely, the times at which action
potentials are generated contain the information.  The waveform of the
action potential is largely stereotyped and therefore conveys no
information. Analyzing the statistics of spike times and their
relation to sensory stimuli or motor actions is central to
neuroscientific research. With multi-electrode arrays it is nowadays
possible to record from hundreds or even thousands of neurons
simultaneously. The open challenge is how to analyze such data sets in
order to understand how neural systems work. Let's start with the
basics in this chapter.

The result of the pre-processing of electrophysiological recordings
are series of spike times, which are termed \enterm[spike train]{spike
  trains}. If measurements are repeated we get several \enterm{trials}
of spike trains (\figref{rasterexamplesfig}).  Spike trains are lists
of times of events, the action potentials. Analyzing spike trains
leads into the realm of the statistics of so called \entermde[point
process]{Punktprozess}{point processes}.

\begin{figure}[bt]
  \includegraphics[width=1\textwidth]{rasterexamples}
  \titlecaption{\label{rasterexamplesfig}Raster plot.}{Raster plots of
    ten trials of data illustrating the times of action
    potentials. Each vertical stroke illustrates the time at which an
    action potential was observed. Each row displays the events of one
    trial. Shown is a stationary point process (homogeneous point
    process with a rate $\lambda=20$\;Hz, left) and an non-stationary
    point process with a rate that varies in time (noisy perfect
    integrate-and-fire neuron driven by Ornstein-Uhlenbeck noise with
    a time-constant $\tau=100$\,ms, right).}
\end{figure}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Point processes}

\begin{ibox}{Examples of point processes}
  Every point process is generated by a temporally continuously
  developing process. An event is generated whenever this process
  crosses some threshold. For example:\vspace{-1ex}
  \begin{itemize}
  \item Action potentials/heart beat: created by the dynamics of the
    neuron/sinoatrial node.
  \item Earthquake: defined by the dynamics of the pressure between
    tectonical plates.
  \item Communication calls in crickets/frogs/birds: shaped by
    the dynamics of the nervous system and the muscle apparatus.
  \end{itemize}
\end{ibox}

\begin{figure}[tb]
  \includegraphics{pointprocesssketch}
  \titlecaption{\label{pointprocesssketchfig} Statistics of point
    processes.}{A point process is a sequence of instances in time
    $t_i$ that can be also characterized by inter-event intervals
    $T_i=t_{i+1}-t_i$ and event counts $n_i$.}
\end{figure}

\noindent
A temporal \entermde{Punktprozess}{point process} is a stochastic
process that generates a sequence of events at times $\{t_i\}$.  In
the neurosciences, the statistics of point processes is of importance
since the timing of neuronal events (action potentials, post-synaptic
potentials, events in EEG or local-field recordings, etc.) is crucial
for information transmission and can be treated as such a process.

The events of a point process can be illustrated by means of a raster
plot in which each vertical line indicates the time of an event. The
event from two different point processes are shown in
\figref{rasterexamplesfig}.  In addition to the event times, point
processes can be described using the intervals $T_i=t_{i+1}-t_i$
between successive events or the number of observed events within a
certain time window $n_i$ (\figref{pointprocesssketchfig}).

\begin{exercise}{rasterplot.m}{}
  Implement a function \varcode{rasterplot()} that displays the times of
  action potentials within the first \varcode{tmax} seconds in a raster
  plot. The spike times (in seconds) recorded in the individual trials
  are stored as vectors of times within a cell array.
\end{exercise}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Homogeneous Poisson process}

The Gaussian distribution is, because of the central limit theorem,
the standard distribution for continuous measures. The equivalent in
the realm of point processes is the
\entermde[distribution!Poisson]{Verteilung!Poisson-}{Poisson distribution}.

In a \entermde[Poisson process!homogeneous]{Poissonprozess!homogener}{homogeneous Poisson
  process} the events occur at a fixed rate $\lambda=\text{const}$ and
are independent of both the time $t$ and occurrence of previous events
(\figref{hompoissonfig}). The probability of observing an event within
a small time window of width $\Delta t$ is given by
\begin{equation}
  \label{hompoissonprob}
  P = \lambda \cdot \Delta t \; .
\end{equation}

In an \entermde[Poisson process!inhomogeneous]{Poissonprozess!inhomogener}{inhomogeneous Poisson
  process}, however, the rate $\lambda$ depends on time: $\lambda =
\lambda(t)$.

\begin{exercise}{poissonspikes.m}{}
  Implement a function \varcode{poissonspikes()} that uses a homogeneous
  Poisson process to generate events at a given rate for a certain
  duration and a number of trials. The rate should be given in Hertz
  and the duration of the trials is given in seconds. The function
  should return the event times in a cell-array. Each entry in this
  array represents the events observed in one trial. Apply
  \eqnref{hompoissonprob} to generate the event times.
\end{exercise}

\begin{exercise}{hompoissonspikes.m}{}
  Implement a function \varcode{hompoissonspikes()} that uses a
  homogeneous Poisson process to generate spike events at a given rate
  for a certain duration and a number of trials. The rate should be
  given in Hertz and the duration of the trials is given in
  seconds. The function should return the event times in a
  cell-array. Each entry in this array represents the events observed
  in one trial. Apply \eqnref{poissonintervals} to generate the event
  times.
\end{exercise}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
\section{Interval statistics}

The intervals $T_i=t_{i+1}-t_i$ between successive events are real
positive numbers. In the context of action potentials they are
referred to as \entermde[interspike
interval]{Interspikeintervall}{interspike intervals}, in short
\entermde[ISI|see{interspike
  interval}]{ISI|see{Interspikeintervall}}{ISI}s. The statistics of
interspike intervals are described using common measures for
describing the statistics of real-valued variables:

\begin{figure}[t]
  \includegraphics[width=0.96\textwidth]{isihexamples}\vspace{-2ex}
  \titlecaption{\label{isihexamplesfig}Interspike-interval
    histograms}{of the spike trains shown in \figref{rasterexamplesfig}.}
\end{figure}

\begin{exercise}{isis.m}{}
  Implement a function \varcode{isis()} that calculates the interspike
  intervals from several spike trains. The function should return a
  single vector of intervals. The spike times (in seconds) of each
  trial are stored as vectors within a cell-array.
\end{exercise}

\begin{itemize}
\item Probability density $p(T)$ of the intervals $T$
  (\figref{isihexamplesfig}). Normalized to $\int_0^{\infty} p(T) \;
  dT = 1$. Commonly referred to as the \enterm[interspike
  interval!histogram]{interspike interval histogram}. Its shape
  reveals many interesting aspects like locking or bursting that
  cannot be inferred from the mean or standard deviation. A particular
  reference is the exponential distribution of intervals
  \begin{equation}
    \label{hompoissonexponential}
    p_{exp}(T) = \lambda e^{-\lambda T}
  \end{equation}
  of a homogeneous Poisson spike train with rate $\lambda$.
\item Mean interval: $\mu_{ISI} = \langle T \rangle =
  \frac{1}{n}\sum\limits_{i=1}^n T_i$. The average time it takes from
  one event to the next. The inverse of the mean interval is identical
  with the mean rate $\lambda$ (number of events per time, see below)
  of the process.
\item Standard deviation of intervals: $\sigma_{ISI} = \sqrt{\langle
    (T - \langle T \rangle)^2 \rangle}$. Periodically spiking neurons
  have little variability in their intervals, whereas many cortical
  neurons cover a wide range with their intervals. The standard
  deviation of homogeneous Poisson spike trains, $\sigma_{ISI} =
  \frac{1}{\lambda}$, also equals the inverse rate.  Whether the
  standard deviation of intervals is low or high, however, is better
  quantified by the
\item \entermde[coefficient of
  variation]{Variationskoeffizient}{Coefficient of variation}, the
  standard deviation of the ISIs relative to their mean:
  \begin{equation}
    \label{cvisi}
    CV_{ISI} = \frac{\sigma_{ISI}}{\mu_{ISI}}
  \end{equation}
  Homogeneous Poisson spike trains have an CV of exactly one. The
  lower the CV the more regularly firing a neuron is firing. CVs
  larger than one are also possible in spike trains with small
  intervals separated by really long ones.
%\item \entermde[diffusion coefficient]{Diffusionskoeffizient}{Diffusion coefficient}: $D_{ISI} =
%  \frac{\sigma_{ISI}^2}{2\mu_{ISI}^3}$.
\end{itemize}

\begin{exercise}{isihist.m}{}
  Implement a function \varcode{isiHist()} that calculates the normalized
  interspike interval histogram. The function should take two input
  arguments; (i) a vector of interspike intervals and (ii) the width
  of the bins used for the histogram. It further returns the
  probability density as well as the centers of the bins.
\end{exercise}

\begin{exercise}{plotisihist.m}{}
  Implement a function that takes the return values of
  \varcode{isiHist()} as input arguments and then plots the data. The
  plot should show the histogram with the x-axis scaled to
  milliseconds and should be annotated with the average ISI, the
  standard deviation and the coefficient of variation.
\end{exercise}

\subsection{Interval correlations}
Intervals are not just numbers without an order, like weights of
tigers.  Intervals are temporally ordered and there could be temporal
structure in the sequence of intervals. For example, short intervals
could be followed by more longer ones, and vice versa. Such
dependencies in the sequence of intervals do not show up in the
interval histogram.  We need additional measures to also quantify the
temporal structure of the sequence of intervals.

We can use the same techniques we know for visualizing and quantifying
correlations in bivariate data sets, i.e. scatter plots and
correlation coefficients. We form $(x,y)$ data pairs by taking the
series of intervals $T_i$ as $x$-data values and pairing them with the
$k$-th next intervals $T_{i+k}$ as $y$-data values. The parameter $k$
is called \enterm{lag} (\determ{Verz\"ogerung}). For lag one we pair
each interval with the next one. A \entermde[return map]{return
  map}{Return map} illustrates dependencies between successive
intervals by simply plotting the intervals $T_{i+k}$ against the
intervals $T_i$ in a scatter plot (\figref{returnmapfig}). For Poisson
spike trains there is no structure beyond the one expected from the
exponential interspike interval distribution, hinting at neighboring
interspike intervals being independent of each other. For the spike
train based on an Ornstein-Uhlenbeck process the return map is more
clustered along the diagonal, hinting at a positive correlation
between succeeding intervals. That is, short intervals are more likely
to be followed by short ones and long intervals more likely by long
ones. This temporal structure was already clearly visible in the spike
raster shown in \figref{rasterexamplesfig}.

\begin{figure}[tp]
  \includegraphics[width=1\textwidth]{serialcorrexamples}
  \titlecaption{\label{returnmapfig}Interspike-interval
    correlations}{of the spike trains shown in
    \figref{rasterexamplesfig}. Upper panels show the return maps and
    lower panels the serial correlations of successive intervals
    separated by lag $k$. All the interspike intervals of the
    stationary spike trains are independent of each other --- this is
    a so called \enterm{renewal process}
    (\determ{Erneuerungsprozess}). In contrast, the ones of the
    non-stationary spike trains show positive correlations that decay
    for larger lags.  The positive correlations in this example are
    caused by a common stimulus that slowly increases and decreases
    the mean firing rate of the spike trains.}
\end{figure}

Such dependencies can be further quantified by
\entermde[correlation!serial]{Korrelation!serielle}{serial
  correlations}. These are the correlation coefficients between the
intervals $T_{i+k}$ and $T_i$ in dependence on lag $k$:
\begin{equation}
  \label{serialcorrelation}
  \rho_k = \frac{\langle (T_{i+k} - \langle T \rangle)(T_i - \langle T \rangle) \rangle}{\langle (T_i - \langle T \rangle)^2\rangle} = \frac{{\rm cov}(T_{i+k}, T_i)}{{\rm var}(T_i)} 
= {\rm corr}(T_{i+k}, T_i)
\end{equation}
The serial correlations $\rho_k$ are usually plotted against the lag
$k$ for a range small range of lags
(\figref{returnmapfig}). $\rho_0=1$ is the correlation of each
interval with itself and always equals one.

If the serial correlations all equal zero, $\rho_k =0$ for $k>0$, then
the length of an interval is independent of all the previous
ones. Such a process is a \enterm{renewal process}
(\determ{Erneuerungsprozess}). Each event, each action potential,
erases the history. The occurrence of the next event is independent of
what happened before. To a first approximation an action potential
erases all information about the past from the membrane voltage and
thus spike trains may approximate renewal processes.

However, other variables like the intracellular calcium concentration
or the states of slowly switching ion channels may carry information
from one interspike interval to the next and thus introducing
correlations. Such non-renewal dynamics can then be described by the
non-zero serial correlations (\figref{returnmapfig}).

\begin{exercise}{isiserialcorr.m}{}
  Implement a function \varcode{isiserialcorr()} that takes a vector of
  interspike intervals as input argument and calculates the serial
  correlation. The function should further plot the serial
  correlation.
\end{exercise}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Count statistics}

\begin{figure}[t]
  \includegraphics{countexamples}
  \titlecaption{\label{countstatsfig}Count statistics.}{Probability
    distributions of counting $k$ events $k$ (blue) within windows of
    20\,ms (left) or 200\,ms duration (right) of a homogeneous Poisson
    spike train with a rate of 20\,Hz
    (\figref{rasterexamplesfig}). For Poisson spike trains these
    distributions are given by Poisson distributions (red).}
\end{figure}

The most commonly used measure for characterizing spike trains is the
\enterm[firing rate!average]{average firing rate}. The firing rate $r$
is the average number of spikes counted within some time interval $W$
\begin{equation}
  \label{firingrate}
  r = \frac{\langle n \rangle}{W}
\end{equation}
and is measured in Hertz. The average of the spike counts is taken
over trials. For stationary spike trains (no change in statistics, in
particular the firing rate, over time), the firing rate based on the
spike count equals the inverse average interspike interval
$1/\mu_{ISI}$.

The firing rate based on an averaged spike counts is one example of
many statistics based on event counts. Stationary spike trains can be
split into many segments $i$, each of duration $W$, and the number of
events $n_i$ in each of the segments can be counted. The integer event
counts can be quantified in the usual ways:
\begin{itemize}
\item Histogram of the counts $n_i$. For homogeneous Poisson spike
  trains with rate $\lambda$ the resulting probability distributions
  follow a Poisson distribution (\figref{countstatsfig}), where the
  probability of counting $k$ events within a time window $W$ is given by
  \begin{equation}
    \label{poissondist}
    P(k) = \frac{(\lambda W)^k e^{\lambda W}}{k!}
  \end{equation}
\item Average number of counts: $\mu_n = \langle n \rangle$.
\item Variance of counts:
  $\sigma_n^2 = \langle (n - \langle n \rangle)^2 \rangle$.
\end{itemize}
Because spike counts are unitless and positive numbers, the
\begin{itemize}
\item \entermde{Fano Faktor}{Fano factor} (variance of counts divided
  by average count)
  \begin{equation}
    \label{fano}
    F = \frac{\sigma_n^2}{\mu_n}
  \end{equation}
  is a commonly used measure for quantifying the variability of event
  counts relative to the mean number of events. In particular for
  homogeneous Poisson processes the Fano factor equals one,
  independently of the time window $W$.
\end{itemize}
is an additional measure quantifying event counts.

Note that all of these statistics depend in general on the chosen
window length $W$. The average spike count, for example, grows
linearly with $W$ for sufficiently large time windows: $\langle n
\rangle = r W$, \eqnref{firingrate}. Doubling the counting window
doubles the spike count. As does the spike-count variance
(\figref{fanofig}). At smaller time windows the statistics of the
event counts might depend on the particular duration of the counting
window. There might be an optimal time window for which the variance
of the spike count is minimal. The Fano factor plotted as a function
of the time window illustrates such properties of point processes
(\figref{fanofig}).

This also has consequences for information transmission in neural
systems. The lower the variance in spike count relative to the
averaged count, the higher the signal-to-noise ratio at which
information encoded in the mean spike count is transmitted.

\begin{figure}[t]
  \includegraphics{fanoexamples}
  \titlecaption{\label{fanofig}
    Count variance and Fano factor.}{Variance of event counts as a
    function of mean counts obtained by varying the duration of the
    count window (left). Dividing the count variance by the respective
    mean results in the Fano factor that can be plotted as a function
    of the count window (right). For Poisson spike trains the variance
    always equals the mean counts and consequently the Fano factor
    equals one irrespective of the count window (top). A spike train
    with positive correlations between interspike intervals (caused by
    an Ornstein-Uhlenbeck process) has a minimum in the Fano factor,
    that is an analysis window for which the relative count variance
    is minimal somewhere close to the correlation time scale of the
    interspike intervals (bottom).}
\end{figure}

\begin{exercise}{counthist.m}{}
  Implement a function \varcode{counthist()} that calculates and plots
  the distribution of spike counts observed in a certain time
  window. The function should take two input arguments: (i) a
  cell-array of vectors containing the spike times in seconds observed
  in a number of trials, and (ii) the duration of the time window that
  is used to evaluate the counts.
\end{exercise}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Time-dependent firing rate}

So far we have discussed stationary spike trains. The statistical properties
of these did not change within the observation time (stationary point
processes). Most commonly, however, this is not the case. A sensory
neuron, for example, might respond to a stimulus by modulating its
firing rate (non-stationary point process).

How the firing rate $r(t)$ changes over time is the most important
measure, when analyzing non-stationary spike trains. The unit of the
firing rate is Hertz, i.e. the number of action potentials per
second. There are different ways to estimate the firing rate and three
of these are illustrated in \figref{psthfig}. All have their own
justifications, their pros- and cons. 

\begin{figure}[tp]
  \includegraphics[width=\columnwidth]{firingrates}
  \titlecaption{Estimating time-dependent firing rates.}{Rasterplot
    showing one trial of spiking activity of a neuron (top).
    \emph{Instantaneous rate}, classical PSTH estimatd with the
    \emph{binning} method and by \emph{convolution} of the spike train
    with a Gaussian kernel (bottom).}\label{psthfig}
\end{figure}


\subsection{Instantaneous firing rate}

\begin{figure}[tp]
  \includegraphics[width=\columnwidth]{isimethod}
  \titlecaption{Instantaneous firing rate.}{The recorded spike train
    (top).  Arrows illustrate the interspike intervals and numbers
    give the intervals in milliseconds. The inverse of the interspike
    intervals is the \emph{instantaneous firing rate}
    (bottom).}\label{instratefig}
\end{figure}

A very simple method for estimating the time-dependent firing rate is
the \entermde[firing rate!instantaneous]{Feuerrate!instantane}{instantaneous firing rate}.
The firing rate can be directly estimated as the inverse of the time
between successive spikes, the interspike-interval (\figref{instratefig}).

\begin{equation}
    \label{instantaneousrateeqn}
    r_i = \frac{1}{T_i} .
\end{equation}

The instantaneous rate $r_i$ is valid for the whole interspike
interval. The method has the advantage of being extremely easy to
compute and that it does not make any assumptions about the relevant
timescale (of the encoding in the neuron or the decoding of a
postsynaptic neuron). The resulting $r(t)$, however, is no continuous
function, the firing rate jumps from one level to the next. Since the
interspike interval between successive spikes is never infinitely
long, the firing rate never reaches zero despite that the neuron may
not fire an action potential for a long time.

\begin{exercise}{instantaneousRate.m}{}
  Implement a function that computes the instantaneous firing
  rate. Plot the firing rate as a function of time.
  %\note{TODO: example data!!!}
\end{exercise}


\subsection{Peri-stimulus-time-histogram}
While the instantaneous firing rate is based on the interspike
intervals, the \enterm{peri stimulus time histogram} (PSTH) is based on
spike counts within observation windows of the duration $W$. It
estimates the probability of observing a spike within that observation
time. It tries to estimate the average rate in the limit of small
obersvation times:
\begin{equation}
  \label{psthrate}
  r(t) = \lim_{W \to 0} \frac{\langle n \rangle}{W} \; ,
\end{equation}
where $\langle n \rangle$ is the across trial average number of action
potentials observed within the interval $(t, t+W)$. Such description
matches the time-dependent firing rate $\lambda(t)$ of an
inhomogeneous Poisson process.

The firing probability can be estimated using the \enterm[firing
rate!binning method]{binning method} or by using \enterm[firing
rate!kernel density estimation]{kernel density estimations}. Both
methods make an assumption about the relevant observation time-scale
($W$ in \eqnref{psthrate}).

\subsubsection{Binning-method}

\begin{figure}[tp]
  \includegraphics[width=\columnwidth]{binmethod}
  \titlecaption{Estimating the PSTH using the binning method.}{The
    same spike train as shown in \figref{instratefig} (top). Vertical
    gray lines indicate the borders between adjacent bins in which the
    number of action potentials is counted (red numbers). The firing
    rate is then the histogram normalized to the binwidth
    (bottom).}\label{binpsthfig}
\end{figure}

The \entermde[firing rate!binning
method]{Feuerrate!Binningmethode}{binning method} separates the time
axis into regular bins of the bin width $W$ and counts for each bin
the number of observed action potentials (\figref{binpsthfig}
top). The resulting histogram is then normalized with the bin width
$W$ to yield the firing rate shown in the bottom trace of figure
\ref{binpsthfig}. The above sketched process is equivalent to
estimating the probability density. For computing a PSTH the
\code{hist()} function can be used.

The estimated firing rate is valid for the total duration of each
bin. This leads to the step-like plot shown in
\figref{binpsthfig}. $r(t)$ is thus not a contiunous function in
time. The binwidth defines the temporal resolution of the firing rate
estimation Changes that happen within a bin cannot be resolved. Thus
chosing a bin width implies an assumption about the relevant
time-scale.

\begin{exercise}{binnedRate.m}{}
  Implement a function that estimates the firing rate using the
  binning method. The method should take the spike-times as an
  input argument and returns the firing rate. Plot the PSTH.
\end{exercise}

\subsubsection{Convolution method --- Kernel density estimation}

\begin{figure}[tp]
  \includegraphics[width=\columnwidth]{convmethod}
  \titlecaption{Estimating the firing rate using the convolution
    method.}{The same spike train as in \figref{instratefig} (top). The
    convolution of the spike train with a kernel replaces each spike
    event with the kernel (red). A Gaussian kernel is used here, but
    other kernels are also possible. If the kernel is properly
    normalized the firing rate results directly form the superposition
    of the kernels (bottom).}\label{convratefig}
\end{figure}

With the \entermde[firing rate!convolution
method]{Feuerrate!Faltungsmethode}{convolution method} we avoid the
sharp edges of the binning method. The spiketrain is convolved with a
\entermde{Faltungskern}{convolution kernel}. Technically speaking we
need to first create a binary representation of the spike train. This
binary representation is a series of zeros and ones in which the ones
denote the spike. Then this binary vector is convolved with a kernel
of a certain width:
\[r(t) = \int_{-\infty}^{\infty} \omega(\tau) \, \rho(t-\tau) \, {\rm d}\tau \; , \]
where $\omega(\tau)$ represents the kernel and $\rho(t)$ the binary
representation of the response. The process of convolution can be
imagined as replacing each event of the spiketrain with the kernel
(figure \ref{convratefig} top). The superposition of the replaced
kernels is then the firing rate (if the kernel is correctly normalized
to an integral of one, figure \ref{convratefig}
bottom).

In contrast to the other methods the convolution methods leads to a
continuous function which is often desirable (in particular when
applying methods in the frequency domain). The choice of the kernel
width defines, similar to the bin width of the binning method, the
temporal resolution of the method and thus makes assumptions about the
relevate time-scale.

\begin{exercise}{convolutionRate.m}{}
  Implement the function that estimates the firing rate using the
  convolution method. The method takes the spiketrain, the temporal
  resolution of the recording (as the stepsize $dt$, in seconds) and
  the width of the kernel (the standard deviation $\sigma$ of the
  Gaussian kernel, in seconds) as input arguments. It returns the
  firing rate. Plot the result.
\end{exercise}

\section{Spike-triggered Average}

The graphical representation of the neuronal activity alone is not
sufficient tot investigate the relation between the neuronal response
and a stimulus. One method to do this is the \entermde{Spike-triggered
  Average}{spike-triggered average}, \enterm[STA|see{spike-triggered
  average}]{STA}. The STA
\begin{equation}
  STA(\tau) = \langle s(t - \tau) \rangle = \frac{1}{N} \sum_{i=1}^{N} s(t_i - \tau)
\end{equation}
of $N$ action potentials observed at the times $t_i$ in response to
the stimulus $s(t)$ is the average stimulus that led to a spike in the
neuron.  The STA can be easily extracted by cutting snippets out of
$s(t)$ that surround the times of the spikes. The resulting stimulus
snippets are then averaged (\figref{stafig}).

\begin{figure}[t]
  \includegraphics[width=\columnwidth]{sta}
  \titlecaption{Spike-triggered average of a P-type electroreceptor
    and the stimulus reconstruction.}{The neuron was driven by a
    \enterm{white-noise} stimulus (blue, right). The STA (left) is the
    average stimulus that surrounds the times of the recorded action
    potentials (40\,ms before and 20\,ms after the spike). Using the
    STA as a kernel for convolving the spiketrain we can reconstruct
    the stimulus from the neuronal response. In this way we can get an
    impression of the stimulus features that are linearly encoded in
    the neuronal response (orange, right).}\label{stafig}
\end{figure}

From the STA we can extract several pieces of information about the
relation of stimulus and response. The width of the STA represents the
temporal precision with which the neuron encodes the stimulus waveform
and in which temporal window the neuron integrates the (sensory)
input. The amplitude of the STA tells something about the sensitivity
of the neuron. The STA is given in the same units as the stimulus and
a small amplitude indicates that the neuron needs only a small
stimulus amplitude to create a spike, a large amplitude on the
contrary suggests the opposite. The temporal delay between the STA and
the time of the spike is a consequence of the time the system (neuron)
needs to process the stimulus.

We can further use the STA to do a \enterm{reverse reconstruction} and
estimate the stimulus from the neuronal response (\figref{stafig},
right). For this, the spiketrain is convolved with the STA as a
kernel.

\begin{exercise}{spikeTriggeredAverage.m}{}
  Implement a function that calculates the STA. Use the dataset
  \file{sta\_data.mat}. The function expects the spike train, the
  stimulus and the temporal resolution of the recording as input
  arguments and should return the following information:
  \vspace{-1ex}
  \begin{itemize}
    \setlength{\itemsep}{0ex}
  \item the spike-triggered average.
  \item the standard deviation of the STA across the individual snippets.
  \item The number of action potentials used to estimate the STA.
  \end{itemize}
  
\end{exercise}

\begin{exercise}{reconstructStimulus.m}{}
  Do the reverse reconstruction using the STA and the spike times. The
  function should return the estimated stimulus in a vector that has
  the same size as the original stimulus contained in file
  \file{sta\_data.mat}.
\end{exercise}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\printsolutions