Splines périodiques pour ajuster les données périodiques

10

Dans un commentaire à cette question , l'utilisateur @whuber a cité la possibilité d'utiliser une version périodique des splines pour ajuster les données périodiques. J'aimerais en savoir plus sur cette méthode, en particulier les équations définissant les splines, et comment les implémenter en pratique (je suis surtout un Rutilisateur, mais je peux me débrouiller avec MATLAB ou Python, si besoin est). En outre, mais c'est "agréable à avoir", il serait intéressant de connaître les avantages / inconvénients possibles en ce qui concerne l'ajustement des polynômes trigonométriques, c'est ainsi que je traite habituellement ce type de données (sauf si la réponse n'est pas très fluide, auquel cas je passe au processus gaussien avec noyau périodique).

DeltaIV
la source
2
vérifiez la réponse de mes autres questions. stats.stackexchange.com/questions/225729/…
Haitao Du
@ hxd1011 merci, j'apprécie le conseil. À la fin, j'ai décidé de simplement dupliquer les données deux fois, ayant ainsi trois ensembles consécutifs de données identiques, et d'adapter la spline au tiers central. La réponse à laquelle vous vous référez indique également cela comme une solution alternative.
DeltaIV
1
@DeltaIV si vous pouvez convertir votre commentaire en réponse et fournir plus de détails, je pense que c'est une bonne réponse et une bonne question pour avoir une certaine résolution.
AdamO
@AdamO merci pour la suggestion, mais pendant cette période de l'année, je suis un peu submergé :-) J'essaierai cependant. Je devrais tout d'abord récupérer ce code ...
DeltaIV

Réponses:

5

Les splines sont utilisées dans la modélisation par régression pour modéliser des formes fonctionnelles potentiellement non linéaires complexes. Une tendance lissée spline se compose de polynômes continus par morceaux dont le coefficient principal change à chaque point d'arrêt ou nœud. La spline peut être spécifiée en termes de degré polynomial de la tendance ainsi que de points de rupture. Une représentation spline d'une covariable étend un vecteur unique de valeurs observées dans une matrice dont la dimension est le degré polynomial plus le nombre de nœuds.

Une version périodique des splines n'est qu'une version périodique de toute régression: les données sont découpées en répliques de la longueur de la période. Ainsi, par exemple, la modélisation d'une tendance diurne dans une expérience de plusieurs jours sur des rats nécessiterait un temps de recodage de l'expérience en incréments de 24 heures, de sorte que la 154e heure serait la valeur modulo 24 de 10 (154 = 6 * 24 + 10). Si vous ajustez une régression linéaire sur les données de coupe, il estimerait une forme d'onde en dents de scie pour la tendance. Si vous ajustez une fonction de pas quelque part dans la période, ce serait une forme d'onde carrée qui correspond à la série. La spline est capable d'exprimer une ondelette beaucoup plus sophistiquée. Pour ce que ça vaut, dans le splinespackage, il y a une fonction periodicSplinequi fait exactement cela.

pnkpp+jejenkSp+je=(X-kje)pje(X<kje)k

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)

Vous verrez qu'ils sont assez concordants. De plus, la convention de dénomination permet l'interprétation. Dans la sortie de régression, vous voyez:

> 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

Je vais supposer que vous connaissez la périodicité des données disponibles. Si les données n'ont pas de croissance ou de composante moyenne mobile, vous pouvez transformer une longue série chronologique en répliques d'une courte série d'une durée d'une période. Vous disposez désormais de répliques et pouvez utiliser l'analyse des données pour estimer la tendance récurrente.

Supposons que je génère les séries chronologiques un peu bruyantes et très longues suivantes:

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)

La sortie résultante affiche des performances raisonnables.

> 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
la source