区分的線形関数からデータの変化点を見つける


10

ご挨拶、

観測された空間のサイズとビッグバンからの経過時間を決定するのに役立つ調査を行っています。うまくいけば、あなたは助けることができます!

2つの線形回帰を実行する区分線形関数に準拠するデータがあります。傾きと切片が変化するポイントがあり、このポイントを見つける(プログラムを作成する)必要があります。

考え?


3
クロスポスティングのポリシーについて教えてください。まったく同じ質問がmath.stackexchange.comに頼まれた:math.stackexchange.com/questions/15214/...
mpiktas

この場合、単純な非線形最小二乗を行うことの何が問題になっていますか?私は明白な何かを見逃していますか?
grg s 2010

変化点パラメータに関するゴール関数の導関数はかなり滑らかではないと思います
Andre Holzner '27 / 07/12

勾配は大きく変化するため、非線形最小二乗法は簡潔で正確ではありません。私たちが知っていることは、2つ以上の線形モデルがあることです。したがって、これら2つのモデルを抽出するためにストライキを実行する必要があります。
HelloWorld、2015年

回答:


1

mcpパッケージには、これを行うことができます。あなたのデータが

まず、いくつかのデータをシミュレートしましょう:

df = data.frame(x = 1:100,
                y = c(rnorm(40, 10 + (1:40)*0.5),
                      rnorm(60, 10 + 40*0.5 -8 + (1:60)*0.2)))

次に、40での変化点(およびパラメーター値)を回復できるかどうかを見てみましょうmcp

model = list(
  y ~ 1 + x,  # linear segment
  ~ 1 + x  # another linear segment
)
library(mcp)
fit = mcp(model, df)

それをプロットします。灰色の線はフィットからランダムに描画されたもので、トレンドを捉えていることを示しています。青い曲線は、変化点の推定位置です。

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

個々のパラメーター推定値を見てみましょう。int_は切片でx_あり、x上の勾配でありcp_、変化点です。

summary(fit)

Population-level parameters:
    name  mean lower upper Rhat n.eff
    cp_1 40.48 40.02 41.00    1  2888
   int_1 11.12  9.11 13.17    1   778
   int_2 21.72 20.09 23.49    1   717
 sigma_1  3.23  2.76  3.69    1  5343
     x_1  0.46  0.36  0.54    1   724
     x_2  0.21  0.16  0.26    1   754

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


8

Rパッケージstrucchangeが役立つかもしれません。ビネットを見てください。同様の問題を解決する方法の概要がわかります。


6

ポイントの数が多すぎない場合は、すべての可能性を試すことができます。ポイントがであるここで、です。それよりも、をからループして、つの行をとます。最後に、両方のラインの残差の二乗和の合計が最小になるを選択します。バツ=バツy=1Nj2N2{バツ1バツj}{バツj+1バツN}j


シンプルだが効果的な提案に基づいて回答を掲載しました。
HelloWorld、2015年

5

これは、(オフラインの)変更点検出の問題です。私たちの前の議論は、雑誌の記事やRコードへの参照を提供します。最初にバリーとハーティガンの「製品分割モデル」を見てください。これは、勾配の変化を処理し、効率的な実装を備えているためです。


3

また、セグメント化されたパッケージは、過去に同様の問題を解決してくれました。


残念ながら、パッケージにはブレークポイントの開始値が必要です。
HelloWorld、2015年

また、segmentedセグメント間の切片変更をモデル化することはできません。最初のセグメントの切片のみをモデル化できます。
JonasLindeløv

2

私はすべての可能性を探すというmbqの答えに基づいています。さらに、私はこれを行います:

  • 2つの区分的モデルの有意性をチェックして、係数が有意であることを確認します
  • 完全なモデルの残差の2乗の合計との差を確認します
  • モデルを視覚的に確認します(それがナンセンスでないことを確認してください)

なぜ重要性をチェックするのですか?これは、区分的モデルのいずれかがデータに非常にうまく適合しない場合、最小SSEのポイントは意味がないためです。これは、勾配が変化する明確なブレークポイントがない2つの相関性の高い変数で発生する可能性があります。

この簡単なアプローチを簡単なテストケースで確認してみましょう。

x <- c(-50:50)
y <- abs(x)
plot(x,y,pch=19)

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

ブレークポイントは明らかにゼロです。次のRスクリプトを使用します。

f <- function(x, y)
{
    d <- data.frame(x=x, y=y)
    d <- d[order(x),]
    r <- data.frame(k=rep(0,length(x)-4), sums=rep(0,length(x)-4))

    plm <- function(i)
    {
        d1 <- head(d,i)
        d2 <- tail(d,-i)

        # Make sure we've divided the region perfectly        
        stopifnot(nrow(d1)+nrow(d2) == nrow(d))

        m1 <- lm(y~x, data=d1)
        m2 <- lm(y~x, data=d2)

        r <- list(m1, m2)
        r
    }

    lapply(2:(nrow(d)-3), function(i)
    {
        r$k[i-2] <<- d[i,]$x

        # Fit two piecewise linear models
        m <- plm(i)

        # Add up the sum of squares for residuals
        r$sums[i-2] <<- sum((m[[1]]$residuals)^2) + sum((m[[2]]$residuals)^2)
    })

    b <- r[which.min(r$sums),]    
    b
}

可能なすべての組み合わせに対して区分的線形モデルを近似します。

f(x,y)
   k sums
   0    0

2つの最適なモデルの係数をチェックすると、それらは非常に重要になります。彼らのR2も非常に高くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.