• Регистрация
Sayres
Sayres 0.00
н/д

Удаление пиков данных и проверка с помощью трех сигм

14.06.2020

Здравствуйте!
Возникли трудности с удалением пиков в данных.
Есть два массива . Один массив высот , а второй значений на данных высотах.
Для примера H=[2,9,20,50,78,100,200,280,1000,350,500]
T=[28,27,25,24,23,20,19,60,17,11]
H должно меняться от уровня к уровню без резких скачков и тенденция должна быть однонаправленной, то есть после 280 метров должно быть число больше 280 метров, значение 1000 это явный пик, его нужно заменить на NaN, а далее идет нормальное значение 350. Причем как говорилось ранее только однонаправленное изменение должно быть то есть то 0 до 2000 метров .
Если в H значение меняется на NaN, то соответственно и в Т тоже нужно также заменить на NAN.
Сами файлы прикреплены .
Какие есть предложения ? нужна помощь

Как такой подход?

level=H;
data=T;
L=length(level);
%for i = 1:size(level,1);
dhi=level(1,2)-level(1,1); %dhi дельта h1
dti=data(1,2)-data(1,1); %dti дельта t1
di=dti/dhi;  % изменение температуры на каждый метр
E=mean(data); % среднее значение ряда температуры
СKO=std(data,1); %среднеквадратическое отклонение
if di<E+3 CKO and di>E-3 CKO
T=di;
else di==NaN; %забить константой
И так по всему ряду пройти.

Eщё может попробовать.
Matlab MВыделить код

for i=1:1:length(Data)
     if Data(i)>Data(i+1)
        Data(i+1)=Data(i); %либо заменить на NaN
     end
end

Но именно с помощью сравнения if di<E+3 CKO and di>E-3 CKO

хотелось бы решение.

Потому что это более точно.

Теги

    14.06.2020

    Ответы

    • aBoomest
      aBoomest+942.89
      15.06.2020 06:24

      А что такое +3 -3 ?

      Не видно проблемы сравнение соседних элементов. На основе этого нан или нет. Вы вроде сами так и написали. нет?

      • kurguz
        kurguz+270.00
        15.06.2020 11:13

        Оба ваших примера - это нерабочий код. На каком языке вы пишете?

        Если на MATLAB, найдите плейлист по анализу данных на канале https://www.youtube.com/user/MATLABinRussia/

        • Sayres
          Sayres0.00
          15.06.2020 11:37

          Можно было таким образом:

          H=[2,9,20,50,1000,100,200,280,1000,350, 455]
          T=[28,27,25,24,23,20,19,60,17,11,77]
           
          H(find(diff(H)>101)+1)=nan
          ind = find(isnan(H));
          T(ind)=nan

          Но хочется точнее

          Но как изначально задумано с сигмами будет работать дольше, но результат будет определенный.
          А опасность в проверках данных и подстановка необоснованных значений приведет к неизвестным искажениям.
          Невозможно придумать универсальный критерий для всех случаев, по которому забивать константой отсутствия.
          Сигмы позволяют настраиваться на типичные случаи более гибко и точно.

          Лучше делать с проверкой на сигмы, но тоже надо предварительно настроиться на пробных случаях так, чтобы не забивать хорошие данные и не пропускать брак. В случае обнаруженной ошибки будет не ясно ошибка в значении высоты или в температуре, поэтому забивать надо оба значения.
          Поэтому для примера и сами два массива приложил.

          Посмотрел неверно начал.
          Сначала надо проверить уровни. Их значения должны увеличиваться с глубиной. Если какой-либо уровень выбивается из такой закономерности, то удалять этот уровень и температуру на нем либо (константа).

          dhi=level(1,2)-level(1,1); %dhi дельта h1 Вычесть из следующего значение предыдущее

          dti=data(1,2)-data(1,1); %dti дельта t1

           di=dti/dhi; % изменение температуры на каждый метр

          E=mean(di); % среднее значение ряда di

          di СKO=std(di,1); %среднеквадратическое отклонение di

          %Вычислять надо среднее из di и среднеквадрат.отклонение из di

           if di<E+4*CKO and di>E-4*CKO (четыре СКО) %Далее надо проверять 4 ср.квадратических отклонения

          Проверять каждое значение di от поверхности до H(end), последнего значения. Если проверяемое di укладывается в установленный интервал допустимых отклонений,то верны два значения температуры и два значения уровней, по которым вычислено это значение di. А если di не укладывается в интервал, то ошибочно одно из значений температуры или уровней, по которым было получено это di. В этом месте надо по значениям di сверху и снизу от подозрительного di выявить на каком уровне температура дает ошибочное di и затем забить этот уровень и температуру на нем.

          Такая проверка сработает, если нет двух подряд ошибок. Если встретятся две подряд ошибки, то одна забьется, а другая проскочит.

          Еще, если ошибки изначально были, то значения Е и СКО тоже были не совсем правильные при первой проверке. Поэтому надо после первой проверки всех значений от поверхности до нижней глубины повторить все сначала по уже проверенным значениям.

          Это значит опять вычислить все новые di, Е, СКО по проверенным первый раз значениям и пройти по всем новым di.
          Таких несколько итераций сделать.
          Пока не получается.

          • aBoomest
            aBoomest+942.89
            15.06.2020 12:28

            1.

            Но хочется точнее

            Что вы под этим понимаете в данном случае. Если иходить из 

            Причем как говорилось ранее только однонаправленное изменение должно быть то есть то 0 до 2000 метров . Если в H значение меняется на NaN, то соответственно и в Т тоже нужно также заменить на NAN.

            То какие вопросы? Находите пик (как угоно хотябы даже разностью) меняете элементы в обоих массивах на NAN.

            Это же все что вы пытаетесь сделать илинет?

            2. Данные где имеют место ваши пики - это ошибки измерений, помехи там не знаю, или адекватные данные просто не в том месте?