複数の未知のノットで区分的線形回帰を行う方法は?


14

複数のノットを自動的に検出できる区分的線形回帰を実行するパッケージはありますか?ありがとう。strucchangeパッケージを使用する場合。変化点を検出できませんでした。変化点を検出する方法がわかりません。プロットから、それらを選択するのに役立つ可能性があるいくつかのポイントがあることがわかりました。誰かここに例を挙げていただけますか?


1
これはstats.stackexchange.com/questions/5700/…と同じ質問のようです。大幅な違いがある場合は、質問を編集してその違いを反映させてください。それ以外の場合は、複製として閉じます。
whuber

1
質問を編集しました。
Honglang王

1
これは非線形最適化問題として実行できると思います。係数とノット位置をパラメーターとして、フィットする関数の方程式を書くだけです。
mark999

1
segmentedパッケージはあなたが探しているものだと思います。
AlefSin

1
同じ問題があり、Rのsegmentedパッケージで解決しました:stackoverflow.com/a/18715116/857416
別のベン14

回答:



8

一般に、何かを区分的に線形に適合させたいのは少し奇妙です。ただし、本当にそうしたい場合は、MARSアルゴリズムが最も直接的です。一度に1ノットの関数を構築します。通常は、ノットの数をプルーニングして、過剰に適合するalaデシジョンツリーと戦います。earthまたはを介してRのMARSアルゴリズムにアクセスできますmda。一般に、他の情報基準(AIC、BICなど)からこれまで削除されていなかったGCVに適合します。

ノットは1つずつ成長するため、MARSは実際には「最適な」フィットを提供しません。ノット配置の可能な順列が急速に爆発するため、本当に「最適な」数のノットを合わせるのはかなり難しいでしょう。

一般的に、これが人々がスプラインの平滑化に向かう​​理由です。ほとんどのスムージングスプラインは立方体であるため、人間の目を欺いて不連続性を逃すことができます。ただし、線形平滑化スプラインを実行することは非常に可能です。スムージングスプラインの大きな利点は、最適化する単一のパラメーターです。これにより、順列のゴブを検索することなく、真に「最適な」ソリューションにすばやく到達できます。ただし、変曲点を本当に探したいので、そうするのに十分なデータがある場合は、おそらくMARSのようなものが最善の策でしょう。

Rのペナルティ付き線形平滑化スプラインのサンプルコードを次に示します。

require(mgcv);data(iris);
gam.test <- gam(Sepal.Length ~ s(Petal.Width,k=6,bs='ps',m=0),data=iris)
summary(gam.test);plot(gam.test);

ただし、実際に選択された結び目は、実際の変曲点と必ずしも相関しません。


3

私はこれを数年前にゼロからゼロからプログラミングしました。また、コンピューター上で区分線形回帰を行うためのMatlabファイルがあります。約20個の測定ポイントの場合、約1〜4個のブレークポイントが計算上可能です。5または7のブレークポイントが非常に多くなり始めます。

私が見ている純粋な数学的アプローチは、あなたの質問の下のコメントにリンクされている質問でユーザーmbqによって提案されたすべての可能な組み合わせを試すことです。

当てはめられた線はすべて連続しており、隣接しているため(重複しない)、組み合わせ論はパスカルの三角形に従います。使用されたデータポイント間にラインセグメントが重複している場合、代わりにコンビナトリクスが第2種のスターリング数に従うと思います。

私の考えでは、フィット線のR ^ 2相関値の標準偏差が最も低いフィット線の組み合わせを選択することが最善の解決策です。例で説明しようと思います。ただし、データ内にいくつのブレークポイントを見つけるかを尋ねるのは、「イギリスの海岸はどれくらいですか?」という質問に似ていることに留意してください。これは、フラクタルに関するブノワマンデルブロ(数学者)の論文の1つです。また、ブレークポイントの数と回帰の深さの間にはトレードオフがあります。

次に例を示します。

xの関数として完全なデータがあると仮定します(xyは整数です):yxxy

xyR2line1R2line2sumofR2valuesstandarddeviationofR2111,0000,04001,04000,6788221,0000,01181,01180,6987331,0000,00041,00040,7067441,0000,00311,00310,7048551,0000,01351,01350,6974661,0000,02381,02380,6902771,0000,02771,02770,6874881,0000,02221,02220,6913991,0000,00931,00930,700410101,0001,9781,0000,70711190,97090,02710,99800,66731280,89510,11391,00900,55231370,77340,25581,02920,36591460,61340,43211,04550,12811550,43210,61341,04550,12821640,25580,77331,02910,36591730,11390,89511,00900,55231820,02720,97080,99800,667219101,0001,0000,70712020,00941,0001,00940,70042130,02221,0001,02220,69142240,02781,0001,02780,68742350,02391,0001,02390,69022460,01361,0001,01360,69742570,00321,0001,00320,70482680,00041,0001,00040,70682790,01181,0001,01180,698728100,041,0001,040,6788

これらのy値にはグラフがあります。

理想化されたデータ

これには明らかに2つのブレークポイントがあります。引数のために、R ^ 2相関値を計算します(Excelセル式(ヨーロッパのドットコンマスタイル)):

=INDEX(LINEST(B1:$B$1;A1:$A$1;TRUE;TRUE);3;1)
=INDEX(LINEST(B1:$B$28;A1:$A$28;TRUE;TRUE);3;1)

2つの適合線のすべての可能な非重複の組み合わせ。R ^ 2値のすべての可能なペアにはグラフがあります。

R ^ 2値

問題は、どのR ^ 2値のペアを選択する必要があるか、そしてタイトルで求められているように複数のブレークポイントにどのように一般化するかです。1つの選択肢は、R2乗相関の合計が最も高い組み合わせを選択することです。これをプロットすると、下の青い曲線が得られます。

Rの2乗とRの2乗の標準偏差の合計

1,0455

区分的線形回帰-MATLAB-複数のブレークポイント


1

Toméand Miranda(1984)で説明されている非常に優れたアルゴリズムがあります。

提案された方法論は、最小二乗アプローチを使用して、ブレークポイント間の最小距離および各ブレークポイントでの最小トレンド変化に関する多くの制約に従って、与えられた時系列に適合する直線の最良の連続セットを計算します。

コードとGUIは、FortranとIDLの両方のWebサイトから入手できます:http : //www.dfisica.ubi.pt/~artome/linearstep.html


0

...まず第一に、反復によって、およびAIC AICc BIC Cpのような何らかの有益な基準の下でそれを行う必要があります。ノットの数K = odのデータポイント数N、[ok]の場合、「理想的な」フィットを得ることができるからです。...最初にK = 0を入力します。たとえば、L = K + 1の回帰を推定し、AICcを計算します。次に、別のセグメントでのデータポイントの最小数、たとえばL = 3またはL = 4、ok ... put K = 1と仮定します。最初の結び目としてL番目のデータから開始し、SSまたはMLEを計算し、...次のデータ点を結び目、SSまたはMLEとして、N-Lデータの最後の結び目まで段階的に計算します。最適な配置(SSまたはMLE)を選択してAICcを計算します... ... K = 2を入力します。...以前のすべての回帰(つまり、SSまたはMLE)を使用しますが、単一のセグメントをすべての可能な部分に段階的に分割します... AICcを計算する最適な配置(SSまたはMLE)を選択します... 最後のAICcが前のAICcよりも大きい場合:反復を停止します!これは、AICc基準の下での最適なソリューションです。


AIC、BICは、追加のパラメーターに対してペナルティを課すため使用できませんが、ここでは明らかにそうではありません。
HelloWorld

0

私はかつてJoinpointというプログラムに出会いました。彼らのウェブサイトでは、「いくつかの異なる線が「結合点」で互いに接続されている」結合点モデルに適合すると彼らは言います。さらに、「ユーザーは最小数と最大数のジョインポイントを提供します。プログラムは最小数のジョインポイント(例:0のジョインポイント、直線)から開始し、さらにジョインポイントが統計的に有意であり、モデルに追加する必要があるかどうかをテストします(その最大数まで)。」

NCIはこれを癌発生率のトレンドモデリングに使用します。おそらくあなたのニーズにも適合します。


0

データに区分的に適合させるために:

ここに画像の説明を入力してください

どこ a1a2p1q1p2q2p3q3近似的に計算される未知のパラメーターです。非常に単純な方法があります(反復ではなく、初期推測がなく、数学コンピューター言語で簡単にコーディングできます)。論文の29ページに記載されている理論:https : //fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdfおよび30ページから:

ここに画像の説明を入力してください

たとえば、Mats Granvikが提供する正確なデータを使用すると、結果は次のようになります。

ここに画像の説明を入力してください

散在データがなければ、この例はあまり重要ではありません。散在するデータを含む他の例は、参考文献に示されています。


0

mcp推測する変更点の数がわかっている場合は、パッケージを使用できます。優れたモデリングの柔軟性と、変化点と回帰パラメーターに関する多くの情報を提供しますが、速度が犠牲になります。

mcp Webサイトには多くの応用例が含まれています。たとえば、

library(mcp)

# Define the model
model = list(
  response ~ 1,  # plateau (int_1)
  ~ 0 + time,    # joined slope (time_2) at cp_1
  ~ 1 + time     # disjoined slope (int_3, time_3) at cp_2
)

# Fit it. The `ex_demo` dataset is included in mcp
fit = mcp(model, data = ex_demo)

次に、視覚化することができます:

plot(fit)

ここに画像の説明を入力してください

または要約:

summary(fit)

Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
  1: response ~ 1
  2: response ~ 1 ~ 0 + time
  3: response ~ 1 ~ 1 + time

Population-level parameters:
    name match  sim  mean lower  upper Rhat n.eff
    cp_1    OK 30.0 30.27 23.19 38.760    1   384
    cp_2    OK 70.0 69.78 69.27 70.238    1  5792
   int_1    OK 10.0 10.26  8.82 11.768    1  1480
   int_3    OK  0.0  0.44 -2.49  3.428    1   810
 sigma_1    OK  4.0  4.01  3.43  4.591    1  3852
  time_2    OK  0.5  0.53  0.40  0.662    1   437
  time_3    OK -0.2 -0.22 -0.38 -0.035    1   834

免責事項:私はmcpの開発者です。


質問での「検出」の使用は、変化点の数(さらには存在)が事前にわからないことを示します。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.