how to resample non-linear breath-by-breath data (so inconsistant time)

7 views (last 30 days)
Hi all,
I have a question regarding my data (example random numbers). If the subject had two breaths within a second there are two datapoints at the same time value. I think the biggest problem is the non-linearity of the data?
x=[0 1 2 5 7 8 9 15 19 20 21 22 23 24 27 30 31 32 33 34 35 36 36 38]
y=[1 2 5 3 4 8 6 5 8 5 8 6 85 85 66 44 55 66 88 77 99 88 55 66]
However, I need to resample to a 5 second time scale with it's resampled y data
x2=[0 5 10 15 20]
I wanted to use timeseries but this gave me the following error:
Warning: Cannot extrapolate
> In tsinterp>linearinter (line 145)
In tsinterp>localInterpolate (line 240)
In tsinterp (line 89)
In tsarrayFcn (line 26)
In tsdata.interpolation/interpolate (line 72)
In timeseries/resample (line 106)

Accepted Answer

Star Strider
Star Strider on 12 Feb 2016
For your sample data, this works:
x=[0 1 2 3 4 4 5 6 7 7 8 9 10 11 12 13 14 14 15 16 17 18 19 20];
y=[1 2 5 3 4 8 6 5 8 5 8 6 85 85 66 44 55 66 88 77 99 88 55 66];
xi=[0 5 10 15 20];
dup = find(diff([eps x]) == 0); % Find Duplicated ‘x’ Values
x(dup) = x(dup)+1E-8; % Add ‘sqrt(eps)’ To Duplicated Values
yi = interp1(x, y, xi, 'linear', 'extrap'); % Interploate
yi =
1 6 85 88 66
If you have more than one repeated consecutive ‘x’ value, this gets a bit more involved, but the same approach applies.
  2 Comments
KFrenkie
KFrenkie on 12 Feb 2016
Edited: KFrenkie on 12 Feb 2016
Ok!
But now I stumble on a second problem. The function does not interpolate on NaN values, while timeseries with resample does. Is this also possible?
Now it gives me the following:
Green: Raw dataset of the oxygen uptake with outliers deleted
red: The procedure you provided
I used the function from the file-exchange inpaint_nans once, is this applicable or do you advice another way?
Greetings
Star Strider
Star Strider on 12 Feb 2016
It can interpolate with NaN values. The trick is to create a continuous ‘xq’ (query) vector, then delete the entire row (or column) that contains the NaN values, and interpolate (and extrapolate if the NaN is at the end).
Example code:
M = [1:15; 2 8 7 6 NaN 8 4 9 7 2 NaN 7 1 3 5]'; % Original Data
Mn = M(~isnan(M(:,2)),:); % Delete Rows With ‘NaN’
xq = 1:max(M(:,1)); % Query Vector
yq = interp1(Mn(:,1), Mn(:,2), xq, 'linear', 'extrap');
figure(1)
plot(M(:,1), M(:,2), '-bp', 'LineWidth',1.5)
hold on
plot(xq, yq, '--+r', 'LineWidth',1)
hold off
grid
legend('Original Data', 'Interpolated Data')

Sign in to comment.

More Answers (1)

KFrenkie
KFrenkie on 12 Feb 2016
Edited: Walter Roberson on 13 Feb 2016
Hmm.. Might have solved the problem. Can somebody comfirm my next try?
ts1 = timeseries(handles.OXY.VO2,handles.OXY.time);
time2=0:10:1110
res_ts=resample(ts1,time2,'zoh');
However, I don't know if "zero-order hold" is the right decision?

Categories

Find more on Time Series in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!