Установка функции сплайна в R для интерполяции ежедневных значений из ежемесячных значений

взять фрейм данных, который выглядит так, и содержит данные на несколько дат в 2005 году и измерений на каждую дату.

df <- data.frame("date" = c('2005-04-04','2005-04-19', '2005-04-26', '2005-05-05', 
'2005-05-12', '2005-05-25', '2005-06-02', '2005-06-16', '2005-07-07', '2005-07-14', 
'2005-07-21', '2005-08-04'), "numbers" = c(90,50,50,48,44,37,34,30,36,31,49,54))

Я хочу создать последовательность значений из 1: 365 на основе этого для каждого дня года, по существу, чтобы создать новый фрейм данных с 01/01/2005 по 31/12/2005, который был заполнен значениями из функции сплайна, соответствующей этим существующим 12 значениям.

когда я пытаюсь сделать это с помощью:

numbers <- df$numbers
x = spline(1:365, numbers)

I get

ошибка в xy.координаты (x, y, setLab = FALSE) : 'X' и 'y' длины различаются'

Я не уверен, что происходит.

1 ответов


легко избавиться от ошибки, но трудно получить вразумительный ответ.

x <- as.POSIXlt(as.character(df$date))$yday + 1  ## day of year (start from 1)
y <- df$number

существует множество интерполяционных сплайнов:" fmm"," periodic"," natural", " monoH.ФК " и "Хайман". Но не все из них применимы здесь.

y1 <- spline(x, y, xout = 1:365, method = "fmm")

y2 <- spline(x, y, xout = 1:365, method = "periodic")
#Warning message:
#In spline(x, y, xout = 1:365, method = "periodic") :
#  spline: first and last y values differ - using y[1] for both

y3 <- spline(x, y, xout = 1:365, method = "natural")

y4 <- spline(x, y, xout = 1:365, method = "monoH.FC")
#Error in spline(x, y, xout = 1:365, method = "monoH.FC") : 
#  invalid interpolation method

y5 <- spline(x, y, xout = 1:365, method = "hyman")
#Error in spline(x, y, xout = 1:365, method = "hyman") : 
#  'y' must be increasing or decreasing

посмотреть ?spline для деталей этих методов и необходимого предположения / требования для них.

Итак, очевидно, только y1 и y3 были получены без проблем. Давайте эскиз их.

par(mfrow = c(1, 2))
plot(y1, type = "l", main = "fmm"); points(x, y, pch = 19)
plot(y3, type = "l", main = "natural"); points(x, y, pch = 19)

spline interpolation / extrapolation

как мы видим, у нас есть большая проблема при экстраполяции данных.