Änderung der Nullhypothese in der linearen Regression

18

Ich habe einige Daten, die stark korreliert sind. Wenn ich eine lineare Regression durchführe, erhalte ich eine Regressionslinie mit einer Steigung nahe eins (= 0,93). Was ich tun möchte, ist zu testen, ob diese Steigung signifikant von 1,0 abweicht. Meine Erwartung ist, dass es nicht so ist. Mit anderen Worten, ich möchte die Nullhypothese der linearen Regression von einer Steigung von Null auf eine Steigung von Eins ändern. Ist das ein vernünftiger Ansatz? Ich würde es auch sehr begrüßen, wenn Sie einen R-Code in Ihre Antwort aufnehmen würden, damit ich diese Methode implementieren könnte (oder eine bessere, die Sie vorschlagen!). Vielen Dank.

Nick Crawford
quelle

Antworten:

11
set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2) # generate correlated data
summary(lm(y ~ x))                  # original model
summary(lm(y ~ x, offset= 1.00*x))  # testing against slope=1
summary(lm(y-x ~ x))                # testing against slope=1

Ausgänge:

            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.01532    0.04728   0.324     0.75    
x            0.91424    0.04128  22.148 1.64e-14 ***

 

            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.01532    0.04728   0.324   0.7497  
x           -0.08576    0.04128  -2.078   0.0523 .

 

            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.01532    0.04728   0.324   0.7497  
x           -0.08576    0.04128  -2.078   0.0523 .
GaBorgulya
quelle
Vielen Dank! Ich konnte nur nicht herausfinden, wie ich den Befehl lm ändern soll.
Nick Crawford
Ist es dann genau das gleiche "lm (yx ~ x)" wie "lm (y ~ x, Offset = 1,00 * x)" (oder ohne dieses 1,00)? Wäre diese Subtraktion nicht ein Problem mit den Annahmen für die kleinsten Quadrate oder mit der Kollinearität? Ich möchte es für eine logistische Regression mit zufälligen Effekten verwenden. Es wäre großartig, eine einfache, aber korrekte Methode zu haben, um die p-Werte zu erhalten.
skan
Hier stats.stackexchange.com/questions/111559/… Matifou sagt, dass diese Methode schlechter ist als die Verwendung des Tests von Wald.
skan
7

Rβ=rβRr

y=β0+β1x+u

β1=0R=[0,1]r=1

Für diese Art von Hypothesen können Sie die linearHypothesisFunktion aus dem Paket car verwenden :

set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2) # generate correlated data
mod <- lm(y ~ x))                  # original model


> linearHypothesis(mod,matrix(c(0,1),nrow=1),rhs=c(1))
Linear hypothesis test

Hypothesis:
x = 1

Model 1: restricted model
Model 2: y ~ x

  Res.Df     RSS Df Sum of Sq      F  Pr(>F)  
1     19 0.96022                              
2     18 0.77450  1   0.18572 4.3162 0.05234 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
mpiktas
quelle
Kann dies für einen einseitigen Test verwendet werden?
jpmath
6

Es scheint, dass Sie immer noch versuchen, eine Nullhypothese abzulehnen. Es gibt jede Menge Probleme damit, nicht zuletzt ist es möglich, dass Sie nicht genug Kraft haben, um zu sehen, dass Sie sich von 1 unterscheiden 1. Aber was ist, wenn Sie nicht wirklich sagen können? Was ist, wenn Sie tatsächlich eine Steigung schätzen, die stark schwankt und mit einem Konfidenzintervall von ± 0,4 möglicherweise ziemlich weit von 1 entfernt ist? Ihre beste Taktik besteht darin, die Nullhypothese nicht zu ändern, sondern vernünftigerweise von einer Intervallschätzung zu sprechen. Wenn Sie den Befehl confint () auf Ihr Modell anwenden, können Sie ein Konfidenzintervall von 95% um Ihre Steigung erhalten. Dann können Sie diese verwenden, um die Steigung zu diskutieren, die Sie erhalten haben. Wenn 1 innerhalb des Konfidenzintervalls liegt, können Sie angeben, dass es innerhalb des Wertebereichs liegt, von dem Sie glauben, dass er den wahren Wert enthält. Wichtiger ist jedoch, dass Sie auch angeben können, um welchen Wertebereich es sich handelt.

John
quelle
3

Der Sinn des Testens besteht darin, dass Sie Ihre Nullhypothese ablehnen und nicht bestätigen möchten. Die Tatsache, dass es keinen signifikanten Unterschied gibt, ist in keiner Weise ein Beweis für das Fehlen eines signifikanten Unterschieds. Dazu müssen Sie festlegen, welche Effektgröße Sie für sinnvoll halten, um die Null zurückzuweisen.

slOpe-1

set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2)
model <- lm(y~x)

coefx <- coef(summary(model))[2,1]
seslope <- coef(summary(model))[2,2]
DF <- model$df.residual

# normal test
p <- (1 - pt(coefx/seslope,DF) )*2
# test whether different from 1
p2 <- (1 - pt(abs(coefx-1)/seslope,DF) )*2

Nun sollten Sie sich der Tatsache bewusst sein, dass die Effektgröße, für die ein Unterschied signifikant wird, ist

> qt(0.975,DF)*seslope
[1] 0.08672358

vorausgesetzt, wir haben einen anständigen Schätzer für den Standardfehler auf der Steigung. Wenn Sie also entscheiden, dass ein signifikanter Unterschied erst ab 0,1 erkannt werden soll, können Sie den erforderlichen DF wie folgt berechnen:

optimize(
    function(x)abs(qt(0.975,x)*seslope - 0.1),
    interval=c(5,500)
) 
$minimum
[1] 6.2593

Wohlgemerkt, das ist ziemlich abhängig von der Schätzung der Seslope. Um eine bessere Schätzung für Seslope zu erhalten, können Sie Ihre Daten erneut abtasten. Ein naiver Weg wäre:

n <- length(y)
seslope2 <-
  mean(
    replicate(n,{
      id <- sample(seq.int(n),1)
      model <- lm(y[-id]~x[-id])
      coef(summary(model))[2,2]
    })
  )

Wenn Sie seslope2 in die Optimierungsfunktion einfügen, wird Folgendes zurückgegeben:

$minimum
[1] 6.954609

All dies zeigt Ihnen, dass Ihr Datensatz schneller ein signifikantes Ergebnis liefert, als Sie es für notwendig halten, und dass Sie nur 7 Freiheitsgrade (in diesem Fall 9 Beobachtungen) benötigen, wenn Sie sicher sein möchten, dass Nicht-Signifikant bedeutet, was Sie wollen meint.

Joris Meys
quelle