I have what technically should be an event series, spike times of a neuron. Here's a subset of the spiking data -
st = {2.60661, 4.39836, 5.01687, 6.09621, 6.62883, 6.93686, 7.31116, 8.14444, 8.56538, 9.11395}
If I whip this into a TimeSeries
then I can easily Accumulate[]
them to yield a counting function like so:
spikeData = TimeSeries[Table[1,Length[st]],{st}];
accSpikeData = Accumulate[spikeData];
Row[{ListPlot[spikeData, Filling -> Bottom],ListPlot[accSpikeData, Filling -> Bottom]}]
But- If I do the same thing with an EventSeries
instead...
spikeData = EventSeries[Table[1, Length[st]], {st}];
accSpikeData = Accumulate[spikeData];
Row[{ListPlot[spikeData, Filling -> Bottom], ListPlot[accSpikeData, Filling -> Bottom]}]
And, indeed, looking at the data-
accSpikeData["Path"]
(* {{2.60661, 1}, {4.39836, Missing[]}, {5.01687, Missing[]}, {6.09621,
Missing[]}, {6.62883, Missing[]}, {6.93686, Missing[]}, {7.31116,
Missing[]}, {8.14444, Missing[]}, {8.56538, Missing[]}} *)
I'm not sure if this is a bug or 'intended behavior'. As I understand EventSeries
it is simply a non-interpolating version of TimeSeries
, and, of course I can do what I need here with a TimeSeries
but was just wondering why even having EventSeries
is a thing.
Answer
This is intended behaviour and here is why. Accumulate on TimeSeries or on EventSeries assumes that it accumulates according to every regular step on times. So in case of irregularly sampled TimeSeries it interpolates and in case of irregularly sampled EventSeries it creates Missing[] values. Examples:
In[41]:= data = {1, 2, 3, 4, 5};
Accumulate[data]
Out[42]= {1, 3, 6, 10, 15}
Create a TimeSeries with irregular time stamps:
In[43]:= ts1 = TimeSeries[data, {{1, 1.5, 3, 3.5, 4}}];
Now Accumulate will cause the values to be interpolated automatically:
In[44]:= Accumulate[ts1]["Path"]
Out[44]= {{1., 1.}, {1.5, 3.}, {3., 11.}, {3.5, 15.}, {4., 20.}}
This is coming from subsampling ts11:
In[49]:= ts11 = TimeSeriesResample[ts1];
Accumulate[ts11]["Path"]
Out[50]= {{1., 1.}, {1.5, 3.}, {2., 5.33333}, {2.5, 8.}, {3., 11.}, {3.5, 15.}, {4., 20.}}
Compare to accumulating the values of ts1 directly:
In[46]:= Accumulate[ts1["Values"]]
Out[46]= {1, 3, 6, 10, 15}
Create another TimeSeries forcing the irregular time stamps to be treated as sequentially regular:
In[47]:= ts2 = TimeSeries[data, {{1, 1.5, 3, 3.5, 4}}, TemporalRegularity -> True];
Now accumulating ts2 gives the expected answer equivalent to accumulating the original data:
In[48]:= Accumulate[ts2]["Values"]
Out[48]= {1, 3, 6, 10, 15}
EventSeries does not interpolate automatically hence Accumulate chokes on Missing[] and gives red flag that something is off. What you need is to Accumulate the values directly or set TemporalRegularity to True upon (re)construction.
Comments
Post a Comment