Alterando hipótese nula na regressão linear

18

Eu tenho alguns dados que são altamente correlacionados. Se eu executar uma regressão linear, obtenho uma linha de regressão com uma inclinação próxima a uma (= 0,93). O que eu gostaria de fazer é testar se essa inclinação é significativamente diferente de 1.0. Minha expectativa é que não seja. Em outras palavras, eu gostaria de mudar a hipótese nula da regressão linear de uma inclinação de zero para uma inclinação de um. Essa é uma abordagem sensata? Eu também aprecio muito que você inclua algum código R na sua resposta para que eu possa implementar esse método (ou melhor, você sugere!). Obrigado.

Nick Crawford
fonte

Respostas:

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

Saídas:

            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
fonte
Obrigado! Eu simplesmente não conseguia descobrir como alterar o comando lm.
Nick Crawford
Então é exatamente o mesmo "lm (yx ~ x)" que "lm (y ~ x, deslocamento = 1,00 * x)" (ou sem esse 1,00)? Essa subtração não seria um problema com as suposições para mínimos quadrados ou com colinearidade? Eu quero usá-lo para uma regressão logística com efeitos aleatórios glmer (....). Seria ótimo ter um método simples, mas correto, para obter os valores-p.
Skan #
Aqui, stats.stackexchange.com/questions/111559/… Matifou diz que esse método é pior do que usar Wald no teste.
skan
7

Rβ=rβRr

y=β0 0+β1x+você

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

Para esse tipo de hipótese, você pode usar a linearHypothesisfunção do pacote 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
fonte
Isso pode ser usado para um teste unilateral?
Jpmath
6

Parece que você ainda está tentando rejeitar uma hipótese nula. Existem muitos problemas com isso, e o menos importante é que você não tem energia suficiente para perceber que é diferente de 1. Parece que você não se importa que a inclinação seja 0,07 diferente de 1. Mas e se você não puder realmente dizer? E se você estiver realmente estimando uma inclinação que varia muito e pode estar bem longe de 1 com algo como um intervalo de confiança de ± 0,4. Sua melhor tática aqui não é alterar a hipótese nula, mas na verdade falando razoavelmente sobre uma estimativa de intervalo. Se você aplicar o comando confint () ao seu modelo, poderá obter um intervalo de confiança de 95% em torno de sua inclinação. Então você pode usar isso para discutir a inclinação que você recebeu. Se 1 estiver dentro do intervalo de confiança, é possível afirmar que está dentro do intervalo de valores que você acredita que provavelmente conterão o valor verdadeiro. Mas o mais importante é que você também pode indicar qual é esse intervalo de valores.

John
fonte
3

O objetivo do teste é que você deseja rejeitar sua hipótese nula, não confirmá-la. O fato de não haver diferença significativa não é de forma alguma uma prova da ausência de uma diferença significativa. Para isso, você precisará definir qual tamanho de efeito você considera razoável para rejeitar o nulo.

seuope-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

Agora você deve estar ciente do fato de que o tamanho do efeito para o qual uma diferença se torna significativa é

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

desde que tenhamos um estimador decente do erro padrão na inclinação. Portanto, se você decidir que uma diferença significativa deve ser detectada apenas de 0,1, poderá calcular o DF necessário da seguinte maneira:

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

Veja bem, isso depende bastante da estimativa da inclinação. Para obter uma estimativa melhor do seslope, você pode fazer uma nova amostragem dos seus dados. Uma maneira ingênua seria:

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

colocando seslope2 na função de otimização, retorna:

$minimum
[1] 6.954609

Tudo isso lhe dirá que seu conjunto de dados retornará um resultado significativo mais rapidamente do que você julga necessário e que você precisará apenas de 7 graus de liberdade (neste caso, 9 observações) se quiser ter certeza de que não significativo significa o que você deseja. significa.

Joris Meys
fonte