Интерполяция временных рядов пропущенных значений в столбце в r

Я в настоящее время смотрел на imputeTS и пакеты зоопарка, но он не видит, чтобы работать Текущие данные..

group/timeseries(character)
  1   2017-05-17 04:00:00
  1   2017-05-17 04:01:00
  1           NA
  1           NA
  1   2017-05-17 05:00:00
  1   2017-05-17 06:00:00
  2           NA
  2   2017-05-17 04:31:00
  2           NA
  2           NA
  2           NA
  2   2017-05-17 05:31:00

Я хотел бы заполнить NA временными рядами интерполяции, чтобы время было средней точкой строки до и после. Также я должен отметить, что каждый временной ряд принадлежит группе. Значение времени сбрасывается для каждой группы.

Я предоставлю картину фактических данных, чтобы быть более четким

Спасибо за помощь в продвижении!

2 ответа

imputeTS и zoo не принимают символы или временные метки в качестве входных данных для своих функций интерполяции. (обычно интерполяция символов не имеет смысла)

Но вы можете дать символы в качестве входных данных для функции na.locf в zoo. (последнее наблюдение переносится с этой функцией)

Лучшее решение для вашей задачи должно быть следующим (я предполагаю, что у вас есть дата, указанная как POSIX.ct)

# Perform the imputation on numeric input
temp <- imputeTS::na.interpolation( as.numeric ( input ) )

# Transform the numeric values back to dates
as.POSIXct(temp, origin = "1960-01-01", tz = "UTC")

С "input" в первой строке будет ваш вектор с временными метками POSIX.ct. Настройки origin и tz (часовой пояс) во второй строке должны быть установлены в соответствии с вашими временными метками.

na.approx в пакете zoo это можно сделать, и группировка может быть выполнена без циклов, используя либо tapply в базе или как групповая операция в data.table.

Для вашего набора данных

df <- read.table(text=c("
  group   timeseries
  1   '2017-05-17 04:00:00'
  1   '2017-05-17 04:01:00'
  1   NA
  1   NA
  1   '2017-05-17 05:00:00'
  1   '2017-05-17 06:00:00'
  2   NA
  2   '2017-05-17 04:31:00'
  2   NA
  2   NA
  2   NA
  2   '2017-05-17 05:31:00'
"), 
colClasses = c("integer", "POSIXct"),
header = TRUE)

Написать функцию, чтобы привести вектор к объекту зоопарка, интерполировать NA, извлечь результат

library(zoo)
foo <- function(x) coredata(na.approx(zoo(x), na.rm = FALSE))

Пример использования tapply в базе R для применения foo к каждой группе

df2 <- df #make a copy
df2$timeseries <- do.call(c, tapply(df2$timeseries, INDEX = df2$group, foo))

Пример использования group by в data.table для применения foo к каждой группе

library(data.table)
DT <- data.table(df)
DT[, timeseries := foo(timeseries), by = "group"]
Другие вопросы по тегам