1 view (last 30 days)

Show older comments

Hi, I am using MATLAB R2020a on a MacOS. I am trying to remove outlier values in a while loop. This involves calculating an exponentially weighted moving mean and then comparing this a vector value. If the conditions are met, the vector input is then added to a separate vector o 'acceptable' values. The while loop then advances to the next input and calculates the new exponentially weighted moving average which includes the newly accepted vector input.

However, if the condition is not met, I written code so that, instead of adding the input sample, a zero is added to the vector of 'acceptable' values. Upon the next acceptable value being added, I currently have it so the zero immediately before is replaced by the mean of the 2 framing acceptable values. However, this only accounts for one past zero and not for multiple outliers. Replacing with a framing mean may also introduce aliaising errors.

Is there any way that the zeros can instead be replaced by extrapolating the "candidate outlier" point using the gradient based on the last 2 accepted average values?

I would very much appreciate any suggestions, thanks in advance.

% Calculate exponentially weighted moving mean and tau without outliers

accepted_means = zeros(length(cycle_periods_filtered),1); % array for accepted exponentially weighted means

accepted_means(1) = cycle_periods_filtered(1);

k = zeros(length(cycle_periods_filtered),1); % array for accepted raw cycle periods

m = zeros(length(cycle_periods_filtered), 1); % array for raw periods for all cycles with outliers replaced by mean of framing values

k(1) = cycle_periods_filtered(1);

m(1) = cycle_periods_filtered(1);

tau = m/3; % pre-allocation for efficiency

i = 2; % index for counting through input signal

j = 2; % index for counting through accepted exponential mean values

n = 2; % index for counting through raw periods of all cycles

cycle_index3(1) = 1;

while i <= length(cycle_periods_filtered)

mavCurrent = (1 - 1/w(j))*accepted_means(j - 1) + (1/w(j))*cycle_periods_filtered(i);

if cycle_periods_filtered(i) < 1.5*(accepted_means(j - 1)) && cycle_periods_filtered(i) > 0.5*(accepted_means(j - 1)) % Identify high and low outliers

accepted_means(j) = mavCurrent;

k(j) = cycle_periods_filtered(i);

m(n) = cycle_periods_filtered(i);

cycle_index3(n) = i;

tau(n) = m(n)/3;

if m(n - 1) == 0

m(n - 1) = (k(j) + k(j - 1))/2;

tau(n - 1) = m(n)/3;

end

j = j + 1;

n = n + 1;

else

m(n) = 0;

n = n + 1;

end

i = i + 1;

end

% Scrap the tail

accepted_means(j - 1:end)=[];

k(j - 1:end) = [];

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

Start Hunting!