Интерполяционные таймеры

У меня проблема временного ряда, на которую я надеюсь, что кто-то может помочь!

Проблема вращается вокруг двух наборов данных с разными отметками времени. Один набор данных содержит данные калибровки, а другой содержит выборочные данные. Калибровка гораздо реже, чем образцы.

То, что я хотел бы сделать, - это интерполировать данные калибровки (low freq) на выборку временных рядов (высокая частота).

sam <- textConnection("time, value
01:00:52, 256
01:03:02, 254
01:05:23, 255
01:07:42, 257
01:10:12, 256")

cal <- textConnection("time, value
01:01:02, 252.3
01:05:15, 249.8
01:10:02, 255.6")

sample <- read.csv(sam)

sample$time <- as.POSIXct(sample$time, format="%H:%M:%S")

calib <- read.csv(cal)

calib$time <- as.POSIXct(calib$time, format="%H:%M:%S")

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

У кого-нибудь из вас были подобные вещи? Есть ли функция chron или zoo, которая будет делать то, что я хочу (интерполировать данные с низким частотом на более высокие частоты, где оба t являются случайными)?

Ответ 1

Я бы использовал зоопарк (или xts) и делал это так:

library(zoo)
# Create zoo objects
zc <- zoo(calib$value, calib$time)    # low freq
zs <- zoo(sample$value, sample$time)  # high freq
# Merge series into one object
z <- merge(zs,zc)
# Interpolate calibration data (na.spline could also be used)
z$zc <- na.approx(z$zc, rule=2)
# Only keep index values from sample data
Z <- z[index(zs),]
Z
#                      zs       zc
# 2012-10-25 01:00:52 256 252.3000
# 2012-10-25 01:03:02 254 251.1142
# 2012-10-25 01:05:23 255 249.9617
# 2012-10-25 01:07:42 257 252.7707
# 2012-10-25 01:10:12 256 255.6000

Ответ 2

Вы также можете использовать функцию approx, как это, и это будет намного проще. Просто убедитесь, что вы работаете с кадрами данных. Кроме того, убедитесь, что формат столбца в калибровке и выборке данных одинаковый, используя as.POSIXct.

 calib <- data.frame(calib)
 sample <- data.frame(sample)

 IPcal <- approx(calib$time,calib$value, xout = sample$time, 
                 rule = 2, method = "linear", ties = mean)

 IPcal <- data.frame(IPcal)

 head(IPcal)

#                x        y
#1 2017-03-22 01:00:52 252.3000
#2 2017-03-22 01:03:02 251.1142
#3 2017-03-22 01:05:23 249.9617
#4 2017-03-22 01:07:42 252.7707
#5 2017-03-22 01:10:12 255.6000

Подробнее о approx в примерная документация.