ご挨拶、
観測された空間のサイズとビッグバンからの経過時間を決定するのに役立つ調査を行っています。うまくいけば、あなたは助けることができます!
2つの線形回帰を実行する区分線形関数に準拠するデータがあります。傾きと切片が変化するポイントがあり、このポイントを見つける(プログラムを作成する)必要があります。
考え?
ご挨拶、
観測された空間のサイズとビッグバンからの経過時間を決定するのに役立つ調査を行っています。うまくいけば、あなたは助けることができます!
2つの線形回帰を実行する区分線形関数に準拠するデータがあります。傾きと切片が変化するポイントがあり、このポイントを見つける(プログラムを作成する)必要があります。
考え?
回答:
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
。
Rパッケージstrucchangeが役立つかもしれません。ビネットを見てください。同様の問題を解決する方法の概要がわかります。
ポイントの数が多すぎない場合は、すべての可能性を試すことができます。ポイントがであるここで、です。それよりも、をからループして、つの行をとます。最後に、両方のラインの残差の二乗和の合計が最小になるを選択します。
これは、(オフラインの)変更点検出の問題です。私たちの前の議論は、雑誌の記事やRコードへの参照を提供します。最初にバリーとハーティガンの「製品分割モデル」を見てください。これは、勾配の変化を処理し、効率的な実装を備えているためです。
また、セグメント化されたパッケージは、過去に同様の問題を解決してくれました。
segmented
セグメント間の切片変更をモデル化することはできません。最初のセグメントの切片のみをモデル化できます。
私はすべての可能性を探すというmbqの答えに基づいています。さらに、私はこれを行います:
なぜ重要性をチェックするのですか?これは、区分的モデルのいずれかがデータに非常にうまく適合しない場合、最小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も非常に高くなります。