Использование сглаживания Калмана в пакете R KFAS для расчета отсутствующих данных - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть фрейм данных (воспроизводимый пример внизу), содержащий столбец значений, представляющих объем осадков, столбец значений даты измерения и столбец для координат широты, долготы и высоты.Данные охватывают 10 лет измерений и 10 различных точек широты / долготы / высоты (уровни, которые я назову «станциями»).

Столбец осадков - это MCAR, в котором отсутствуют 3,4% его значений.Моя цель состоит в том, чтобы приписать недостающие значения, принимая во внимание как временную корреляцию (положение NA в пределах временного ряда его станции), так и пространственную корреляцию (географическая связь NA с остальными точками.)

Iне думайте, что типичные методы, основанные на ARIMA, такие как найденные в Amelia или ImputeTS, удовлетворят, потому что они ограничены одномерными данными.

Я заинтересован в использовании пакета KFAS, потому что считаю, что он позволит мне обрабатывать эти разные "станции" как "состояния" в "пространстве состояний" и позволит мне использовать сглаживание Калмана для "прогнозирования"пропущенные значения основаны на корреляции как пространственных, так и временных переменных.

Моя проблема в том, что мне ОЧЕНЬ тяжело преодолеть кривую обучения KFAS и реализовать эту модель.Документация немногочисленна и практически не содержит учебников или материалов для начинающих.Я чувствую, что даже не знаю, с чего начать.

Можно ли использовать KFAS таким образом?Как бы вы подошли к этому вызову?Как будут выглядеть основные шаги в KFAS?

Поскольку я едва знаю, как сформулировать этот вопрос, я постарался создать хорошие воспроизводимые данные.Эти примерные данные охватывают три «станции» за 1 месяц, что, я думаю, должно быть достаточно для демонстрации.Значения реалистичные, но не точные.

#defining the precip variable
set.seed(76)
precip <- sample(0:7, 30, replace=TRUE)

#defining the categorical variables 
lon1 <- (-123.7500)
lon2 <- (-124.1197)
lon3 <- (-124.0961)
lat1 <- (43.9956)
lat2 <- (44.0069)
lat3 <- (44.0272)
elev1 <- 76.2
elev2 <- 115.8
elev3 <- 3.7
date1 <- seq(as.Date('2011-01-01'), as.Date('2011-01-10'),by=1)
date2 <- seq(as.Date('2011-01-11'), as.Date('2011-01-20'),by=1)
date3 <- seq(as.Date('2011-01-21'), as.Date('2011-01-30'),by=1) 

#creating the df
reprex.data <- NULL
reprex.data$precip <- precip

#inserting NA's randomly into the precip vector now to easily avoid doing it to the other variables 
reprex.data <- as.data.frame(lapply(reprex.data, function(cc) cc[sample(c(TRUE, NA), prob = c(0.85, 0.15), size = length(cc), replace = TRUE)]))

#creating the rest of the df 
reprex.data$lon[1:10] <- lon1
reprex.data$lon[11:20] <- lon2
reprex.data$lon[21:30] <- lon3
reprex.data$lat[1:10] <- lat1
reprex.data$lat[11:20] <- lat2
reprex.data$lat[21:30] <- lat3
reprex.data$elev[1:10] <- elev1
reprex.data$elev[11:20] <- elev2
reprex.data$elev[21:30] <- elev3
reprex.data$date[1:10] <- date1
reprex.data$date[11:20] <- date2
reprex.data$date[21:30] <- date3

#viola
head(reprex.data)
...