Modifica dell'ipotesi nulla nella regressione lineare


18

Ho alcuni dati che sono altamente correlati. Se eseguo una regressione lineare ottengo una linea di regressione con una pendenza vicina a una (= 0.93). Quello che mi piacerebbe fare è verificare se questa pendenza è significativamente diversa dalla 1.0. La mia aspettativa è che non lo sia. In altre parole, vorrei cambiare l'ipotesi nulla della regressione lineare da una pendenza di zero a una pendenza di una. È un approccio sensato? Gradirei anche che tu possa includere un po 'di codice R nella tua risposta in modo da poter implementare questo metodo (o uno migliore che mi suggerisci!). Grazie.

Risposte:


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

Uscite:

            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 .

Grazie! Non riuscivo proprio a capire come cambiare il comando lm.
Nick Crawford,

Quindi è esattamente lo stesso "lm (yx ~ x)" di "lm (y ~ x, offset = 1.00 * x)" (o senza quello 1.00)? Quella sottrazione non sarebbe un problema con i presupposti per i minimi quadrati o con la collinearità? Voglio usarlo per una regressione logistica con effetti casuali glmer (....). Sarebbe bello avere un metodo semplice ma corretto per ottenere i valori p.
skan

Qui stats.stackexchange.com/questions/111559/… Matifou afferma che questo metodo è peggiore dell'utilizzo di Wald nel test.
skan

7

Rβ=rβRr

y=β0+β1X+u

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

Per questo tipo di ipotesi è possibile utilizzare la linearHypothesisfunzione dal pacchetto auto :

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 

Può essere usato per un test unilaterale?
jpmath

6

Sembra che tu stia ancora cercando di respingere un'ipotesi nulla. Ci sono molti problemi con ciò, non ultimo il fatto che è possibile che tu non abbia abbastanza potenza per vedere che sei diverso da 1. Sembra che non ti interessi che la pendenza sia 0,07 diversa da 1. Ma cosa succede se non riesci davvero a dirlo? Che cosa succede se si sta effettivamente stimando una pendenza che varia selvaggiamente e potrebbe in realtà essere abbastanza lontana da 1 con qualcosa come un intervallo di confidenza di ± 0,4. La tua migliore tattica qui non sta cambiando l'ipotesi nulla ma in realtà parlando ragionevolmente di una stima dell'intervallo. Se si applica il comando confint () al modello, è possibile ottenere un intervallo di confidenza del 95% attorno alla pendenza. Quindi puoi usarlo per discutere la pendenza che hai ottenuto. Se 1 rientra nell'intervallo di confidenza, puoi affermare che rientra nell'intervallo di valori che ritieni possano contenere il valore reale. Ma soprattutto, puoi anche indicare qual è l'intervallo di valori.


3

Il punto di prova è che vuoi rifiutare la tua ipotesi nulla, non confermarla. Il fatto che non vi sia alcuna differenza significativa, non è in alcun modo una prova dell'assenza di una differenza significativa. Per questo, dovrai definire la dimensione dell'effetto che ritieni ragionevole rifiutare il null.

Testare se la pendenza è significativamente diversa da 1 non è poi così difficile, basta verificare se la differenza Slope-1differisce significativamente da zero. A mano questo sarebbe qualcosa del tipo:

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

Ora dovresti essere consapevole del fatto che la dimensione dell'effetto per cui una differenza diventa significativa è

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

purché disponiamo di uno stimatore decente dell'errore standard sulla pendenza. Pertanto, se si decide che una differenza significativa deve essere rilevata solo da 0,1, è possibile calcolare il DF necessario come segue:

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

Intendiamoci, questo dipende abbastanza dalla stima della seslope. Per ottenere una stima migliore su seslope, è possibile effettuare un ricampionamento dei dati. Un modo ingenuo sarebbe:

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

mettendo seslope2 nella funzione di ottimizzazione, restituisce:

$minimum
[1] 6.954609

Tutto ciò ti dirà che il tuo set di dati restituirà un risultato significativo più velocemente di quanto ritieni necessario e che hai solo bisogno di 7 gradi di libertà (in questo caso 9 osservazioni) se vuoi essere sicuro che non significativo significhi ciò che vuoi si intende.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.