How to find a point in a dataset at which graph is changing (aka whole graph derivative)
1 view (last 30 days)
Show older comments
Pretty trivial problem from someone not strong in math:) I hava a dataset with intensity values over time. At a certain point intensity starts increasing. I want to find the time point at which intensity starts increasing. Due to the nature of the data there is some fluctuation in the baseline, therefore graph is not a smooth line. I tried finding the first derivative:
data = [1 2 1 3 1 2 4 7 8 15 6 4 3 1 2 1];
time = [1:16]
dydx = diff(data)./diff(time)
end
but this returns the derivative for every single datapoint. How do I find the tangent point for the whole graph, and not just for a single point?
I tried approaching it from another angle by doing the following:
S = std(data(1:5)
logic = data > S
I take the first few points as the baseline and calculate the standard deviation of the baseline. And later I create a logical array where 1 is any value 1 SD above the baseline. This is pretty accurate, the instance where '0 1 0 0 1' changes into a continuous '1 1 1 1 1' indicates the point that I need, but I don't know how to extract an index of this changing point.
Attached is an image of a sample graph.
4 Comments
jonas
on 11 Sep 2018
findchangepts has loads of input arguments whereas ischange is a bit more limited. However, both functions comes with the optional threshold value to limit the "sensitivity to noise".
Image Analyst
on 11 Sep 2018
Is there some number of points at the beginning where you are assured that they are the initial, flat, non-increasing values that we can use as a threshold? If so I'd smooth the signal with sgolayfilt() and then just threshold at the proper value.
Answers (1)
jonas
on 11 Sep 2018
Edited: jonas
on 11 Sep 2018
% change in std
findchangepts(data(:,3),'statistic','std')
% constant segments
findchangepts(data(:,3),'statistic','mean','minthreshold',2e4)
% linear segments
findchangepts(data(:,3),'statistic','linear','minthreshold',2e4)
To get the index, you simply specify the output arguments
[idx] = findchangepts(data(:,3),'statistic','linear','minthreshold',2e4)
Ideally, the first value in idx is your point of interest. You have to play around with the input arguments to find the best method for this. I would go for one of the above. Perhaps its better to remove minthreshold and use maxnumchanges instead.
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!