Периодические сплайны для периодических данных

10

В комментарии к этому вопросу пользователь @whuber процитировал возможность использования периодической версии сплайнов для подгонки периодических данных. Я хотел бы узнать больше об этом методе, в частности об уравнениях, определяющих сплайны, и о том, как реализовать их на практике (я в основном Rпользователь, но я могу обойтись с MATLAB или Python, если возникнет такая необходимость). Кроме того, но это «приятно иметь», было бы здорово узнать о возможных преимуществах / недостатках в отношении подбора тригонометрических полиномов, как я обычно поступаю с данными такого типа (если ответ не очень гладкий, в этом случае я переключаюсь на гауссовский процесс с периодическим ядром).

DeltaIV
источник
2
проверьте ответ на мои другие вопросы. stats.stackexchange.com/questions/225729/…
Du
@ hxd1011 спасибо, я ценю совет. В конце я решил просто дублировать данные дважды, таким образом имея три последовательных набора идентичных данных, и подогнать сплайн к центральной трети. Ответ, на который вы ссылаетесь, также указывает на это как на альтернативное решение.
DeltaIV
1
@ DeltaIV, если вы можете преобразовать свой комментарий в ответ и предоставить более подробную информацию, я думаю, что это хороший ответ и хороший вопрос, требующий некоторого разрешения.
AdamO
@AdamO спасибо за предложение, но в это время года я немного заболел :-) Я все же попробую. Я должен прежде всего получить этот код ...
DeltaIV

Ответы:

5

Сплайны используются в регрессионном моделировании для моделирования, возможно, сложных нелинейных функциональных форм. Сглаженный сплайн тренд состоит из кусочно-непрерывных многочленов, главный коэффициент которых изменяется в каждой точке разрыва или узле. Сплайн может быть задан с точки зрения степени полинома тренда, а также точек останова. Сплайн-представление ковариаты расширяет один вектор наблюдаемых значений в матрицу, размерность которой равна степени полинома плюс число узлов.

Периодическая версия сплайнов лишь периодическая версия любой регрессии: данные нарежут повторы длины периода. Так, например, моделирование суточного тренда в многодневном эксперименте на крысах потребует перекодирования времени эксперимента с 24-часовыми приращениями, поэтому 154-й час будет по модулю 24 равным 10 (154 = 6 * 24 + 10). Если вы подгоните линейную регрессию к данным обрезки, она оценила бы пилообразную форму волны для тренда. Если вы поместите пошаговую функцию где-то в периоде, это будет прямоугольная форма волны, которая соответствует серии. Сплайн способен выразить гораздо более сложный вейвлет. Для чего это стоит, в splinesпакете есть функция, periodicSplineкоторая делает именно это.

Я не считаю реализацию сплайна "bs" по умолчанию в R полезной для интерпретации. Поэтому я написал свой собственный сценарий ниже. Для сплайна степени с узлами это представление дает первым столбцам стандартное полиномиальное представление,pnkpp+iinkSп+язнак равно(Икс-Кя)пя(Икс<Кя)К

myspline <- function(x, degree, knots) {
  knots <- sort(knots)
  val <- cbind(x, outer(x, knots, `-`))
  val[val < 0] <- 0
  val <- val^degree
  if(degree > 1)
    val <- cbind(outer(x, 1:{degree-1}, `^`), val)
  colnames(val) <- c(
    paste0('spline', 1:{degree-1}, '.1'),
    paste0('spline', degree, '.', seq(length(knots)+1))
  )
  val
}

2πτ

x <- seq(0, 2*pi, by=pi/2^8)
y <- sin(x)
plot(x,y, type='l')
s <- myspline(x, 2, pi)
fit <- lm(y ~ s)
yhat <- predict(fit)
lines(x,yhat)

Вы увидите, что они вполне согласны. Кроме того, соглашение об именах допускает интерпретацию. В выводе регрессии вы видите:

> summary(fit)

Call:
lm(formula = y ~ s)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.04564 -0.02050  0.00000  0.02050  0.04564 

Coefficients:
             Estimate Std. Error  t value Pr(>|t|)    
(Intercept) -0.033116   0.003978   -8.326 7.78e-16 ***
sspline1.1   1.268812   0.004456  284.721  < 2e-16 ***
sspline2.1  -0.400520   0.001031 -388.463  < 2e-16 ***
sspline2.2   0.801040   0.001931  414.878  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02422 on 509 degrees of freedom
Multiple R-squared:  0.9988,    Adjusted R-squared:  0.9988 
F-statistic: 1.453e+05 on 3 and 509 DF,  p-value: < 2.2e-16

π/2

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

Предположим, я сгенерировал следующие несколько шумные, очень длинные временные ряды:

x <- seq(1, 100, by=0.01)
y <- sin(x) + rnorm(length(x), 0, 10)
xp <- x %% (2*pi)
s <- myspline(xp, degree=2, knots=pi)
lm(y ~ s)

Полученный результат показывает разумную производительность.

> summary(fit)

Call:
lm(formula = y ~ s)

Residuals:
    Min      1Q  Median      3Q     Max 
-39.585  -6.736   0.013   6.750  37.389 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.48266    0.38155  -1.265 0.205894    
sspline1.1   1.52798    0.42237   3.618 0.000299 ***
sspline2.1  -0.44380    0.09725  -4.564 5.09e-06 ***
sspline2.2   0.76553    0.18198   4.207 2.61e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.949 on 9897 degrees of freedom
Multiple R-squared:  0.006406,  Adjusted R-squared:  0.006105 
F-statistic: 21.27 on 3 and 9897 DF,  p-value: 9.959e-14
Adamo
источник