定期样条以适应定期数据


10

在对这个问题的评论中,用户@whuber引用了使用样条曲线的定期版本来拟合定期数据的可能性。我想了解更多有关此方法的信息,特别是定义样条曲线的方程式,以及如何在实践中实现它们(我主要是R用户,但如有需要,可以使用MATLAB或Python)。同样,但这是“很高兴”的事情,很高兴知道与三角多项式拟合有关的可能的优点/缺点,这就是我通常如何处理此类数据(除非响应不是很平稳,在这种情况下,我会切换到具有周期性内核的高斯过程。


2
检查我另一个问题的答案。stats.stackexchange.com/questions/225729/...
杜海涛

@ hxd1011谢谢,谢谢。最后,我决定将数据重复两次,这样就得到了三个连续的相同数据集,并将样条曲线拟合到中心三分之一。您所指的答案也表示这是替代解决方案。
DeltaIV '17

1
@DeltaIV如果您可以将评论转换为答案,并提供更多详细信息,我认为这是一个很好的答案,并且有一定的解决方案是一个很好的问题。
AdamO '17

@AdamO感谢您的建议,但是在一年中的这个时候,我有点茫然:-)我会尽力的。我首先应该检索该代码...
DeltaIV '17

Answers:


5

样条线用于回归建模中,以对可能复杂的非线性功能形式进行建模。样条曲线平滑趋势由分段连续多项式组成,其连续系数在每个断点或结点处均发生变化。样条可以根据趋势的多项式以及断点来指定。协变量的样条表示将单个观测值向量扩展到矩阵中,该矩阵的维数是多项式度加结数。

周期性花键的版本仅仅是任何回归的周期性版本:数据被切成段的长度的重复。因此,例如,在多日实验中对大鼠的昼夜趋势进行建模将需要将实验时间重新编码为24小时,因此第154小时将是模24值10(154 = 6 * 24 + 10)。如果在切割数据上拟合线性回归,则它将估计趋势的锯齿波形。如果在周期中的某个位置拟合阶跃函数,则将是适合该序列的方波。样条能够表达更复杂的小波。值得的是,在splines包装中,有一个函数periodicSpline可以完全做到这一点。

我发现R的默认样条“ bs”实现对解释没有帮助。因此,我在下面编写了自己的脚本。对于具有结的度为的样条,此表示为前列提供了标准多项式表示,第 -th列()可以简单地评估为,其中是结的实际向量。Ñ ķ p p + Ñ ķ 小号p + = X - ķ p X < ķ ķpñķpp+一世一世ñķ小号p+一世=X-ķ一世p一世X<ķ一世ķ

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.