Періодичні сплайни, щоб відповідати періодичним даним


10

У коментарі до цього питання користувач @whuber цитував можливість використання періодичної версії сплайнів для підгонки періодичних даних. Я хотів би дізнатися більше про цей метод, зокрема рівняння, що визначають сплайни, і як їх реалізувати на практиці (я здебільшого Rкористувач, але я можу зробити з MATLAB або Python, якщо виникне потреба). Крім того, але це "приємно мати", було б чудово знати про можливі переваги / недоліки щодо пристосування тригонометричних поліномів, саме так я зазвичай маю справу з подібними даними (якщо тільки відповідь не дуже чітка, в такому випадку я переходжу на Гауссовий процес з періодичним ядром).


2
перевірити відповідь на інші мої запитання. stats.stackexchange.com/questions/225729/…
Хайтао Ду

@ hxd1011 дякую, я ціную пораду. Врешті-решт я вирішив просто дублювати дані двічі, маючи, таким чином, три послідовні набори однакових даних, і встановив сплайн на центральну третину. Відповідь, на яку ви звертаєтесь, також вказує це як альтернативне рішення.
DeltaIV

1
@DeltaIV, якщо ви можете перетворити свій коментар у відповідь і надати трохи детальніше, я вважаю, що це хороша відповідь і гарне запитання, щоб мати певну роздільну здатність.
АдамО

@AdamO дякую за пропозицію, але в цей час року я трохи заграв :-) Я спробую, хоча. Перш за все, я повинен отримати цей код ...
DeltaIV

Відповіді:


5

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

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

pнкpp+iiнкSp+i=(Х-кi)pЯ(Х<кi)к

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.