Simulate PP via thinning

Given a conditional intensity function, we generate a point process consistent with this CIF.

Contents

Basic Example

close all;
delta = 0.001;
Tmax = 100;
time = 0:delta:Tmax;
f=.1;
lambdaData = 10*sin(2*pi*f*time)+10; %lambda >=0
lambda = Covariate(time,lambdaData, '\Lambda(t)','time','s','Hz',{'\lambda_{1}'},{{' ''b'', ''LineWidth'' ,2'}});

lambdaBound = max(lambda);
N=lambdaBound*(1.5*Tmax);   %Expected number of arrivals in interval 1.5*Tmax
u = rand(1,N);              %N samples uniform(0,1)
w = -log(u)./(lambdaBound); %N samples exponential rate lambdaBound (ISIs)

tSpikes = cumsum(w);        %Spiketimes;
tSpikes = tSpikes(tSpikes<=Tmax);%Spiketimes within Tmax

% Thinning

lambdaRatio = lambda.getValueAt(tSpikes)./lambdaBound;
% lambdaRatio <=1

% draw uniform random number in 0,1
u2 = rand(length(lambdaRatio),1);

% keep spike if lambda ratio is greater than random number
tSpikesThin  = tSpikes(lambdaRatio>=u2);

Compare Constant rate process vs. thinned process

figure(1);
n1 = nspikeTrain(tSpikes);
n2 = nspikeTrain(tSpikesThin);
subplot(2,2,1); n1.plot; plot(tSpikes,ones(size(tSpikes)),'.');
v=axis; axis([0 Tmax/4 v(3) v(4)]);
subplot(2,2,2); n1.plotISIHistogram;
subplot(2,2,3); n2.plot; plot(tSpikes,ones(size(tSpikes)),'.');
v=axis; axis([0 Tmax/4 v(3) v(4)]);
subplot(2,2,4); n2.plotISIHistogram;

figure(2);
n2.plot;
scaledProb = lambda*(1./lambdaBound);
scaledProb.plot;
v=axis;
axis([0 Tmax/4 v(3) v(4)]);

Simulate multiple realizations of a point process via thinning

The CIF class can generated realizations of a point process given a conditional intensity function (defined as a Covariate or SignalObj)

numRealizations = 20;
spikeColl = CIF.simulateCIFByThinningFromLambda(lambda,numRealizations);
figure(3);
spikeColl.plot;
lambda.plot;
v=axis;
axis([0 Tmax/4 v(3) v(4)]);

% Parity contract scalars for MATLAB/Python verification.
parity = struct();
parity.num_realizations = numRealizations;