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

12 vues (au cours des 30 derniers jours)
KFrenkie
KFrenkie le 12 Fév 2016
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)

Réponse acceptée

Star Strider
Star Strider le 12 Fév 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 commentaires
KFrenkie
KFrenkie le 12 Fév 2016
Modifié(e) : KFrenkie le 12 Fév 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 le 12 Fév 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')

Connectez-vous pour commenter.

Plus de réponses (1)

KFrenkie
KFrenkie le 12 Fév 2016
Modifié(e) : Walter Roberson le 13 Fév 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?

Catégories

En savoir plus sur Time Series dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by