Лр1 / лр1
.docxМИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра БТС
ОТЧЕТ
по лабораторной работе№1
по дисциплине «Моделирование биологических процессов и систем» Тема: Временные ряды. Расчет скользящих статистик.
Студент
Преподаватель Тероева Ю. А.
Санкт-Петербург
2022
Цель: изучение влияния размера окна фильтра скользящего среднего на результаты фильтрации (на примере 10-ти секундного тренда ЧСС).
Основные теоретические положения: Временной ряд (Time Series) – это последовательность значений, описывающих протекающий во времени процесс и измеренных в последовательные моменты времени (чаще - через равные промежутки). Единица ряда называется измерением или отсчётом (иногда - уровнем). Во временном ряде для каждого отсчёта должно быть указано время измерения или номер измерения по порядку (индекс отсчета). Временной ряд отличается от простой выборки данных, так как при анализе учитывается взаимосвязь измерений со временем, а не только статистическое разнообразие и статистические характеристики выборки. Временные ряды можно разделить на два класса: с постоянным временным промежутком между отсчетами (регулярный ряд) и с разными временными промежутками между отсчетами (нерегулярный ряд). Одним из часто анализируемых временных рядов является тренд ЧСС. Методика расчета ЧСС не стандартизирована.
Один из формул расчета следующая: де RR – длительность (в мс.) интервала между референтными точками текущего и предыдущего комплекса (могут быть выбраны как точки R, так и, например, Q); N – количество комплексов, попавших в 10-ти секундный интервал; 1000*60 – коэффициент для перевода значений в размерность у уд/мин. В этой лабораторной работе на примере анализа 10- тисекундного тренда ЧСС рассмотрим такой метод анализа временных рядов как скользящее среднее (moving average). Он может быть полезен при анализе данных, собранных в результате длительного мониторинга (например, за неделю) или же для визуальной демонстрации наблюдаемых в данных зависимостей. Скользящее среднее сглаживает колебания, наблюдаемые в данных, и позволяет получить представление о тенденции или закономерности в данных. Полученный паттерн затем может быть использован в том числя для оценки будущих значений ряда (предсказание). Скользящее среднее может определено несколькими способами, в частности:
Простое скользящее среднее (SMA - Simple Moving Average)
Значение для SMA в любой момент времени может быть получено простым вычислением среднего значения за определенное количество периодов до этого момента времени (в окне). Например, 5-тиминутное простое скользящее среднее ЧСС означает среднее
значение ЧСС за последние 5 минут.
Взвешенное скользящее среднее (WMA - Weighted Moving Average)
Формула для WMA использует разные веса для точек данных. Как правило, вес уменьшается с каждой точкой. Это позволит уменьшить
факт «отставания от реальности».
Экспоненциальное скользящее среднее (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 сек
Вывод: в ходе выполнения данной лабораторной работы был выполнен анализ суточного тренда ЧСС и его фильтрация методом скользящего среднего – данная фильтрация позволяет сглаживать сигнал, позволяя получить представление о различных тенденциях. Фильтрация простым скользящим имеет недостаток – запаздывание. Данный недостаток можно исправить при помощи методики взвешенного скользящего среднего, подобрав весовые коэффициенты. Также можно заметить усиление сглаживания при увеличении размера окна.