Modification de l'hypothèse nulle dans la régression linéaire

18

J'ai des données très corrélées. Si je lance une régression linéaire, j'obtiens une droite de régression avec une pente proche de une (= 0,93). Ce que je voudrais faire, c'est tester si cette pente est significativement différente de 1.0. Je m'attends à ce que ce ne soit pas le cas. En d'autres termes, je voudrais changer l'hypothèse nulle de la régression linéaire d'une pente de zéro à une pente d'un. Est-ce une approche sensée? J'apprécierais aussi vraiment que vous puissiez inclure du code R dans votre réponse afin que je puisse implémenter cette méthode (ou une meilleure que vous suggérez!). Merci.

Nick Crawford
la source

Réponses:

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

Les sorties:

            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
la source
Je vous remercie! Je n'arrivais pas à comprendre comment changer la commande lm.
Nick Crawford
Alors est-ce exactement le même "lm (yx ~ x)" que "lm (y ~ x, offset = 1,00 * x)" (ou sans ce 1,00)? Cette soustraction ne serait-elle pas un problème avec les hypothèses des moindres carrés ou avec la colinéarité? Je veux l'utiliser pour une régression logistique avec des effets aléatoires glmer (....). Ce serait formidable d'avoir une méthode simple mais correcte pour obtenir les valeurs de p.
skan
Ici, stats.stackexchange.com/questions/111559/… Matifou dit que cette méthode est pire que d'utiliser Wald le test.
skan
7

Rβ=rβRr

y=β0+β1X+u

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

Pour ces types d'hypothèses, vous pouvez utiliser la linearHypothesisfonction de package car :

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
la source
Peut-il être utilisé pour un test unilatéral?
jpmath
6

Il semble que vous essayiez toujours de rejeter une hypothèse nulle. Il y a beaucoup de problèmes avec cela, le plus important étant qu'il est possible que vous n'ayez pas assez de puissance pour voir que vous êtes différent de 1. Il semble que vous ne vous souciez pas que la pente soit 0,07 différente de 1. Et si vous ne pouvez pas vraiment le dire? Que se passe-t-il si vous estimez en fait une pente qui varie énormément et peut en fait être assez loin de 1 avec quelque chose comme un intervalle de confiance de ± 0,4. Votre meilleure tactique ici n'est pas de changer l'hypothèse nulle mais de parler raisonnablement d'une estimation d'intervalle. Si vous appliquez la commande confint () à votre modèle, vous pouvez obtenir un intervalle de confiance de 95% autour de votre pente. Ensuite, vous pouvez l'utiliser pour discuter de la pente que vous avez obtenue. Si 1 se situe dans l'intervalle de confiance, vous pouvez indiquer qu'il se situe dans la plage de valeurs que vous pensez susceptibles de contenir la vraie valeur. Mais plus important encore, vous pouvez également indiquer quelle est cette plage de valeurs.

John
la source
3

Le point de test est que vous voulez rejeter votre hypothèse nulle, pas la confirmer. Le fait qu'il n'y ait pas de différence significative n'est nullement une preuve de l'absence de différence significative. Pour cela, vous devrez définir quelle taille d'effet vous jugez raisonnable pour rejeter la valeur nulle.

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

Vous devez maintenant être conscient du fait que la taille d'effet pour laquelle une différence devient significative, est

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

à condition d'avoir un estimateur décent de l'erreur type sur la pente. Par conséquent, si vous décidez qu'une différence significative ne doit être détectée qu'à partir de 0,1, vous pouvez calculer le DF nécessaire comme suit:

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

Attention, cela dépend assez de l'estimation de la séslope. Pour obtenir une meilleure estimation sur seslope, vous pouvez rééchantillonner vos données. Une manière naïve serait:

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

mettre seslope2 dans la fonction d'optimisation, renvoie:

$minimum
[1] 6.954609

Tout cela vous dira que votre jeu de données retournera un résultat significatif plus rapidement que vous le jugerez nécessaire, et que vous n'avez besoin que de 7 degrés de liberté (dans ce cas, 9 observations) si vous voulez être sûr que non significatif signifie ce que vous voulez veux dire.

Joris Meys
la source