How to find a point in a dataset at which graph is changing (aka whole graph derivative)
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
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 comentarios
jonas
el 11 de Sept. de 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
el 11 de Sept. de 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.
Respuestas (1)
jonas
el 11 de Sept. de 2018
Editada: jonas
el 11 de Sept. de 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 comentarios
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!