Как моделировать апостериорные отфильтрованные оценки фильтра Калмана с использованием пакета DSE в R

Как вызвать апостериорные (уточненные) оценки состояния из моделирования фильтра Калмана в R с использованием пакета DSE?

Я добавил пример ниже. Предположим, что я создал простое пространство состояний случайного блуждания с ошибкой, являющейся стандартным нормальным распределением. Модель создается с использованием функции SS с нулевыми оценками инициализированного состояния и ковариации. Форма теоретической модели такова: X(t) = X(t-1) + e(t)~N(0,1) для эволюции состояния Y(t) = X(t) + w(t)~N( 0,1)

Теперь мы реализуем это в R, следуя инструкциям на страницах 6 и 7 статьи «Фильтрация Калмана в R» в Journal of Statistical Software. Сначала мы создаем модель пространства состояний с помощью функции SS() и сохраняем ее в переменной kalman.filter:

kalman.filter=dse::SS(F = matrix(1,1,1), 
                  Q = matrix(1,1,1),
                  H = matrix(1,1,1),
                  R = matrix(1,1,1),
                  z0 = matrix(0,1,1),
                  P0 = matrix(0,1,1)
                  )

Затем мы моделируем 100 наблюдений из формы модели с помощью симулятора() и помещаем их в переменную с именем Simulation.kalman.filter:

simulate.kalman.filter=simulate(kalman.filter, start = 1, freq = 1, sampleT = 100)

Затем мы запускаем фильтр Калмана для измерений с помощью l() и сохраняем его в переменной с именем test:

test=l(kalman.filter, simulate.kalman.filter)

Какие из выходных данных являются моими отфильтрованными оценками?


person user5211911    schedule 18.09.2017    source источник


Ответы (1)


Я нашел ответ на этот вопрос.

Во-первых, отфильтрованные оценки модели не задаются в функции l(). Эта функция дает прогнозы только на один шаг вперед. Приведенное выше оформление моей проблемы было закодировано как:

kalman.filter=dse::SS(F = matrix(1,1,1), 
              Q = matrix(1,1,1),
              H = matrix(1,1,1),
              R = matrix(1,1,1),
              z0 = matrix(0,1,1),
              P0 = matrix(0,1,1)
              )
simulate.kalman.filter=simulate(kalman.filter, start = 1, freq = 1, sampleT = 100)
test=l(kalman.filter, simulate.kalman.filter)

Прогнозы на один шаг вперед дают:

predictions = test$estimates$pred

Быстрый способ визуализировать это дает:

tfplot(test)

Это позволяет вам быстро построить свои прогнозы на один шаг вперед в сравнении с фактическими данными. Чтобы получить отфильтрованные оценки, вам нужно использовать функцию smoother() в том же пакете dse. Он вводит модель состояния, а также данные, в данном случае это kalman.filter и simulator.kalman.filter соответственно. На выходе получаются сглаженные оценки для всех моментов времени. Но обратите внимание, что он делает это после рассмотрения всего набора данных, поэтому он не делает этого по мере поступления каждого наблюдения. См. код ниже. Первая строка кода дает вам сглаженные оценки, следующие строки отображают пример:

smooth = smoother(test, simulate.kalman.filter)
plot(test$estimates$pred, ylim=c(max(test$estimates$pred,smooth$filter$track,simulate.kalman.filter$outpu), min(test$estimates$pred,smooth$filter$track,simulate.kalman.filter$output)))
points(smooth$smooth$state, col = 3)
points(simulate.kalman.filter$output, col = 4)

Приведенный выше график отображает все ваши фактические данные, оценки модели и сглаженные оценки друг против друга.

person user5211911    schedule 12.10.2017