Подгонка сигнала к набору точек и выбор из него дискретных интервалов

У меня есть data.frame значений с образцами, взятыми с интервалами, которые не были точными часами. Образцы образуют колебательные волны неизвестной амплитуды и периода. Я хотел бы оценить значение в каждый точный час.

      hours value
60 63.06667 22657
61 64.00000 21535
62 64.93333 20797
63 65.86667 20687
64 66.80000 20129
65 67.73333 19671
66 68.66667 19066
67 69.60000 19534
68 70.53333 19994
69 71.46667 19575
70 72.40000 21466

Есть ли способ в R я могу подогнать кривую к этому набору данных, а затем попробовать ее в заданных точках (63,64,65,66...)? Я знаю о spline(), но не знаю, как заставить его давать мне точные целочисленные значения для «часов».

Изменить: чтобы уточнить, это результирующий фрейм данных, который я хочу иметь (с фиктивными записями для «значения»)

   hours value
63.00000 22800
64.00000 21535
65.00000 20780
66.00000 20500
67.00000 20011
68.00000 ...
69.00000 ...
70.00000 ...
71.00000 ...
72.00000 ...
73.00000 ...

Код для воссоздания данных:

structure(list(hours = c(63.06666647, 63.9999998, 64.93333313, 
65.86666646, 66.79999979, 67.73333312, 68.66666645, 69.59999978, 
70.53333311, 71.46666644, 72.39999977), value = c(22657L, 21535L, 
20797L, 20687L, 20129L, 19671L, 19066L, 19534L, 19994L, 19575L, 
21466L)), .Names = c("hours", "value"), row.names = 60:70, class = "data.frame")

person Ina    schedule 01.05.2012    source источник


Ответы (2)


Работайте с ответом Шона, но используйте инструмент splinefun для создания собственной функции интерполяции. Запустите созданную таким образом функцию на векторе ваших часовых значений, чтобы вычислить интерполированные значения для этих точных значений. Примеры, приведенные на странице ?splinefun, достаточно ясны.

person Carl Witthoft    schedule 01.05.2012
comment
Комментирую себя :-) -- Если вас когда-нибудь заинтересует набор синусоидальных функций (вы же говорили, что ваши данные периодические), взгляните на приложение eureqa от Cornell. (не функция R - это отдельное приложение) - person Carl Witthoft; 02.05.2012
comment
Спасибо. В итоге я получил my.function ‹- splinefun(D$hours, D$value) my.function(63:73) - person Ina; 02.05.2012

Простой подход со сплайновой посадкой может быть следующим:

D <- structure(list(hours = c(63.06666647, 63.9999998, 64.93333313, 
65.86666646, 66.79999979, 67.73333312, 68.66666645, 69.59999978, 
70.53333311, 71.46666644, 72.39999977), value = c(22657L, 21535L, 
20797L, 20687L, 20129L, 19671L, 19066L, 19534L, 19994L, 19575L, 
21466L)), .Names = c("hours", "value"), row.names = 60:70, class = "data.frame")

sm <- smooth.spline(D$hours, D$value, spar = 0.5)

Или любой другой коэффициент сглаживания для spar, который вы предпочитаете

plot(D$hours, D$value)
lines(sm, col = "red")

Вы можете получить доступ к подогнанным значениям y для каждого часа из гладкого сплайна с помощью

sm$y
[1] 22421.54 21682.93 21023.05 20469.70 19998.72 19634.10 19448.09 19506.52 19783.97
[10] 20251.24 20891.14
person srmulcahy    schedule 01.05.2012
comment
К сожалению, это просто дает мне более гладкую линию. Введите sm$x, и вы увидите, что у меня нет значения ровно 65,00... или 66,00... - это мое требование. - person Ina; 01.05.2012