Скачиваний:
35
Добавлен:
19.12.2022
Размер:
208.16 Кб
Скачать

МИНОБРНАУКИ РОССИИ

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ

ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)

Кафедра БТС

ОТЧЕТ

по лабораторной работе№1

по дисциплине «Моделирование биологических процессов и систем» Тема: Временные ряды. Расчет скользящих статистик.

Студент

Преподаватель Тероева Ю. А.

Санкт-Петербург

2022

Цель: изучение влияния размера окна фильтра скользящего среднего на результаты фильтрации (на примере 10-ти секундного тренда ЧСС).

Основные теоретические положения: Временной ряд (Time Series) – это последовательность значений, описывающих протекающий во времени процесс и измеренных в последовательные моменты времени (чаще - через равные промежутки). Единица ряда называется измерением или отсчётом (иногда - уровнем). Во временном ряде для каждого отсчёта должно быть указано время измерения или номер измерения по порядку (индекс отсчета). Временной ряд отличается от простой выборки данных, так как при анализе учитывается взаимосвязь измерений со временем, а не только статистическое разнообразие и статистические характеристики выборки. Временные ряды можно разделить на два класса: с постоянным временным промежутком между отсчетами (регулярный ряд) и с разными временными промежутками между отсчетами (нерегулярный ряд). Одним из часто анализируемых временных рядов является тренд ЧСС. Методика расчета ЧСС не стандартизирована.

Один из формул расчета следующая: де RR – длительность (в мс.) интервала между референтными точками текущего и предыдущего комплекса (могут быть выбраны как точки R, так и, например, Q); N – количество комплексов, попавших в 10-ти секундный интервал; 1000*60 – коэффициент для перевода значений в размерность у уд/мин. В этой лабораторной работе на примере анализа 10- тисекундного тренда ЧСС рассмотрим такой метод анализа временных рядов как скользящее среднее (moving average). Он может быть полезен при анализе данных, собранных в результате длительного мониторинга (например, за неделю) или же для визуальной демонстрации наблюдаемых в данных зависимостей. Скользящее среднее сглаживает колебания, наблюдаемые в данных, и позволяет получить представление о тенденции или закономерности в данных. Полученный паттерн затем может быть использован в том числя для оценки будущих значений ряда (предсказание). Скользящее среднее может определено несколькими способами, в частности:

  1. Простое скользящее среднее (SMA - Simple Moving Average)

Значение для SMA в любой момент времени может быть получено простым вычислением среднего значения за определенное количество периодов до этого момента времени (в окне). Например, 5-тиминутное простое скользящее среднее ЧСС означает среднее

значение ЧСС за последние 5 минут.

  1. Взвешенное скользящее среднее (WMA - Weighted Moving Average)

Формула для WMA использует разные веса для точек данных. Как правило, вес уменьшается с каждой точкой. Это позволит уменьшить

факт «отставания от реальности».

  1. Экспоненциальное скользящее среднее (EMA - Exponential Moving

Average) .

Ход работы.

Ниже представлен код программы

include("Func.jl")

using CSV, DataFrames

CHSSfull = CSV.read("hr10.csv", DataFrame)

var = 3 #номер своего варианта

lengthCHSSfull = rownumber(last(CHSSfull))

fs = 0.1

T = convert(Int,1/fs)

tmax = T*lengthCHSSfull

tstart = 3600*0.1*var

otstart = convert(Int,tstart*fs)

data = CHSSfull.Column1[otstart:end]

out = fill(0.0, size(data))

wind_30s = convert(Int,30*fs)

wind_60s = convert(Int,60*fs)

wind_120s = convert(Int,120*fs)

ma30s = SlideMeanFilter{eltype(data)}(wind_30s)

ma60s = SlideMeanFilter{eltype(data)}(wind_60s)

ma120s = SlideMeanFilter{eltype(data)}(wind_120s)

out2_30 = fill(0.0, size(data))

out2_60 = fill(0.0, size(data))

out2_120 = fill(0.0, size(data))

out2_30 = exe2(ma30s, data, out2_30)

out2_60 = exe2(ma60s, data, out2_60)

out2_120 = exe2(ma120s, data, out2_120)

out3_30 = fill(0.0, size(data))

out3_60 = fill(0.0, size(data))

out3_120 = fill(0.0, size(data))

out3_30 = lwma(ma30s, data, out3_30)

out3_60 = lwma(ma60s, data, out3_60)

out3_120 = lwma(ma120s, data, out3_120)

using Plots

plotlyjs()

plot(data, color = :gray, labels="Исходный сигнал")

plot!(out3_30, color = :green,labels="30 сек")

plot!(out3_60, color = :blue,labels="60 сек")

plot!(out3_120, color = :red,labels="120 сек")

# фильтр скользящего среднего

mutable struct SlideMeanFilter{T}

    buf::Vector{T} # кольцевой буфер

    k::Int # состояние фильтра

    need_restart::Bool # маркер инциализации фильтра

    function SlideMeanFilter{T}(window::Int) where T

        new(fill(T(0), window-1), 1, true) # буфер заполнится нулями

    end

end

# функция вызова фильтра (от execute)

# принимает аргумент типа SlideMeanFilter и одну точку сигнала

function exe(obj::SlideMeanFilter{T}, x::T) where T

    buf, k = obj.buf, obj.k

 

    if obj.need_restart # инициализация на первой точке

 # заполняем буфер первой точкой

        fill!(buf, x)  

 # отмечаем, что инициализация уже не требуется

        obj.need_restart = false

    end

 

    sum_x = x  

    # сумма всех элементов в буфере + 1 новая точка

    for xi in buf  

        sum_x += xi

    end

    # собственно, сам расчет среднего

    window = length(buf) + 1

    y = sum_x / window

 

    # в буфер записываем новую точку

    buf[k] = x

    k += 1

    # проверка, не кончился ли буфер

    if k > length(buf)

 # возвращаемся в его начало

        k = 1

    end

    # фиксируем состояние фильтра

    obj.k = k

    return y

end

function exe2(obj::SlideMeanFilter{T}, inp::AbstractVector{T}, out::AbstractVector) where T

    for i in 1:length(inp)

        x = data[i]

        y = exe(obj, x)

        out[i] = y

    end

    return out

end

function lwma(obj::SlideMeanFilter{T}, inp::AbstractVector{T}, out::AbstractVector) where T

    buf, k = obj.buf, obj.k

 for i in 1:length(inp)

    if obj.need_restart

        fill!(buf, data[i])  

        obj.need_restart = false

    end

    sum_xw = data[i]*(length(buf)+1)

    w = Vector()

    w1 = Vector()

    w2 = Vector()

    for xi in k:length(buf)

        push!(w1, 1+(xi-k))

    end

    for xi in 1:k-1

        push!(w2, (last(w1)+xi))

    end

    w = append!(w2, w1)

    for j = 1:length(buf)

        sum_xw += w[j]*buf[j]

    end

    window = length(buf) + 1

    out[i] = sum_xw/sum(1:window)

    buf[k] = data[i]

    k += 1

    if k > length(buf)

        k = 1

    end  

    obj.k = k

end

    return out

end

Рис. 1. Тренд ЧСС без фильтрации

Рис. 2. Тренд ЧСС и фильтрация простым скользящим средним

Замечено увеличение сглаживания при увеличении размера окна, также наблюдается отставание отфильтрованного сигнала от реального.

Ы

Рис. 3. Тренды ЧСС, отфильтрованные взвешенным скользящим средним при различных размерах окна

Наблюдается аналогичное явление – при увеличении окна увеличивается сглаживание сигнала. Однако факт запаздывания уже не так заметен .

Рис. 4. Обычное и взвешенное окно 60 сек

Вывод: в ходе выполнения данной лабораторной работы был выполнен анализ суточного тренда ЧСС и его фильтрация методом скользящего среднего – данная фильтрация позволяет сглаживать сигнал, позволяя получить представление о различных тенденциях. Фильтрация простым скользящим имеет недостаток – запаздывание. Данный недостаток можно исправить при помощи методики взвешенного скользящего среднего, подобрав весовые коэффициенты. Также можно заметить усиление сглаживания при увеличении размера окна.

Соседние файлы в папке Лр1
  • #
    19.12.20222.63 Кб7Func.jl
  • #
    19.12.20221.36 Кб8lab1.jl
  • #
    19.12.2022208.16 Кб35лр1.docx