From ba8df083e283aa897b39afc9065be552db68feb7 Mon Sep 17 00:00:00 2001 From: Lars Date: Sat, 7 Nov 2020 16:46:05 +0100 Subject: [PATCH] TEST remote repository --- AutocorrRegSymmSteps.m | 7 + AutocorrStrides.m | 43 + CalcMaxLyapConvGait.m | 118 ++ CalcMaxLyapWolfFixedEvolv.m | 134 ++ CalculateNonLinearParametersFunc.m | 48 + CalculateStrideParametersFunc.m | 48 + FilterandRealignFunc.m | 18 + GaitOutcomesTrunkAccFuncIH.m | 210 +++ GaitVariabilityAnalysisIH.m | 74 + GaitVariabilityAnalysisIH_WithoutTurns.m | 108 ++ GaitVariabilityAnalysisLD.html | 1709 +++++++++++++++++++ GaitVariabilityAnalysisLD.mlx | Bin 0 -> 589968 bytes GaitVariabilityAnalysisLD.tex | 1944 ++++++++++++++++++++++ GaitVariabilityAnalysisLD_v1.m | 103 ++ GaitVariabilityStructToExcelIH.m | 95 ++ HarmonicityFrequency.m | 83 + MutualInformationHisPro.m | 146 ++ Phyphoxdata.mat | Bin 0 -> 382005843 bytes RealignSensorSignalHRAmp.m | 275 +++ SpatioTemporalGaitParameters.m | 118 ++ SpectralAnalysisGaitfunc.m | 15 + StepDetectionFunc.m | 35 + StepcountFunc.m | 65 + StrideFrequencyFrom3dAcc.m | 150 ++ StrideFrequencyRispen.m | 150 ++ div_calc.m | 1 + div_calc_shorttimeseries.m | 1 + div_wolf_fixed_evolv.m | 1 + findminMutInf.m | 55 + funcSampleEntropy.m | 79 + matlab.sty | 104 ++ mutinfHisPro.m | 71 + 32 files changed, 6008 insertions(+) create mode 100644 AutocorrRegSymmSteps.m create mode 100644 AutocorrStrides.m create mode 100644 CalcMaxLyapConvGait.m create mode 100644 CalcMaxLyapWolfFixedEvolv.m create mode 100644 CalculateNonLinearParametersFunc.m create mode 100644 CalculateStrideParametersFunc.m create mode 100644 FilterandRealignFunc.m create mode 100644 GaitOutcomesTrunkAccFuncIH.m create mode 100644 GaitVariabilityAnalysisIH.m create mode 100644 GaitVariabilityAnalysisIH_WithoutTurns.m create mode 100644 GaitVariabilityAnalysisLD.html create mode 100644 GaitVariabilityAnalysisLD.mlx create mode 100644 GaitVariabilityAnalysisLD.tex create mode 100644 GaitVariabilityAnalysisLD_v1.m create mode 100644 GaitVariabilityStructToExcelIH.m create mode 100644 HarmonicityFrequency.m create mode 100644 MutualInformationHisPro.m create mode 100644 Phyphoxdata.mat create mode 100644 RealignSensorSignalHRAmp.m create mode 100644 SpatioTemporalGaitParameters.m create mode 100644 SpectralAnalysisGaitfunc.m create mode 100644 StepDetectionFunc.m create mode 100644 StepcountFunc.m create mode 100644 StrideFrequencyFrom3dAcc.m create mode 100644 StrideFrequencyRispen.m create mode 100644 div_calc.m create mode 100644 div_calc_shorttimeseries.m create mode 100644 div_wolf_fixed_evolv.m create mode 100644 findminMutInf.m create mode 100644 funcSampleEntropy.m create mode 100644 matlab.sty create mode 100644 mutinfHisPro.m diff --git a/AutocorrRegSymmSteps.m b/AutocorrRegSymmSteps.m new file mode 100644 index 0000000..c37505c --- /dev/null +++ b/AutocorrRegSymmSteps.m @@ -0,0 +1,7 @@ +% autocorrelation for step symmetrie +function [c, lags] = AutocorrRegSymmSteps(x) +[c,lags] = xcov(x,200,'unbiased'); +c = c/c(lags==0); +c = c(lags>=0); +lags = lags(lags>=0); + diff --git a/AutocorrStrides.m b/AutocorrStrides.m new file mode 100644 index 0000000..b49a726 --- /dev/null +++ b/AutocorrStrides.m @@ -0,0 +1,43 @@ +function [ResultStruct] = AutocorrStrides(data,FS, StrideTimeRange,ResultStruct); + +%% Stride-times measures +% Stride time and regularity from auto correlation (according to Moe-Nilssen and Helbostad, Estimation of gait cycle characteristics by trunk accelerometry. J Biomech, 2004. 37: 121-6.) +RangeStart = round(FS*StrideTimeRange(1)); +RangeEnd = round(FS*StrideTimeRange(2)); +[AutocorrResult,Lags]=xcov(data,RangeEnd,'unbiased'); +AutocorrSum = sum(AutocorrResult(:,[1 5 9]),2); % This sum is independent of sensor re-orientation, as long as axes are kept orthogonal +AutocorrResult2= [AutocorrResult(:,[1 5 9]),AutocorrSum]; +IXRange = (numel(Lags)-(RangeEnd-RangeStart)):numel(Lags); +% check that autocorrelations are positive for any direction, + +AutocorrPlusTrans = AutocorrResult+AutocorrResult(:,[1 4 7 2 5 8 3 6 9]); +IXRangeNew = IXRange( ... + AutocorrPlusTrans(IXRange,1) > 0 ... + & prod(AutocorrPlusTrans(IXRange,[1 5]),2) > prod(AutocorrPlusTrans(IXRange,[2 4]),2) ... + & prod(AutocorrPlusTrans(IXRange,[1 5 9]),2) + prod(AutocorrPlusTrans(IXRange,[2 6 7]),2) + prod(AutocorrPlusTrans(IXRange,[3 4 8]),2) ... + > prod(AutocorrPlusTrans(IXRange,[1 6 8]),2) + prod(AutocorrPlusTrans(IXRange,[2 4 9]),2) + prod(AutocorrPlusTrans(IXRange,[3 5 7]),2) ... + ); +if isempty(IXRangeNew) + StrideTimeSamples = Lags(IXRange(AutocorrSum(IXRange)==max(AutocorrSum(IXRange)))); % to be used in other estimations + StrideTimeSeconds = nan; + ResultStruct.StrideTimeSamples = StrideTimeSamples; + ResultStruct.StrideTimeSeconds = StrideTimeSeconds; + +else + StrideTimeSamples = Lags(IXRangeNew(AutocorrSum(IXRangeNew)==max(AutocorrSum(IXRangeNew)))); + StrideRegularity = AutocorrResult2(Lags==StrideTimeSamples,:)./AutocorrResult2(Lags==0,:); % Moe-Nilssen&Helbostatt,2004 + RelativeStrideVariability = 1-StrideRegularity; + StrideTimeSeconds = StrideTimeSamples/FS; + + ResultStruct.StrideRegularity_V = StrideRegularity(1); + ResultStruct.StrideRegularity_ML = StrideRegularity(2); + ResultStruct.StrideRegularity_AP = StrideRegularity(3); + ResultStruct.StrideRegularity_All = StrideRegularity(4); + ResultStruct.RelativeStrideVariability_V = RelativeStrideVariability(1); + ResultStruct.RelativeStrideVariability_ML = RelativeStrideVariability(2); + ResultStruct.RelativeStrideVariability_AP = RelativeStrideVariability(3); + ResultStruct.RelativeStrideVariability_All = RelativeStrideVariability(4); + ResultStruct.StrideTimeSamples = StrideTimeSamples; + ResultStruct.StrideTimeSeconds = StrideTimeSeconds; + +end \ No newline at end of file diff --git a/CalcMaxLyapConvGait.m b/CalcMaxLyapConvGait.m new file mode 100644 index 0000000..554056b --- /dev/null +++ b/CalcMaxLyapConvGait.m @@ -0,0 +1,118 @@ +function [L_Estimate,ExtraArgsOut] = CalcMaxLyapConvGait(ThisTimeSeries,FS,ExtraArgsIn) +if nargin > 2 + if isfield(ExtraArgsIn,'J') + J=ExtraArgsIn.J; + end + if isfield(ExtraArgsIn,'m') + m=ExtraArgsIn.m; + end + if isfield(ExtraArgsIn,'FitWinLen') + FitWinLen=ExtraArgsIn.FitWinLen; + end +end + +%% Initialize output args +L_Estimate=nan;ExtraArgsOut.Divergence=nan;ExtraArgsOut.J=nan;ExtraArgsOut.m=nan;ExtraArgsOut.FitWinLen=nan; + +%% Some checks +% predefined J and m should not be NaN or Inf +if (exist('J','var') && ~isempty(J) && ~isfinite(J)) || (exist('m','var') && ~isempty(m) && ~isfinite(m)) + warning('Predefined J and m cannot be NaN or Inf'); + return; +end +% multidimensional time series need predefined J and m +if size(ThisTimeSeries,2) > 1 && (~exist('J','var') || ~exist('m','var') || isempty(J) || isempty(m)) + warning('Multidimensional time series needs predefined J and m, can''t determine Lyapunov'); + return; +end +%Check that there are no NaN or Inf values in the TimeSeries +if any(~isfinite(ThisTimeSeries(:))) + warning('Time series contains NaN or Inf, can''t determine Lyapunov'); + return; +end +%Check that there is variation in the TimeSeries +if ~(nanstd(ThisTimeSeries) > 0) + warning('Time series is constant, can''t determine Lyapunov'); + return; +end + +%% Determine FitWinLen (=cycle time) of ThisTimeSeries +if ~exist('FitWinLen','var') || isempty(FitWinLen) + if size(ThisTimeSeries,2)>1 + for dim=1:size(ThisTimeSeries,2), + [Pd(:,dim),F] = pwelch(detrend(ThisTimeSeries(:,dim)),[],[],[],FS); + end + P = sum(Pd,2); + else + [P,F] = pwelch(detrend(ThisTimeSeries),[],[],[],FS); + end + MeanF = sum(P.*F)./sum(P); + CycleTime = 1/MeanF; + FitWinLen = round(CycleTime*FS); +else + CycleTime = FitWinLen/FS; +end +ExtraArgsOut.FitWinLen=FitWinLen; + +%% Determine J +if ~exist('J','var') || isempty(J) + % Calculate mutual information and take first local minimum Tau as J + bV = min(40,floor(sqrt(size(ThisTimeSeries,1)))); + tauVmax = FitWinLen; + [mutMPro,cummutMPro,minmuttauVPro] = MutualInformationHisPro(ThisTimeSeries,(0:tauVmax),bV,1); % (xV,tauV,bV,flag) + if isnan(minmuttauVPro) + display(mutMPro); + warning('minmuttauVPro is NaN. Consider increasing tauVmax.'); + return; + end + J=minmuttauVPro; +end +ExtraArgsOut.J=J; + +%% Determine m +if ~exist('m','var') || isempty(m) + escape = 10; + max_m = 20; + max_fnnM = 0.02; + mV = 0; + fnnM = 1; + for mV = 2:max_m % for m=1, FalseNearestNeighbors is slow and lets matlab close if N>500000 + fnnM = FalseNearestNeighborsSR(ThisTimeSeries,J,mV,escape,FS); % (xV,tauV,mV,escape,theiler) + if fnnM <= max_fnnM || isnan(fnnM) + break + end + end + if fnnM <= max_fnnM + m = mV; + else + warning('Too many false nearest neighbours'); + return; + end +end +ExtraArgsOut.m=m; + +%% Create state space based upon J and m +N_ss = size(ThisTimeSeries,1)-(m-1)*J; +StateSpace=nan(N_ss,m*size(ThisTimeSeries,2)); +for dim=1:size(ThisTimeSeries,2), + for delay=1:m, + StateSpace(:,(dim-1)*m+delay)=ThisTimeSeries((1:N_ss)'+(delay-1)*J,dim); + end +end + +%% Parameters for Lyapunov +WindowLen = floor(min(N_ss/5,10*FitWinLen)); +if WindowLen < FitWinLen + warning('Not enough samples for Lyapunov estimation'); + return; +end +WindowLenSec=WindowLen/FS; + +%% Calculate divergence +Divergence=div_calc(StateSpace,WindowLenSec,FS,CycleTime,0); +ExtraArgsOut.Divergence=Divergence; + +%% Calculate slope of first FitWinLen samples of divergence curve +p = polyfit((1:FitWinLen)/FS,Divergence(1:FitWinLen),1); +L_Estimate = p(1); + diff --git a/CalcMaxLyapWolfFixedEvolv.m b/CalcMaxLyapWolfFixedEvolv.m new file mode 100644 index 0000000..8021140 --- /dev/null +++ b/CalcMaxLyapWolfFixedEvolv.m @@ -0,0 +1,134 @@ +function [L_Estimate,ExtraArgsOut] = CalcMaxLyapWolfFixedEvolv(ThisTimeSeries,FS,ExtraArgsIn) + +%% Description +% This function calculates the maximum Lyapunov exponent from a time +% series, based on the method described by Wolf et al. in +% Wolf, A., et al., Determining Lyapunov exponents from a time series. +% Physica D: 8 Nonlinear Phenomena, 1985. 16(3): p. 285-317. +% +% Input: +% ThisTimeSeries: a vector or matrix with the time series +% FS: sample frequency of the ThisTimeSeries +% ExtraArgsIn: a struct containing optional input arguments +% J (embedding delay) +% m (embedding dimension) +% Output: +% L_Estimate: The Lyapunov estimate +% ExtraArgsOut: a struct containing the additional output arguments +% J (embedding delay) +% m (embedding dimension) + +%% Copyright +% COPYRIGHT (c) 2012 Sietse Rispens, VU University Amsterdam +% +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . + +%% Author +% Sietse Rispens + +%% History +% April 2012, initial version of CalcMaxLyapWolf +% 23 October 2012, use fixed evolve time instead of adaptable + +if nargin > 2 + if isfield(ExtraArgsIn,'J') + J=ExtraArgsIn.J; + end + if isfield(ExtraArgsIn,'m') + m=ExtraArgsIn.m; + end +end + +%% Initialize output args +L_Estimate=nan;ExtraArgsOut.J=nan;ExtraArgsOut.m=nan; + +%% Some checks +% predefined J and m should not be NaN or Inf +if (exist('J','var') && ~isempty(J) && ~isfinite(J)) || (exist('m','var') && ~isempty(m) && ~isfinite(m)) + warning('Predefined J and m cannot be NaN or Inf'); + return; +end +% multidimensional time series need predefined J and m +if size(ThisTimeSeries,2) > 1 && (~exist('J','var') || ~exist('m','var') || isempty(J) || isempty(m)) + warning('Multidimensional time series needs predefined J and m, can''t determine Lyapunov'); + return; +end +%Check that there are no NaN or Inf values in the TimeSeries +if any(~isfinite(ThisTimeSeries(:))) + warning('Time series contains NaN or Inf, can''t determine Lyapunov'); + return; +end +%Check that there is variation in the TimeSeries +if ~(nanstd(ThisTimeSeries) > 0) + warning('Time series is constant, can''t determine Lyapunov'); + return; +end + +%% Determine J +if ~exist('J','var') || isempty(J) + % Calculate mutual information and take first local minimum Tau as J + bV = min(40,floor(sqrt(size(ThisTimeSeries,1)))); + tauVmax = 70; + [mutMPro,cummutMPro,minmuttauVPro] = MutualInformationHisPro(ThisTimeSeries,(0:tauVmax),bV,1); % (xV,tauV,bV,flag) + if isnan(minmuttauVPro) + display(mutMPro); + warning('minmuttauVPro is NaN. Consider increasing tauVmax.'); + return; + end + J=minmuttauVPro; +end +ExtraArgsOut.J=J; + +%% Determine m +if ~exist('m','var') || isempty(m) + escape = 10; + max_m = 20; + max_fnnM = 0.02; + mV = 0; + fnnM = 1; + for mV = 2:max_m % for m=1, FalseNearestNeighbors is slow and lets matlab close if N>500000 + fnnM = FalseNearestNeighborsSR(ThisTimeSeries,J,mV,escape,FS); % (xV,tauV,mV,escape,theiler) + if fnnM <= max_fnnM || isnan(fnnM) + break + end + end + if fnnM <= max_fnnM + m = mV; + else + warning('Too many false nearest neighbours'); + return; + end +end +ExtraArgsOut.m=m; + +%% Create state space based upon J and m +N_ss = size(ThisTimeSeries,1)-(m-1)*J; +StateSpace=nan(N_ss,m*size(ThisTimeSeries,2)); +for dim=1:size(ThisTimeSeries,2), + for delay=1:m, + StateSpace(:,(dim-1)*m+delay)=ThisTimeSeries((1:N_ss)'+(delay-1)*J,dim); + end +end + +%% Parameters for Lyapunov estimation +CriticalLen=J*m; +max_dist = sqrt(sum(std(StateSpace).^2))/10; +max_dist_mult = 5; +min_dist = max_dist/2; +max_theta = 0.3; +evolv = J; + +%% Calculate Lambda +[L_Estimate]=div_wolf_fixed_evolv(StateSpace, FS, min_dist, max_dist, max_dist_mult, max_theta, CriticalLen, evolv); + diff --git a/CalculateNonLinearParametersFunc.m b/CalculateNonLinearParametersFunc.m new file mode 100644 index 0000000..61b6dbe --- /dev/null +++ b/CalculateNonLinearParametersFunc.m @@ -0,0 +1,48 @@ +function [ResultStruct] = CalculateNonLinearParametersFunc(ResultStruct,dataAccCut,WindowLen,FS,Lyap_m,Lyap_FitWinLen,Sen_m,Sen_r) + +%% Calculation non-linear parameters; + +% cut into windows of size WindowLen +N_Windows = floor(size(dataAccCut,1)/WindowLen); +N_SkipBegin = ceil((size(dataAccCut,1)-N_Windows*WindowLen)/2); +LyapunovWolf = nan(N_Windows,3); +LyapunovRosen = nan(N_Windows,3); +SE= nan(N_Windows,3); + +for WinNr = 1:N_Windows; + AccWin = dataAccCut(N_SkipBegin+(WinNr-1)*WindowLen+(1:WindowLen),:); + for j=1:3 + [LyapunovWolf(WinNr,j),~] = CalcMaxLyapWolfFixedEvolv(AccWin(:,j),FS,struct('m',Lyap_m)); + [LyapunovRosen(WinNr,j),outpo] = CalcMaxLyapConvGait(AccWin(:,j),FS,struct('m',Lyap_m,'FitWinLen',Lyap_FitWinLen)); + [SE(WinNr,j)] = funcSampleEntropy(AccWin(:,j), Sen_m, Sen_r); + % no correction for FS; SE does increase with higher FS but effect is considered negligible as range is small (98-104HZ). Might consider updating r to account for larger ranges. + end +end + +LyapunovWolf = nanmean(LyapunovWolf,1); +LyapunovRosen = nanmean(LyapunovRosen,1); +SampleEntropy = nanmean(SE,1); + +ResultStruct.LyapunovWolf_V = LyapunovWolf(1); +ResultStruct.LyapunovWolf_ML = LyapunovWolf(2); +ResultStruct.LyapunovWolf_AP = LyapunovWolf(3); +ResultStruct.LyapunovRosen_V = LyapunovRosen(1); +ResultStruct.LyapunovRosen_ML = LyapunovRosen(2); +ResultStruct.LyapunovRosen_AP = LyapunovRosen(3); +ResultStruct.SampleEntropy_V = SampleEntropy(1); +ResultStruct.SampleEntropy_ML = SampleEntropy(2); +ResultStruct.SampleEntropy_AP = SampleEntropy(3); + +if isfield(ResultStruct,'StrideFrequency') + LyapunovPerStrideWolf = LyapunovWolf/ResultStruct.StrideFrequency; + LyapunovPerStrideRosen = LyapunovRosen/ResultStruct.StrideFrequency; +end + +ResultStruct.LyapunovPerStrideWolf_V = LyapunovPerStrideWolf(1); +ResultStruct.LyapunovPerStrideWolf_ML = LyapunovPerStrideWolf(2); +ResultStruct.LyapunovPerStrideWolf_AP = LyapunovPerStrideWolf(3); +ResultStruct.LyapunovPerStrideRosen_V = LyapunovPerStrideRosen(1); +ResultStruct.LyapunovPerStrideRosen_ML = LyapunovPerStrideRosen(2); +ResultStruct.LyapunovPerStrideRosen_AP = LyapunovPerStrideRosen(3); + +end \ No newline at end of file diff --git a/CalculateStrideParametersFunc.m b/CalculateStrideParametersFunc.m new file mode 100644 index 0000000..df5c40d --- /dev/null +++ b/CalculateStrideParametersFunc.m @@ -0,0 +1,48 @@ +function [ResultStruct] = CalculateStrideParametersFunc(dataAccCut_filt,FS,ApplyRemoveSteps,dataAcc,dataAcc_filt,StrideTimeRange) + +%% Calculate stride parameters +ResultStruct = struct; % create empty struct + +% Run function AutoCorrStrides, Outcomeparameters: StrideRegularity,RelativeStrideVariability,StrideTimeSamples,StrideTime +[ResultStruct] = AutocorrStrides(dataAccCut_filt,FS, StrideTimeRange,ResultStruct); +StrideTimeSamples = ResultStruct.StrideTimeSamples; % needed as input for other functions + +% Calculate Step symmetry --> method 1 +ij = 1; +dirSymm = [1,3]; % Gait Synmmetry is only informative in AP/V direction: See Tura A, Raggi M, Rocchi L, Cutti AG, Chiari L: Gait symmetry and regularity in transfemoral amputees assessed by trunk accelerations. J Neuroeng Rehabil 2010, 7:4. + +for jk=1:length(dirSymm) + [C, lags] = AutocorrRegSymmSteps(dataAccCut_filt(:,dirSymm(jk))); + [Ad,p] = findpeaks(C,'MinPeakProminence',0.2, 'MinPeakHeight', 0.2); + + if size(Ad,1) > 1 + Ad1 = Ad(1); + Ad2 = Ad(2); + GaitSymm(:,ij) = abs((Ad1-Ad2)/mean([Ad1+Ad2]))*100; + else + GaitSymm(:,ij) = NaN; + end + ij = ij +1; +end +% Save outcome in struct; +ResultStruct.GaitSymm_V = GaitSymm(1); +ResultStruct.GaitSymm_AP = GaitSymm(2); + +% Calculate Step symmetry --> method 2 +[PksAndLocsCorrected] = StepcountFunc(dataAccCut_filt,StrideTimeSamples,FS); +LocsSteps = PksAndLocsCorrected(2:2:end,2); + +if rem(size(LocsSteps,1),2) == 0; % is number of steps is even + LocsSteps2 = LocsSteps(1:2:end); +else + LocsSteps2 = LocsSteps(3:2:end); +end + +LocsSteps1 = LocsSteps(2:2:end); +DiffLocs2 = diff(LocsSteps2); +DiffLocs1 = diff(LocsSteps1); +StepTime2 = DiffLocs2(1:end-1)/FS; % leave last one out because it is higher +StepTime1 = DiffLocs1(1:end-1)/FS; +SI = abs((2*(StepTime2-StepTime1))./(StepTime2+StepTime1))*100; +ResultStruct.GaitSymmIndex = nanmean(SI); +end diff --git a/FilterandRealignFunc.m b/FilterandRealignFunc.m new file mode 100644 index 0000000..d63fa5d --- /dev/null +++ b/FilterandRealignFunc.m @@ -0,0 +1,18 @@ +function [dataAcc, dataAcc_filt] = FilterandRealignFunc(inputData,FS,ApplyRealignment) + +%% Filter and Realign Accdata + +% Apply Realignment & Filter data + +if ApplyRealignment % apply relignment as described in Rispens S, Pijnappels M, van Schooten K, Beek PJ, Daffertshofer A, van Die?n JH (2014). + data = inputData(:, [3,2,4]); % reorder data to 1 = V; 2= ML, 3 = AP% + % Consistency of gait characteristics as determined from acceleration data collected at different trunk locations. Gait Posture 2014;40(1):187-92. + [RealignedAcc, ~] = RealignSensorSignalHRAmp(data, FS); + dataAcc = RealignedAcc; + [B,A] = butter(2,20/(FS/2),'low'); + dataAcc_filt = filtfilt(B,A,dataAcc); +else % we asume tat data is already reorderd to 1 = V; 2= ML, 3 = AP in an earlier stage; + [B,A] = butter(2,20/(FS/2),'low'); + dataAcc = inputData; + dataAcc_filt = filtfilt(B,A,dataAcc); +end diff --git a/GaitOutcomesTrunkAccFuncIH.m b/GaitOutcomesTrunkAccFuncIH.m new file mode 100644 index 0000000..7fa4d7a --- /dev/null +++ b/GaitOutcomesTrunkAccFuncIH.m @@ -0,0 +1,210 @@ +function [ResultStruct] = GaitOutcomesTrunkAccFuncIH(inputData,FS,LegLength,WindowLen,ApplyRealignment,ApplyRemoveSteps) + +% DESCRIPTON: Trunk analysis of Iphone data without the need for step detection +% CL Nov 2019 +% Adapted IH feb-april 2020 + +% koloms data of smartphone +% 1st column is time data; +% 2nd column is X, medio-lateral: + left, - right +% 3rd column is Y, vertical: + downwards, - upwards +% 4th column is Z, anterior- posterior : + forwards, - backwards + +%% Input Trunk accelerations during locomotion in VT, ML, AP direction +% InputData: Acceleration signal with time and accelerations in VT,ML and +% AP direction. +% FS: sample frequency of the Accdata +% LegLength: length of the leg of the participant in m; + + +%% Output +% ResultStruct: structure coninting all outcome measured calculated +% Spectral parameters, spatiotemporal gait parameters, non-linear +% parameters +% fields and subfields: include the multiple measurements of a subject + +%% Literature +% Richman & Moorman, 2000; [ sample entropy] +% Bisi & Stagni Gait & Posture 2016, 47 (6) 37-42 +% Kavagnah et al., Eur J Appl Physiol 2005 94: 468?475; Human Movement Science 24(2005) 574?587 [ synchrony] +% Moe-Nilsen J Biomech 2004 37, 121-126 [ autorcorrelation step regularity and symmetry +% Kobsar et al. Gait & Posture 2014 39, 553?557 [ synchrony ] +% Rispen et al; Gait & Posture 2014, 40, 187 - 192 [realignment axes] +% Zijlstra & HofGait & Posture 2003 18,2, 1-10 [spatiotemporal gait variables] +% Lamoth et al, 2002 [index of harmonicity] +% Costa et al. 2003 Physica A 330 (2003) 53–60 [ multiscale entropy] +% Cignetti F, Decker LM, Stergiou N. Ann Biomed Eng. 2012 +% May;40(5):1122-30. doi: 10.1007/s10439-011-0474-3. Epub 2011 Nov 25. [ +% Wofl vs. Rosenstein Lyapunov] + + +%% Settings +Gr = 9.81; % Gravity acceleration, multiplication factor for accelerations +StrideFreqEstimate = 1.00; % Used to set search for stride frequency from 0.5*StrideFreqEstimate until 2*StrideFreqEstimate +StrideTimeRange = [0.2 4.0]; % Range to search for stride time (seconds) +IgnoreMinMaxStrides = 0.10; % Number or percentage of highest&lowest values ignored for improved variability estimation +N_Harm = 12; % Number of harmonics used for harmonic ratio, index of harmonicity and phase fluctuation +LowFrequentPowerThresholds = ... + [0.7 1.4]; % Threshold frequencies for estimation of low-frequent power percentages +Lyap_m = 7; % Embedding dimension (used in Lyapunov estimations) +Lyap_FitWinLen = round(60/100*FS); % Fitting window length (used in Lyapunov estimations Rosenstein's method) +Sen_m = 5; % Dimension, the length of the subseries to be matched (used in sample entropy estimation) +Sen_r = 0.3; % Tolerance, the maximum distance between two samples to qualify as match, relative to std of DataIn (used in sample entropy estimation) +NStartEnd = [100]; +M = 5; % maximum template length +ResultStruct = struct(); + +%% Filter and Realign Accdata + +% Apply Realignment & Filter data + +if ApplyRealignment % apply relignment as described in Rispens S, Pijnappels M, van Schooten K, Beek PJ, Daffertshofer A, van Die?n JH (2014). + data = inputData(:, [3,2,4]); % reorder data to 1 = V; 2= ML, 3 = AP% + % Consistency of gait characteristics as determined from acceleration data collected at different trunk locations. Gait Posture 2014;40(1):187-92. + [RealignedAcc, ~] = RealignSensorSignalHRAmp(data, FS); + dataAcc = RealignedAcc; + [B,A] = butter(2,20/(FS/2),'low'); + dataAcc_filt = filtfilt(B,A,dataAcc); +else % we asume tat data is already reorderd to 1 = V; 2= ML, 3 = AP in an earlier stage; + [B,A] = butter(2,20/(FS/2),'low'); + dataAcc = inputData; + dataAcc_filt = filtfilt(B,A,dataAcc); +end + + +%% Step dectection +% Determines the number of steps in the signal so that the first 30 and last 30 steps in the signal can be removed + +if ApplyRemoveSteps + + % In order to run the step detection script we first need to run an autocorrelation function; + [ResultStruct] = AutocorrStrides(dataAcc_filt,FS, StrideTimeRange,ResultStruct); + + % StrideTimeSamples is needed as an input for the stepcountFunc; + StrideTimeSamples = ResultStruct.StrideTimeSamples; + + % Calculate the number of steps; + [PksAndLocsCorrected] = StepcountFunc(dataAcc_filt,StrideTimeSamples,FS); + % This function selects steps based on negative and positive values. + % However to determine the steps correctly we only need one of these; + LocsSteps = PksAndLocsCorrected(1:2:end,2); + + %% Cut data & remove currents results + % Remove 20 steps in the beginning and end of data + dataAccCut = dataAcc(LocsSteps(31):LocsSteps(end-30),:); + dataAccCut_filt = dataAcc_filt(LocsSteps(31):LocsSteps(end-30),:); + + % Clear currently saved results from Autocorrelation Analysis + + clear ResultStruct; + clear PksAndLocsCorrected; + clear LocsSteps; + +else; + dataAccCut = dataAcc; + dataAccCut_filt = dataAcc_filt; +end + +%% Calculate stride parameters +ResultStruct = struct; % create empty struct + +% Run function AutoCorrStrides, Outcomeparameters: StrideRegularity,RelativeStrideVariability,StrideTimeSamples,StrideTime +[ResultStruct] = AutocorrStrides(dataAccCut_filt,FS, StrideTimeRange,ResultStruct); +StrideTimeSamples = ResultStruct.StrideTimeSamples; % needed as input for other functions + +% Calculate Step symmetry --> method 1 +ij = 1; +dirSymm = [1,3]; % Gait Synmmetry is only informative in AP/V direction: See Tura A, Raggi M, Rocchi L, Cutti AG, Chiari L: Gait symmetry and regularity in transfemoral amputees assessed by trunk accelerations. J Neuroeng Rehabil 2010, 7:4. + +for jk=1:length(dirSymm) + [C, lags] = AutocorrRegSymmSteps(dataAccCut_filt(:,dirSymm(jk))); + [Ad,p] = findpeaks(C,'MinPeakProminence',0.2, 'MinPeakHeight', 0.2); + + if size(Ad,1) > 1 + Ad1 = Ad(1); + Ad2 = Ad(2); + GaitSymm(:,ij) = abs((Ad1-Ad2)/mean([Ad1+Ad2]))*100; + else + GaitSymm(:,ij) = NaN; + end + ij = ij +1; +end +% Save outcome in struct; +ResultStruct.GaitSymm_V = GaitSymm(1); +ResultStruct.GaitSymm_AP = GaitSymm(2); + +% Calculate Step symmetry --> method 2 +[PksAndLocsCorrected] = StepcountFunc(dataAccCut_filt,StrideTimeSamples,FS); +LocsSteps = PksAndLocsCorrected(2:2:end,2); + +if rem(size(LocsSteps,1),2) == 0; % is number of steps is even + LocsSteps2 = LocsSteps(1:2:end); +else + LocsSteps2 = LocsSteps(3:2:end); +end + +LocsSteps1 = LocsSteps(2:2:end); +DiffLocs2 = diff(LocsSteps2); +DiffLocs1 = diff(LocsSteps1); +StepTime2 = DiffLocs2(1:end-1)/FS; % leave last one out because it is higher +StepTime1 = DiffLocs1(1:end-1)/FS; +SI = abs((2*(StepTime2-StepTime1))./(StepTime2+StepTime1))*100; +ResultStruct.GaitSymmIndex = nanmean(SI); + +%% Calculate spatiotemporal stride parameters + +% Measures from height variation by double integration of VT accelerations and high-pass filtering +[ResultStruct] = SpatioTemporalGaitParameters(dataAccCut_filt,StrideTimeSamples,ApplyRealignment,LegLength,FS,IgnoreMinMaxStrides,ResultStruct); + +%% Measures derived from spectral analysis + +AccVectorLen = sqrt(sum(dataAccCut_filt(:,1:3).^2,2)); +[ResultStruct] = SpectralAnalysisGaitfunc(dataAccCut_filt,WindowLen,FS,N_Harm,LowFrequentPowerThresholds,AccVectorLen,ResultStruct); + + +%% Calculation non-linear parameters; + +% cut into windows of size WindowLen +N_Windows = floor(size(dataAccCut,1)/WindowLen); +N_SkipBegin = ceil((size(dataAccCut,1)-N_Windows*WindowLen)/2); +LyapunovWolf = nan(N_Windows,3); +LyapunovRosen = nan(N_Windows,3); +SE= nan(N_Windows,3); + +for WinNr = 1:N_Windows; + AccWin = dataAccCut(N_SkipBegin+(WinNr-1)*WindowLen+(1:WindowLen),:); + for j=1:3 + [LyapunovWolf(WinNr,j),~] = CalcMaxLyapWolfFixedEvolv(AccWin(:,j),FS,struct('m',Lyap_m)); + [LyapunovRosen(WinNr,j),outpo] = CalcMaxLyapConvGait(AccWin(:,j),FS,struct('m',Lyap_m,'FitWinLen',Lyap_FitWinLen)); + [SE(WinNr,j)] = funcSampleEntropy(AccWin(:,j), Sen_m, Sen_r); + % no correction for FS; SE does increase with higher FS but effect is considered negligible as range is small (98-104HZ). Might consider updating r to account for larger ranges. + end +end + +LyapunovWolf = nanmean(LyapunovWolf,1); +LyapunovRosen = nanmean(LyapunovRosen,1); +SampleEntropy = nanmean(SE,1); + +ResultStruct.LyapunovWolf_V = LyapunovWolf(1); +ResultStruct.LyapunovWolf_ML = LyapunovWolf(2); +ResultStruct.LyapunovWolf_AP = LyapunovWolf(3); +ResultStruct.LyapunovRosen_V = LyapunovRosen(1); +ResultStruct.LyapunovRosen_ML = LyapunovRosen(2); +ResultStruct.LyapunovRosen_AP = LyapunovRosen(3); +ResultStruct.SampleEntropy_V = SampleEntropy(1); +ResultStruct.SampleEntropy_ML = SampleEntropy(2); +ResultStruct.SampleEntropy_AP = SampleEntropy(3); + +if isfield(ResultStruct,'StrideFrequency') + LyapunovPerStrideWolf = LyapunovWolf/ResultStruct.StrideFrequency; + LyapunovPerStrideRosen = LyapunovRosen/ResultStruct.StrideFrequency; +end + +ResultStruct.LyapunovPerStrideWolf_V = LyapunovPerStrideWolf(1); +ResultStruct.LyapunovPerStrideWolf_ML = LyapunovPerStrideWolf(2); +ResultStruct.LyapunovPerStrideWolf_AP = LyapunovPerStrideWolf(3); +ResultStruct.LyapunovPerStrideRosen_V = LyapunovPerStrideRosen(1); +ResultStruct.LyapunovPerStrideRosen_ML = LyapunovPerStrideRosen(2); +ResultStruct.LyapunovPerStrideRosen_AP = LyapunovPerStrideRosen(3); + +end \ No newline at end of file diff --git a/GaitVariabilityAnalysisIH.m b/GaitVariabilityAnalysisIH.m new file mode 100644 index 0000000..f40b72c --- /dev/null +++ b/GaitVariabilityAnalysisIH.m @@ -0,0 +1,74 @@ +% Gait Variability Analysis +% Script created for BAP students 2020 +% Iris Hagoort +% April 2020 + +% Input: needs mat file which contains all raw accelerometer data +% Input: needs excel file containing the participant information including +% leg length. + +%% Clear and close; +clear; +close all; + +%% Load data +load('Phyphoxdata.mat'); % loads accelerometer data, is stored in struct with name AccData +load('ExcelInfo.mat'); +Participants = fields(AccData); + +%% Settings +FS = 100; % sample frequency +LegLengths = excel.data.GeneralInformation(:,5); % leglength info is in 5th column +LegLengthsM = LegLengths/100; % convert to m + +%% Calculate parameters; +for i = 1: length(Participants); +tic; + LegLength = LegLengthsM(i); + WalkingConditions = fields(AccData.([char(Participants(i))])); + + for j = 1: length(WalkingConditions); + + if strcmp(char(WalkingConditions(j)),'Treadmill') + + SubConditions = fieldnames(AccData.([char(Participants(i))]).([char(WalkingConditions(j))])); + + for k = 1: length(SubConditions); + inputData = AccData.([char(Participants(i))]).([char(WalkingConditions(j))]).([char(SubConditions(k))]); + WindowLength = FS*10; + ApplyRealignment = true; + ApplyRemoveSteps = true; + [ResultStruct] = GaitOutcomesTrunkAccFuncIH(inputData,FS,LegLength,WindowLen,ApplyRealignment,ApplyRemoveSteps); + OutcomesAcc.([char(Participants(i))]).([char(WalkingConditions(j))]).([char(SubConditions(k))]) = ResultStruct; + end + + elseif strcmp(char(WalkingConditions(j)),'Balance') || strcmp(char(WalkingConditions(j)),'TwoMWT') + disp('Files are not used for current analysis'); + + elseif strcmp(char(WalkingConditions(j)),'InsideStraight') + inputData = AccData.([char(Participants(i))]).([char(WalkingConditions(j))]); + ApplyRealignment = true; + ApplyRemoveSteps = false; % don't remove steps for the straight conditions + % function specific for the walking conditions containing a lot + % of turns + [ResultStruct] = GaitVariabilityAnalysisIH_WithoutTurns(inputData,FS,LegLength,ApplyRealignment,ApplyRemoveSteps); + OutcomesAcc.([char(Participants(i))]).([char(WalkingConditions(j))]) = ResultStruct; + + else + inputData = AccData.([char(Participants(i))]).([char(WalkingConditions(j))]); + ApplyRealignment = true; + ApplyRemoveSteps = true; + WindowLen = FS*10; + [ResultStruct] = GaitOutcomesTrunkAccFuncIH(inputData,FS,LegLength,WindowLen,ApplyRealignment,ApplyRemoveSteps) + OutcomesAcc.([char(Participants(i))]).([char(WalkingConditions(j))]) = ResultStruct; + end + end + + toc; +end + +% Save struct as .mat file +save('GaitVarOutcomes30pril.mat', 'OutcomesAcc'); + + + diff --git a/GaitVariabilityAnalysisIH_WithoutTurns.m b/GaitVariabilityAnalysisIH_WithoutTurns.m new file mode 100644 index 0000000..21c90bb --- /dev/null +++ b/GaitVariabilityAnalysisIH_WithoutTurns.m @@ -0,0 +1,108 @@ +function [ResultStruct] = GaitVariabilityAnalysisIH_WithoutTurns(inputData,FS,LegLength,ApplyRealignment,ApplyRemoveSteps); + + +% SCRIPT FOR ANAlysis straight parts +% NOG GOEDE BESCHRIJVING TOEVOEGEN. + +%% Realign data +data = inputData(:, [3,2,4]); % reorder data to 1 = V; 2= ML, 3 = AP + +%Realign sensor data to VT-ML-AP frame +if ApplyRealignment % apply relignment as described in Rispens S, Pijnappels M, van Schooten K, Beek PJ, Daffertshofer A, van Die?n JH (2014). + % Consistency of gait characteristics as determined from acceleration data collected at different trunk locations. Gait Posture 2014;40(1):187-92. + [RealignedAcc, ~] = RealignSensorSignalHRAmp(data, FS); + dataAcc = RealignedAcc; +end + +%% Filter data strongly & Determine location of steps + +% Filter data +[B,A] = butter(2,3/(FS/2),'low'); % Filters data very strongly which is needed to determine turns correctly +dataStepDetection = filtfilt(B,A,dataAcc); + +% Determine steps; + +%%%%%%% HIER MISSCHIEN ALTERNATIEF VOOR VAN RISPENS %%%%%%%%%%%%% + +% Explanation of method: https://nl.mathworks.com/help/supportpkg/beagleboneblue/ref/counting-steps-using-beagleboneblue-hardware-example.html +% From website: To convert the XYZ acceleration vectors at each point in time into scalar values, +% calculate the magnitude of each vector. This way, you can detect large changes in overall acceleration, +% such as steps taken while walking, regardless of device orientation. + +magfilt = sqrt(sum((dataStepDetection(:,1).^2) + (dataStepDetection(:,2).^2) + (dataStepDetection(:,3).^2), 2)); +magNoGfilt = magfilt - mean(magfilt); +minPeakHeight2 = std(magNoGfilt); +[pks, locs] = findpeaks(magNoGfilt, 'MINPEAKHEIGHT', minPeakHeight2); % for step detection +numStepsOption2_filt = numel(pks); % counts number of steps; + +%%%%%%%%%%%%%%%%%%%%%%%% TOT HIER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Determine locations of turns; + +diffLocs = diff(locs); % calculates difference in step location +avg_diffLocs = mean(diffLocs); % average distance between steps +std_diffLocs = std(diffLocs); % standard deviation of distance between steps + +figure; +findpeaks(diffLocs, 'MINPEAKHEIGHT', avg_diffLocs, 'MINPEAKDISTANCE',5); % these values have been chosen based on visual inspection of the signal +line([1 length(diffLocs)],[avg_diffLocs avg_diffLocs]) +[pks_diffLocs, locs_diffLocs] = findpeaks(diffLocs, 'MINPEAKHEIGHT', avg_diffLocs,'MINPEAKDISTANCE',5); +locsTurns = [locs(locs_diffLocs), locs(locs_diffLocs+1)]; + +%% Visualizing turns + +% Duplying signal + visualing +% to make second signal with the locations of the turns filled with NaN, so +% that both signals can be plotted above each other in a different colour + +magNoGfilt_copy = magNoGfilt; +for k = 1: size(locsTurns,1); + magNoGfilt_copy(locsTurns(k,1):locsTurns(k,2)) = NaN; +end + + +% visualising signal; +figure; +subplot(2,1,1) +hold on; +plot(magNoGfilt,'b') +plot(magNoGfilt_copy, 'r'); +title('Inside Straight: Filtered data with turns highlighted in blue') +hold off; + +%% Calculation +% VRAAG LAURENS zie blauwe blaadje + +startPos = 1; +for i = 1: size(locsTurns,1); + endPos = locsTurns(i,1)-1; + + inputData = dataAcc(startPos:endPos,:); + WindowLen = size(inputData,1); + ApplyRealignment = false; + [ResultStruct] = GaitOutcomesTrunkAccFuncIH(inputData,FS,LegLength,WindowLen,ApplyRealignment,ApplyRemoveSteps); % Naam van deze moet nog aangepast. + + if i ==1 % only the firs time + Parameters = fieldnames(ResultStruct); + NrParameters = length(Parameters); + end + + for j = 1:NrParameters % only works if for every bin we get the same outcomes (which is the case in this script) + DataStraight.([char(Parameters(j))])(i) = ResultStruct.([char(Parameters(j))]); + end + startPos = locsTurns(i,2)+1; + +end + +clear ResultStruct; + +% Calculate mean over the bins without turns to get 1 outcome value per parameter for inside +% straight; + +for j = 1:NrParameters; + ResultStruct.([char(Parameters(j))]) = nanmean(DataStraight.([char(Parameters(j))])) +end + + +end + diff --git a/GaitVariabilityAnalysisLD.html b/GaitVariabilityAnalysisLD.html new file mode 100644 index 0000000..122281a --- /dev/null +++ b/GaitVariabilityAnalysisLD.html @@ -0,0 +1,1709 @@ + +Gait Variability Analysis CLBP

Gait Variability Analysis CLBP

% Gait Variability Analysis
% Script created for MAP 2020-2021
% adapted from Claudine Lamoth and Iris Hagoort
% version1 October 2020
% Input: needs mat file which contains all raw accelerometer data
% Input: needs excel file containing the participant information including
% leg length.

Clear and close;

clear;
close all;

Load data;

Select 1 trial. For loop to import all data will be used at a later stage
[FNaam,FilePad] = uigetfile('*.xls','Load phyphox data...');
filename =[FilePad FNaam];
PhyphoxData = xlsread(filename)
PhyphoxData = 24092×4
0 0.4018 -8.5041 4.8779 + 0.0100 0.3962 -8.4703 4.7944 + 0.0199 0.4335 -8.4378 4.7159 + 0.0299 0.5209 -8.3889 4.6266 + 0.0399 0.6495 -8.3796 4.5437 + 0.0498 0.7528 -8.3817 4.4288 + 0.0598 0.8820 -8.3622 4.3134 + 0.0697 0.9841 -8.4321 4.2221 + 0.0797 1.1041 -8.5237 4.1916 + 0.0897 1.1959 -8.5418 4.1310 +
%load('Phyphoxdata.mat'); % loads accelerometer data, is stored in struct with name AccData
%load('ExcelInfo.mat');
%Participants = fields(AccData);

Settings;

LegLength = 98 % LegLength info not available!
LegLength = 98
%LegLengths = excel.data.GeneralInformation(:,5); % leglength info is in 5th column
LegLengthsM = LegLength/100; % convert to m
t1 = length(PhyphoxData(:,1)); % Number of Samples
FS = 100; % sample frequency
Time_ms = PhyphoxData(:,1);
accX = PhyphoxData(:,2);
accY = PhyphoxData(:,3);
accZ = PhyphoxData(:,4);
AccData = (PhyphoxData(:,[1 2 3 4])); % matrix with accelerometer data
Start = 1; % Start time (s) for plot
End = 60; % End time (s) for plot
T1 = Start*FS; % Start time calculated from Hz
T2 = End*FS; % End time calculated from Hz
c = (Start:(1/FS):End)'; % Time STEPSIZE = 1/100

Plot the data;

(1) first step in notebook
1st column is time data (ms)
2nd column is X, medio-lateral: + left, - right
3rd column is Y, vertical: + downwards, - upwards
4th column is Z, anterior- posterior : + forwards, - backwards
AccX = accX(T1:T2); % Signal over timeframe
AccY = accY(T1:T2); % Signal over timeframe
AccZ = accZ(T1:T2); % Signal over timeframe
figure(1);
plot(c,AccX,c,AccY,c,AccZ); % Plot signal over timeframe
title('acc signal not filtered - First Minute')
xlabel('Time (s)');
ylabel('acceleration (g)');
legend('X - ML','Y - Vertical','Z - AP')

Calculate parameters;

calculate only for the first participant;
inputData = AccData;
WindowLength = FS*10; % why FS*10?
ApplyRealignment = true; % reorder data to 1 = V; 2= ML, 3 = AP
ApplyRemoveSteps = false; % if true - removes first 30 and last 30 steps
[ResultStruct] = GaitOutcomesTrunkAccFuncIH(inputData,FS,LegLength,WindowLength,ApplyRealignment,ApplyRemoveSteps)
ResultStruct = struct with fields:
StrideRegularity_V: 0.3908 + StrideRegularity_ML: 0.4191 + StrideRegularity_AP: 0.1101 + StrideRegularity_All: 0.3529 + RelativeStrideVariability_V: 0.6092 + RelativeStrideVariability_ML: 0.5809 + RelativeStrideVariability_AP: 0.8899 + RelativeStrideVariability_All: 0.6471 + StrideTimeSamples: 132 + StrideTimeSeconds: 1.3200 + GaitSymm_V: 16.8830 + GaitSymm_AP: NaN + GaitSymmIndex: 2.8065 + StepLengthMean: 11.5894 + Distance: 1.8825e+03 + WalkingSpeedMean: 7.8279 + StrideTimeVariability: 0.1931 + StrideSpeedVariability: 1.1210 + StrideLengthVariability: 0.7532 + StrideTimeVariabilityOmitOutlier: 14.7357 + StrideSpeedVariabilityOmitOutlier: 0.8713 + StrideLengthVariabilityOmitOutlier: 0.4511 + IndexHarmonicity_V: 0.6094 + IndexHarmonicity_ML: 0.8041 + IndexHarmonicity_AP: 0.9122 + IndexHarmonicity_All: 0.6742 + HarmonicRatio_V: 2.4928 + HarmonicRatio_ML: 2.8449 + HarmonicRatio_AP: 1.6364 + HarmonicRatioP_V: 9.1114 + HarmonicRatioP_ML: 14.1449 + HarmonicRatioP_AP: 5.6995 + FrequencyVariability_V: 0.5234 + FrequencyVariability_ML: 0.6435 + FrequencyVariability_AP: 0.6281 + StrideFrequency: 0.7367 + LyapunovWolf_V: 1.3653 + LyapunovWolf_ML: 1.1477 + LyapunovWolf_AP: 1.4231 + LyapunovRosen_V: 1.0151 + LyapunovRosen_ML: 0.7871 + LyapunovRosen_AP: 0.9792 + SampleEntropy_V: 0.1999 + SampleEntropy_ML: 0.2537 + SampleEntropy_AP: 0.2710 + LyapunovPerStrideWolf_V: 1.8534 + LyapunovPerStrideWolf_ML: 1.5579 + LyapunovPerStrideWolf_AP: 1.9318 + LyapunovPerStrideRosen_V: 1.3780 + LyapunovPerStrideRosen_ML: 1.0685 + LyapunovPerStrideRosen_AP: 1.3292 +
output:
- NaN GaitSymm_V:
  • Gait Synmmetry is only informative in AP/V direction: See Tura A, Raggi M, Rocchi L, Cutti AG, Chiari L: Gait symmetry and regularity in transfemoral amputees assessed by trunk accelerations. J Neuroeng Rehabil 2010, 7:4
- SampEn has two advantages over ApEn: data length independence and a relatively trouble-free implementation.
- Some Settings ResulStruct
IgnoreMinMaxStrides = 0.10; % Number or percentage of highest&lowest values ignored for improved variability estimation
N_Harm = 12; % Number of harmonics used for harmonic ratio, index of harmonicity and phase fluctuation
Lyap_m = 7; % Embedding dimension (used in Lyapunov estimations)
Lyap_FitWinLen = round(60/100*FS); % Fitting window length (used in Lyapunov estimations Rosenstein's method)
Sen_m = 5; % Dimension, the length of the subseries to be matched (used in sample entropy estimation)
Sen_r = 0.3; % Tolerance, the maximum distance between two samples to qualify as match, relative to std of DataIn (used in sample entropy estimation)

Index of harmonicity (Lamoth et al. 2002)

by means of a discrete Fourier transform (DFT). The peak power at the first six harmonics was estimated and, subsequently, the index of harmonicity was defined as ; FORMULA
where P0 is the power spectral density of the fundamental frequency (first harmonic) and $ Pi the cumulative sum of power spectral density of the fundamental frequency and the first five superharmonics. A power ratio of 1 indicates that the rotation of the pelvis or the thorax is perfectly harmonic. In view of possible drift, which could lead to missing or widening peaks, the power spectral density of each peak was calculated within the frequency bands of +0.1 and −0.1 Hz of the peak frequency value. All power spectral densities were normalized by dividing the power by the sum of the total power spectrum, which equals the variance.

Lyapunov exponents (Wolfs vs. Rosenstein)

The W-algorithm is advocated for use when examining local dynamic stability with small gait data sets.

Visualize step detection;

function [ResultStruct] = GaitVariabilityAnalysisIH_WithoutTurns(inputData,FS,LegLength,ApplyRealignment,ApplyRemoveSteps);
script for analysing straight parts
(1) Realign Data
%% Realign data
data = inputData(:, [3,2,4]); % reorder data to 1 = V; 2= ML, 3 = AP
%Realign sensor data to VT-ML-AP frame
if ApplyRealignment % apply relignment as described in Rispens S, Pijnappels M, van Schooten K, Beek PJ, Daffertshofer A, van Die?n JH (2014).
% Consistency of gait characteristics as determined from acceleration data collected at different trunk locations. Gait Posture 2014;40(1):187-92.
[RealignedAcc, ~] = RealignSensorSignalHRAmp(data, FS);
dataAcc = RealignedAcc;
end
(2) Filter Data
%% Filter data strongly & Determine location of steps
% Filter data
[B,A] = butter(2,3/(FS/2),'low'); % Filters data very strongly which is needed to determine turns correctly
dataStepDetection = filtfilt(B,A,dataAcc);
(3) Determine Location of steps
% Determine steps;
%%%%%%% HIER MISSCHIEN ALTERNATIEF VOOR VAN RISPENS %%%%%%%%%%%%%
% Explanation of method: https://nl.mathworks.com/help/supportpkg/beagleboneblue/ref/counting-steps-using-beagleboneblue-hardware-example.html
% From website: To convert the XYZ acceleration vectors at each point in time into scalar values,
% calculate the magnitude of each vector. This way, you can detect large changes in overall acceleration,
% such as steps taken while walking, regardless of device orientation.
magfilt = sqrt(sum((dataStepDetection(:,1).^2) + (dataStepDetection(:,2).^2) + (dataStepDetection(:,3).^2), 2));
magNoGfilt = magfilt - mean(magfilt);
minPeakHeight2 = std(magNoGfilt);
[pks, locs] = findpeaks(magNoGfilt, 'MINPEAKHEIGHT', minPeakHeight2); % for step detection
numStepsOption2_filt = numel(pks); % counts number of steps;
(4) Determine location of turns
%% Determine locations of turns;
diffLocs = diff(locs); % calculates difference in step location
avg_diffLocs = mean(diffLocs); % average distance between steps
std_diffLocs = std(diffLocs); % standard deviation of distance between steps
figure(2);
findpeaks(diffLocs, 'MINPEAKHEIGHT', avg_diffLocs, 'MINPEAKDISTANCE',5); % these values have been chosen based on visual inspection of the signal
line([1 length(diffLocs)],[avg_diffLocs avg_diffLocs])
[pks_diffLocs, locs_diffLocs] = findpeaks(diffLocs, 'MINPEAKHEIGHT', avg_diffLocs,'MINPEAKDISTANCE',5);
locsTurns = [locs(locs_diffLocs), locs(locs_diffLocs+1)];
(5) Visualize turns
%% Visualizing turns
% Duplying signal + visualing
% to make second signal with the locations of the turns filled with NaN, so
% that both signals can be plotted above each other in a different colour
magNoGfilt_copy = magNoGfilt;
for k = 1: size(locsTurns,1);
magNoGfilt_copy(locsTurns(k,1):locsTurns(k,2)) = NaN;
end
% visualising signal;
figure;
subplot(2,1,1)
hold on;
plot(magNoGfilt,'b')
plot(magNoGfilt_copy, 'r');
title('Inside Straight: Filtered data with turns highlighted in blue')
hold off;
(6) CALCULATIONS
%% Calculation
% VRAAG LAURENS zie blauwe blaadje
startPos = 1;
for i = 1: size(locsTurns,1);
endPos = locsTurns(i,1)-1;
inputData = dataAcc(startPos:endPos,:);
WindowLen = size(inputData,1);
ApplyRealignment = false;
[ResultStruct] = GaitOutcomesTrunkAccFuncIH(inputData,FS,LegLength,WindowLen,ApplyRealignment,ApplyRemoveSteps); % Naam van deze moet nog aangepast.
if i ==1 % only the firs time
Parameters = fieldnames(ResultStruct);
NrParameters = length(Parameters);
end
for j = 1:NrParameters % only works if for every bin we get the same outcomes (which is the case in this script)
DataStraight.([char(Parameters(j))])(i) = ResultStruct.([char(Parameters(j))]);
end
startPos = locsTurns(i,2)+1;
end
clear ResultStruct;
% Calculate mean over the bins without turns to get 1 outcome value per parameter for inside
% straight;
for j = 1:NrParameters;
ResultStruct.([char(Parameters(j))]) = nanmean(DataStraight.([char(Parameters(j))]))
end
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 + SampleEntropy_ML: 0.2358 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 + SampleEntropy_ML: 0.2358 + SampleEntropy_AP: 0.2608 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 + SampleEntropy_ML: 0.2358 + SampleEntropy_AP: 0.2608 + LyapunovPerStrideWolf_V: 2.3378 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 + SampleEntropy_ML: 0.2358 + SampleEntropy_AP: 0.2608 + LyapunovPerStrideWolf_V: 2.3378 + LyapunovPerStrideWolf_ML: 2.0830 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 + SampleEntropy_ML: 0.2358 + SampleEntropy_AP: 0.2608 + LyapunovPerStrideWolf_V: 2.3378 + LyapunovPerStrideWolf_ML: 2.0830 + LyapunovPerStrideWolf_AP: 2.4095 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 + SampleEntropy_ML: 0.2358 + SampleEntropy_AP: 0.2608 + LyapunovPerStrideWolf_V: 2.3378 + LyapunovPerStrideWolf_ML: 2.0830 + LyapunovPerStrideWolf_AP: 2.4095 + LyapunovPerStrideRosen_V: 1.5914 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 + SampleEntropy_ML: 0.2358 + SampleEntropy_AP: 0.2608 + LyapunovPerStrideWolf_V: 2.3378 + LyapunovPerStrideWolf_ML: 2.0830 + LyapunovPerStrideWolf_AP: 2.4095 + LyapunovPerStrideRosen_V: 1.5914 + LyapunovPerStrideRosen_ML: 1.2964 +
ResultStruct = struct with fields:
StrideRegularity_V: 0.9005 + StrideRegularity_ML: 0.7110 + StrideRegularity_AP: 0.6643 + StrideRegularity_All: 0.7765 + RelativeStrideVariability_V: 0.0995 + RelativeStrideVariability_ML: 0.2890 + RelativeStrideVariability_AP: 0.3357 + RelativeStrideVariability_All: 0.2235 + StrideTimeSamples: 217.5556 + StrideTimeSeconds: 2.1756 + GaitSymm_V: 5.7952 + GaitSymm_AP: 7.0128 + GaitSymmIndex: 2.3916 + StepLengthMean: 11.9893 + Distance: 83.0819 + WalkingSpeedMean: 6.1785 + StrideTimeVariability: 0.0200 + StrideSpeedVariability: 0.1990 + StrideLengthVariability: 0.5502 + StrideTimeVariabilityOmitOutlier: 6.0071 + StrideSpeedVariabilityOmitOutlier: 0.2542 + StrideLengthVariabilityOmitOutlier: 0.3722 + IndexHarmonicity_V: 0.4981 + IndexHarmonicity_ML: 0.7579 + IndexHarmonicity_AP: 0.8968 + IndexHarmonicity_All: 0.6349 + HarmonicRatio_V: 3.6118 + HarmonicRatio_ML: 3.4148 + HarmonicRatio_AP: 2.5141 + HarmonicRatioP_V: 21.1829 + HarmonicRatioP_ML: 19.5829 + HarmonicRatioP_AP: 12.5052 + FrequencyVariability_V: 0.2160 + FrequencyVariability_ML: 0.4381 + FrequencyVariability_AP: 0.1981 + StrideFrequency: 0.6364 + LyapunovWolf_V: 1.4401 + LyapunovWolf_ML: 1.2904 + LyapunovWolf_AP: 1.5238 + LyapunovRosen_V: 0.9931 + LyapunovRosen_ML: 0.8064 + LyapunovRosen_AP: 1.0984 + SampleEntropy_V: 0.2014 + SampleEntropy_ML: 0.2358 + SampleEntropy_AP: 0.2608 + LyapunovPerStrideWolf_V: 2.3378 + LyapunovPerStrideWolf_ML: 2.0830 + LyapunovPerStrideWolf_AP: 2.4095 + LyapunovPerStrideRosen_V: 1.5914 + LyapunovPerStrideRosen_ML: 1.2964 + LyapunovPerStrideRosen_AP: 1.7481 +

AggregateFunction;

+
+ \ No newline at end of file diff --git a/GaitVariabilityAnalysisLD.mlx b/GaitVariabilityAnalysisLD.mlx new file mode 100644 index 0000000000000000000000000000000000000000..edd5a70ede0ac6c879433269f1f5ad8b64a52162 GIT binary patch literal 589968 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