Standardfehler von Steigungen bei stückweise linearer Regression mit bekannten Haltepunkten


9

Die Situation

Ich habe einen Datensatz mit einem abhängigen und einer unabhängigen Variablen x . Ich möchte eine kontinuierliche stückweise lineare Regression mit k bekannten / festen Haltepunkten anpassen, die bei ( a 1 , a 2 , , a k ) auftreten . Die Breakpoins sind ohne Unsicherheit bekannt, daher möchte ich sie nicht schätzen. Dann passe ich eine Regression (OLS) der Form y i = β 0 + β 1 x i + β 2 max ( x i - a 1) anyxk(a1,a2,,ak) Hier ist ein Beispiel in

yi=β0+β1xi+β2max(xia1,0)+β3max(xia2,0)++βk+1max(xiak,0)+ϵi
R
set.seed(123)
x <- c(1:10, 13:22)
y <- numeric(20)
y[1:10] <- 20:11 + rnorm(10, 0, 1.5)
y[11:20] <- seq(11, 15, len=10) + rnorm(10, 0, 2)

Nehmen wir an, dass der Haltepunkt bei 9,6 liegt :k19.6

mod <- lm(y~x+I(pmax(x-9.6, 0)))
summary(mod)

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          21.7057     1.1726  18.511 1.06e-12 ***
x                    -1.1003     0.1788  -6.155 1.06e-05 ***
I(pmax(x - 9.6, 0))   1.3760     0.2688   5.120 8.54e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Der Achsenabschnitt und die Steigung der beiden Segmente sind: und - 1,1 für das erste und 8,5 bzw. 0,27 für das zweite.21.71.18.50.27

Haltepunkt


Fragen

  1. Wie kann man den Schnittpunkt und die Steigung jedes Segments einfach berechnen? Kann das Modell erneut repariert werden, um dies in einer Berechnung zu tun?
  2. Wie berechnet man den Standardfehler jeder Steigung jedes Segments?
  3. Wie kann man testen, ob zwei benachbarte Steigungen die gleichen Steigungen haben (dh ob der Haltepunkt weggelassen werden kann)?

Antworten:


7
  1. Wie kann man den Schnittpunkt und die Steigung jedes Segments einfach berechnen?

x=151.1003+1.3760=0.2757.

Der Achsenabschnitt ist etwas schwieriger, aber es ist eine lineare Kombination von Koeffizienten (unter Einbeziehung der Knoten).

x=9.621.70571.1003×9.6=11.1428(9.6,11.428)0.275711.14280.2757×9.6=8.496β0β2k1=21.70571.3760×9.6

Kann das Modell neu parametrisiert werden, um dies in einer Berechnung zu tun?

Ja, aber es ist wahrscheinlich im Allgemeinen einfacher, es einfach aus dem Modell zu berechnen.

2. Wie berechnet man den Standardfehler jeder Steigung jedes Segments?

aβ^aaVar(β^)a

In Ihrem Beispiel ist der Standardfehler der Steigung des zweiten Segments:

Sb <- vcov(mod)[2:3,2:3]
sqrt(sum(Sb))

alternativ in Matrixform:

Sb <- vcov(mod)
a <- matrix(c(0,1,1),nr=3)
sqrt(t(a) %*% Sb %*% a)

3. Wie kann getestet werden, ob zwei benachbarte Steigungen die gleichen Steigungen haben (dh ob der Haltepunkt weggelassen werden kann)?

Dies wird anhand des Koeffizienten in der Tabelle dieses Segments getestet. Siehe diese Zeile:

I(pmax(x - 9.6, 0))   1.3760     0.2688   5.120 8.54e-05 ***

Das ist die Änderung der Steigung bei 9,6. Wenn sich diese Änderung von 0 unterscheidet, sind die beiden Steigungen nicht gleich. Der p-Wert für einen Test, dass das zweite Segment die gleiche Steigung wie das erste hat, befindet sich also genau am Ende dieser Linie.


(+1) Danke Glen für deine Antwort. Nur eine kleine Frage zu # 2: In meinem Beispiel würde ich die Varianz-Kovarianz-Matrix von xund benötigen I(pmax(x-9.6,0)), ist das richtig?
COOLSerdash

Nein. Ich habe ein explizites Beispiel basierend auf Ihrem Beispiel bearbeitet. Wenn Sie weitere Informationen wünschen, fragen Sie bitte.
Glen_b -Reinstate Monica

Vielen Dank für die Bearbeitung, die es mir ziemlich klar macht. Verstehe ich das richtig: Der Standardfehler ist für jede Steigung gleich?
COOLSerdash

1
Nein. Die Vorgehensweise ist dieselbe, der Wert jedoch nicht. Der Standardfehler der Steigung des ersten Segments befindet sich in Ihrer Regressionstabelle (0,1788). Der Standardfehler der Steigung des zweiten Segments beträgt 0,1160. Wenn wir ein drittes Segment hätten, würde es mehr Varianz-Kovarianz-Terme in seiner Summe beinhalten (bevor die Quadratwurzel gezogen wird).
Glen_b -Reinstate Monica

6

Mein naiver Ansatz, der Frage 1 beantwortet:

mod2 <- lm(y~I((x<9.6)*x)+as.numeric((x<9.6))+
             I((x>=9.6)*x)+as.numeric((x>=9.6))-1)
summary(mod2)

#                        Estimate Std. Error t value Pr(>|t|)    
# I((x < 9.6) * x)        -1.1040     0.2328  -4.743 0.000221 ***
# as.numeric((x < 9.6))   21.7188     1.3099  16.580 1.69e-11 ***
# I((x >= 9.6) * x)        0.2731     0.1560   1.751 0.099144 .  
# as.numeric((x >= 9.6))   8.5442     2.6790   3.189 0.005704 ** 

Ich bin mir jedoch nicht sicher, ob die Statistiken (insbesondere die Freiheitsgrade) korrekt erstellt wurden, wenn Sie dies auf diese Weise tun.


(+1) Vielen Dank für Ihre Antwort. Es bietet eine sehr bequeme Möglichkeit, die Abschnitte und Steigungen direkt zu berechnen, danke!
COOLSerdash
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.