周期的データに適合する周期的スプライン


10

この質問へのコメントで、ユーザー@whuberは、定期的なデータに適合するために定期的なバージョンのスプラインを使用する可能性を挙げました。この方法、特にスプラインを定義する方程式、および実際にそれらを実装する方法について詳しく知りたいです(私はほとんどがRユーザーですが、必要に応じて、MATLABまたはPythonを使用して実行できます)。また、これは「便利」ですが、三角多項式フィッティングに関して考えられる長所/短所について知ることは素晴らしいことです。これは、通常、この種のデータを処理する方法です(応答が非常に滑らかでない場合を除きます)。その場合、定期的なカーネルでガウスプロセスに切り替えます)。


2
私の別の質問の答えを確認してください。stats.stackexchange.com/questions/225729/...
ハイタオ・ドゥ

@ hxd1011ありがとう、私は先端に感謝します。結局、私はデータを2回複製することを決定したので、同一のデータの3つの連続したセットがあり、スプラインを中央の3分の1に合わせました。あなたが参照する答えは、これを代替ソリューションとして示しています。
DeltaIV 2017

1
@DeltaIVコメントを回答に変換し、さらに詳細を提供できる場合、いくつかの解決策を用意することは良い回答であり、良い質問だと思います。
AdamO

@AdamOの提案に感謝しますが、今年のこの時期、私は少し困惑します:-)でも、私は試みます。まず最初にそのコードを取得する必要があります...
DeltaIV

回答:


5

スプラインは、おそらく複雑で非線形の関数形式をモデル化するための回帰モデリングで使用されます。スプライン平滑化トレンドは、各ブレークポイントまたはノットでリーディング係数が変化する区分的連続多項式で構成されます。スプラインは、トレンドの多項式次数とブレークポイントで指定できます。共変量のスプライン表現は、観測値の単一のベクトルを、多項式次数とノットの数を加えた次元の行列に拡張します。

周期スプラインのバージョンは、単に任意の回帰の周期的バージョンである:データは期間の長さの複製に切断されます。したがって、たとえば、ラットでの複数日実験の日内傾向をモデル化するには、実験の時間を24時間単位で記録する必要があるため、154時間目は24を法とする10の値(154 = 6 * 24 + 10)になります。カットデータに線形回帰を当てはめると、トレンドのノコギリ波が推定されます。期間のどこかにステップ関数を当てはめると、系列に当てはまる方形波になります。スプラインは、はるかに洗練されたウェーブレットを表現できます。価値があるのは、splinesパッケージ内に、periodicSplineまさにこれを行う関数があります。

Rのデフォルトのスプライン "bs"実装が解釈に役立つとは思いません。だから私は下に自分のスクリプトを書いた。ノットを持つ次数スプラインの場合、この表現は最初の列に標準の多項式表現を与え、番目の列()はここで、はノットの実際のベクトルです。pkpp+kSp+=バツkpバツ<kk

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
}

少しのケーススタディでは、次のように0から(または)のドメインで正弦波の傾向を補間します。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

私のスプライン1.1度の最初の共変量セットは、最初のブレークポイントの背後にある最初のドメインの多項式トレンドです。線形項は、原点での接線の勾配X = 0です。これはほぼ1であり、正弦曲線の導関数(cos(0)= 1)によって示されますが、これらは近似であり、2次トレンドを外挿するエラーは外れやすいことに注意してくださいエラーに。2次項は、負の凹型形状を示します。spline2.2項は、最初の2次勾配との差を示し、0.4の正のリーディング係数になり、上に凸の形状を示します。これで、スプライン出力の解釈が可能になり、それに応じて推論と推定を判断できるようになりました。π/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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.