% This script produces figure 14.4 in Analysis of Neural Data,
% an analysis of spike data from a rat Hippocampus.
%
% Figure caption: Spiking activity of a rat Hippocampal place cell
% during a free-foraging task in a circular environment. Left:
% Visualization of animals path and locations of spikes. Right:
% Place field model for this neuron, with parameters fit by the
% method of maximum likelihood.
load('hipp_data.mat')
% hipp_data.mat contains:
% xN - x position of rat
% yN - y position of rat
% spikes - whether or not the neuron spiked
spiked = spikes2 == 1;
% Fit a generalized linear model for spikes on quadratic terms of
% location, with poisson likelihood.
nObservations = numel(spikes);
covariates = [xN, yN, xN.^2, yN.^2, xN.*yN];
beta = glmfit([xN, yN, xN.^2, yN.^2, xN.*yN], spikes, 'poisson');
% Estimate lambda where all observations are.
lambdaEstimates = exp( [ones(nObservations), coefficients] * beta );
% Create new x and y values to plot a smoother estimate of lambda.
x_new = meshgrid(-1:0.05:1);
y_new = flipud(x_new');
nPlotted = numel(x_new)
newCovariates = [x_new, y_new, x_new.^2, y_new.^2, x_new .* y_new ];
lambdaForPlot = exp( [ones(nPlotted), newCovariates] * beta );
% Don't plot anything outside the environment.
lambdaForPlot(x_new.^2 + y_new.^2>1) = NaN;
%%%%%%%%%% First plot is the rat's path + dots at actual spikes %%%%%%%%%%
subplot(1, 2, 1)
% Plot the rat's path.
plot(xN, yN, '-b')
hold on;
% Add dots where spikes occured.
plot(xN(spiked, 1), yN(spiked, 1), 'or', ...
'MarkerSize', 4, 'MarkerFaceColor', 'r')
% Clean up axes.
set(gca, 'FontSize', 20, 'Box', 'off', ...
'XLim', [-1.05, 1.05], 'YLim', [-1.05, 1.05], ...
'XTick', -1:0.5:1, 'YTick', -1:0.5:1)
%%%%%%%%%% Second plot shows our estimate of lambda as a surface %%%%%%%%
subplot(1, 2, 2)
h_mesh = mesh(x_new, y_new, lambdaForPlot, 'LineWidth', 2);
hold on;
alpha(0)
% Add grid on floor.
theta = -pi:0.01:pi;
plot3(cos(theta), sin(theta), zeros(size(theta)), 'k', ...
'LineWidth', 2);
% Add rat's path and dots for spikes again.
plot(xN, yN, '-b')
plot(xN(spiked, 1), yN(spiked, 1), 'or', ...
'MarkerSize', 3, 'MarkerFaceColor', 'r')
% Clean up axes.
set(gca, 'FontSize', 22, ...
'XLim', [-1, 1], 'YLim', [-1.1, 1], ...
'XTick', -1:1:1, 'YTick', -1:1:1, 'ZTick', 0:0.2:0.4)
zlabel('Intensity', 'FontSize', 22)
set(gcf, 'Position', [200, 200, 1600, 600])
% Set camera position.
campos([7, -13.0903, 1.9321])