Rのランダムな効果を持つ破損したスティック/区分的線形モデルの破損点の推定[コードと出力を含む]


14

他のランダム効果も推定する必要があるときに、Rに区分的線形モデルのブレークポイントを(固定またはランダムパラメーターとして)推定させる方法を教えてもらえますか?

ブレークポイント4のランダムスロープ分散とランダムy切片分散を使用したホッケースティック/ブロークンスティック回帰に適合するおもちゃの例を以下に示します。ブレークポイントを指定する代わりに推定したいです。ランダム効果(望ましい)または固定効果の可能性があります。

library(lme4)
str(sleepstudy)

#Basis functions
bp = 4
b1 <- function(x, bp) ifelse(x < bp, bp - x, 0)
b2 <- function(x, bp) ifelse(x < bp, 0, x - bp)

#Mixed effects model with break point = 4
(mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy))

#Plot with break point = 4
xyplot(
        Reaction ~ Days | Subject, sleepstudy, aspect = "xy",
        layout = c(6,3), type = c("g", "p", "r"),
        xlab = "Days of sleep deprivation",
        ylab = "Average reaction time (ms)",
        panel = function(x,y) {
        panel.points(x,y)
        panel.lmline(x,y)
        pred <- predict(lm(y ~ b1(x, bp) + b2(x, bp)), newdata = data.frame(x = 0:9))
            panel.lines(0:9, pred, lwd=1, lty=2, col="red")
        }
    )

出力:

Linear mixed model fit by REML 
Formula: Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject) 
   Data: sleepstudy 
  AIC  BIC logLik deviance REMLdev
 1751 1783 -865.6     1744    1731
Random effects:
 Groups   Name         Variance Std.Dev. Corr          
 Subject  (Intercept)  1709.489 41.3460                
          b1(Days, bp)   90.238  9.4994  -0.797        
          b2(Days, bp)   59.348  7.7038   0.118 -0.008 
 Residual               563.030 23.7283                
Number of obs: 180, groups: Subject, 18

Fixed effects:
             Estimate Std. Error t value
(Intercept)   289.725     10.350  27.994
b1(Days, bp)   -8.781      2.721  -3.227
b2(Days, bp)   11.710      2.184   5.362

Correlation of Fixed Effects:
            (Intr) b1(D,b
b1(Days,bp) -0.761       
b2(Days,bp) -0.054  0.181

各個人に適合する壊れたスティック回帰


1
bpをランダム効果にする方法はありますか?
djhocking

回答:


20

もう1つの方法は、ブレークポイントをパラメーターとして渡す関数でlmerの呼び出しをラップし、最適化を使用してブレークポイントを条件とする適合モデルの逸脱を最小化することです。これにより、ブレークポイントのプロファイルログ尤度が最大化され、一般的に(つまり、この問題だけでなく)ラッパー(この場合はlmer)の内部関数が、渡されたパラメーターを条件とする最尤推定値を見つけた場合、全体プロシージャは、すべてのパラメーターの結合最尤推定値を見つけます。

library(lme4)
str(sleepstudy)

#Basis functions
bp = 4
b1 <- function(x, bp) ifelse(x < bp, bp - x, 0)
b2 <- function(x, bp) ifelse(x < bp, 0, x - bp)

#Wrapper for Mixed effects model with variable break point
foo <- function(bp)
{
  mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy)
  deviance(mod)
}

search.range <- c(min(sleepstudy$Days)+0.5,max(sleepstudy$Days)-0.5)
foo.opt <- optimize(foo, interval = search.range)
bp <- foo.opt$minimum
bp
[1] 6.071932
mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy)

ブレークポイントの信頼区間を取得するには、プロファイル尤度を使用できます。たとえば、qchisq(0.95,1)最小偏差に追加して(95%信頼区間)foo(x)、計算値と等しいポイントを検索します。

foo.root <- function(bp, tgt)
{
  foo(bp) - tgt
}
tgt <- foo.opt$objective + qchisq(0.95,1)
lb95 <- uniroot(foo.root, lower=search.range[1], upper=bp, tgt=tgt)
ub95 <- uniroot(foo.root, lower=bp, upper=search.range[2], tgt=tgt)
lb95$root
[1] 5.754051
ub95$root
[1] 6.923529

やや非対称ですが、このおもちゃの問題の精度は悪くありません。ブートストラップの信頼性を高めるのに十分なデータがある場合は、推定手順をブートストラップすることもできます。


ありがとう-それはとても役に立ちました。この手法は2段階の推定手順と呼ばれますか、それとも参照/検索できる標準名がありますか?
ロックオフ

それは最尤です、またはlmerが尤度を最大化した場合(デフォルトは実際にはREMLであると思います。ML推定値を取得するにはパラメーターREML = FALSEをlmerに渡す必要があります)。一度にすべてではなく、ネストされた方法で推定されます。答えの前に明確化を追加しました。
jbowman

プロファイルの尤度を実際のデータで反転させると、最適化の問題と幅の広いCIがいくつかありましたが、実装ではブートストラップCIが狭くなりました。被験者のデータベクトルを置換するサンプリングを使用したノンパラメトリックブートストラップを想定していましたか?すなわち、sleepstudyデータの場合、これには、被験者のデータベクトル内でリサンプリングを行わずに、10個のデータポイントの18(被験者)ベクトルからの置換によるサンプリングが必要になります。
ロックオフ

はい、あなたが説明するようにノンパラメトリックブートストラップを想定していましたが、部分的には、適用可能な(または適用できない)高度なブートストラップテクニックについてあまり知らないためです。プロファイル尤度ベースのCIとブートストラップはどちらも漸近的に正確ですが、サンプルに対してブートストラップが非常に優れている可能性があります。
jbowman

5

jbowmanが提案する解決策は非常に優れており、いくつかの理論的見解を追加しています。

  • 使用されるインジケータ関数の不連続性を考えると、プロファイル尤度は非常に不安定で、複数の極小値があるため、通常のオプティマイザーが機能しない可能性があります。そのような「しきい値モデル」の通常の解決策は、より面倒なグリッド検索を代わりに使用して、実現可能な各ブレークポイント/しきい値日での逸脱を評価することです(コードで行われるように、中間の値ではありません)。下部のコードを参照してください。

  • ブレークポイントが推定されるこの非標準モデル内では、通常、逸脱には標準分布がありません。通常、より複雑な手順が使用されます。以下のHansen(2000)への参照を参照してください。

  • ブートストラップは、この点で常に一貫しているわけではありません。以下のYu(今後)を参照してください。

  • 最後に、なぜ日を中心にデータを変換しているのか(つまり、xだけでなくbp-x)を明確にしたわけではありません。次の2つの問題があります。

    1. この手順では、6.1日、4.1などの人為的な日を作成します。たとえば、6.07の結果を解釈する方法がわかりません。(標準のブレークポイントモデルでは、6〜7のしきい値の値は同じcoef / devianceを提供する必要があります)
    2. b1とb2は反対の意味を持ちます。なぜならb1では日数が減り、b2では増加するからです。したがって、ブレークポイントなしの非公式のテストはb1!=-b2です

これの標準参照は次のとおりです。

  • Standard OLS:Hansen(2000)Sample Splitting and Threshold Estimation、Econometrica、Vol。68、No。3(2000年5月)、pp。575-603。
  • よりエキゾチックなモデル:Lee、Seo、Shin(2011)回帰モデルのしきい値効果のテスト、Journal of the American Statistical Association(Theory and Methods)(2011)、106、220-231
  • Ping Yu(近日公開)「しきい値回帰におけるブートストラップ」、計量経済学理論。

コード:

# Using grid search over existing values:
search.grid <- sort(unique(subset(sleepstudy, Days > search.range[1] &
Days<search.range[2], "Days", drop=TRUE)))

res <- unlist(lapply(as.list(search.grid), foo))

plot(search.grid, res, type="l")
bp_grid <- search.grid[which.min(res)]

0

MARSモデルを試すことができます。ただし、ランダム効果を指定する方法がわかりません。 earth(Reaction~Days+Subject, sleepstudy)


1
ありがとう-パッケージのドキュメントを閲覧しましたが、ランダム効果をサポートしていないようです。
ロックオフ

0

これは、混合効果MARSを提案する論文です。@lockedoffが述べたように、どのパッケージにも同じものの実装は見当たりません。

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