Kann mir bitte jemand sagen, wie R den Bruchpunkt in einem stückweisen linearen Modell (als fester oder zufälliger Parameter) abschätzen soll, wenn ich auch andere zufällige Effekte abschätzen muss?
Im Folgenden ist ein Spielzeugbeispiel aufgeführt, das eine Hockeyschläger- / gebrochener-Schläger-Regression mit zufälligen Steigungsabweichungen und einer zufälligen y-Achsenabschnittsabweichung für einen Bruchpunkt von 4 berücksichtigt. Ich möchte den Bruchpunkt schätzen, anstatt ihn anzugeben. Dies kann ein zufälliger Effekt (bevorzugt) oder ein fester Effekt sein.
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")
}
)
Ausgabe:
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
r
mixed-model
lme4-nlme
change-point
piecewise-linear
abgesperrt
quelle
quelle
Antworten:
Ein anderer Ansatz wäre, den Aufruf an lmer in eine Funktion zu verpacken, die den Haltepunkt als Parameter übergibt, und dann die Abweichung des angepassten Modells zu minimieren, die vom Haltepunkt abhängig ist, indem die Option "Optimize" verwendet wird. Dies maximiert die Wahrscheinlichkeit Profilprotokolls für den Haltepunkt und im Allgemeinen (dh nicht nur für dieses Problem), wenn die Funktion im Inneren des Wrappers (in diesem Fall weniger) maximale Wahrscheinlichkeitsschätzungen findet, die von dem an ihn übergebenen Parameter abhängig sind, das Ganze Mit procedure werden die gemeinsamen Maximum-Likelihood-Schätzungen für alle Parameter ermittelt.
Um ein Konfidenzintervall für den Haltepunkt zu erhalten, können Sie die Profilwahrscheinlichkeit verwenden . Hinzufügen, zB
qchisq(0.95,1)
die minimale Abweichung (für ein 95% -Konfidenzintervall) und suche dann nach Punkten, bei denenfoo(x)
der berechnete Wert gleich ist:Etwas asymmetrisch, aber keine schlechte Präzision für dieses Spielzeugproblem. Eine Alternative wäre das Bootstrap-Verfahren, wenn Sie über genügend Daten verfügen, um den Bootstrap zuverlässig zu machen.
quelle
Die von jbowman vorgeschlagene Lösung ist sehr gut und fügt nur einige theoretische Anmerkungen hinzu:
Angesichts der Diskontinuität der verwendeten Indikatorfunktion kann die Profilwahrscheinlichkeit mit mehreren lokalen Minima sehr unregelmäßig sein, sodass die üblichen Optimierer möglicherweise nicht funktionieren. Die übliche Lösung für solche "Schwellenwertmodelle" besteht darin, stattdessen die umständlichere Rastersuche zu verwenden und die Abweichung an jedem möglichen realisierten Haltepunkt / Schwellentag (und nicht bei Werten dazwischen, wie im Code angegeben) zu bewerten. Siehe Code unten.
In diesem Nicht-Standardmodell, in dem der Haltepunkt geschätzt wird, weist die Abweichung normalerweise nicht die Standardverteilung auf. In der Regel werden kompliziertere Verfahren angewendet. Siehe den Verweis auf Hansen (2000) weiter unten.
Der Bootstrap ist in dieser Hinsicht auch nicht immer konsistent, siehe Yu (in Kürze) weiter unten.
Schließlich ist mir nicht klar, warum Sie die Daten transformieren, indem Sie sie um die Tage herum neu zentrieren (dh bp - x statt nur x). Ich sehe zwei Probleme:
Standardreferenzen hierfür sind:
Code:
quelle
Sie könnten ein MARS- Modell ausprobieren . Ich bin mir jedoch nicht sicher, wie ich zufällige Effekte festlegen soll.
earth(Reaction~Days+Subject, sleepstudy)
quelle
Dies ist ein Papier, das einen gemischten Effekt MARS vorschlägt. Wie @lockedoff bereits erwähnte, sehe ich in keinem Paket Implementierungen derselben.
quelle