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

조회 수: 9 (최근 30일)
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)

채택된 답변

Star Strider
Star Strider 2016년 2월 12일
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
KFrenkie
KFrenkie 2016년 2월 12일
편집: KFrenkie 2016년 2월 12일
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 2016년 2월 12일
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')

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

KFrenkie
KFrenkie 2016년 2월 12일
편집: Walter Roberson 2016년 2월 13일
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?

카테고리

Help CenterFile Exchange에서 Time Series에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by