Cambio de hipótesis nula en regresión lineal

18

Tengo algunos datos que están altamente correlacionados. Si ejecuto una regresión lineal, obtengo una línea de regresión con una pendiente cercana a uno (= 0.93). Lo que me gustaría hacer es probar si esta pendiente es significativamente diferente de 1.0. Mi expectativa es que no lo es. En otras palabras, me gustaría cambiar la hipótesis nula de la regresión lineal de una pendiente de cero a una pendiente de uno. ¿Es este un enfoque sensato? También agradecería mucho que pudieras incluir algún código R en tu respuesta para poder implementar este método (¡o uno mejor que sugieras!). Gracias.

Nick Crawford
fuente

Respuestas:

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

Salidas:

            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
fuente
¡Gracias! Simplemente no podía entender cómo cambiar el comando lm.
Nick Crawford
Entonces, ¿es exactamente el mismo "lm (yx ~ x)" que "lm (y ~ x, offset = 1.00 * x)" (o sin ese 1.00)? ¿No sería esa resta un problema con los supuestos de mínimos cuadrados o con la colinealidad? Quiero usarlo para una regresión logística con efectos aleatorios glmer (....). Sería genial tener un método simple pero correcto para obtener los valores p.
skan
Aquí stats.stackexchange.com/questions/111559/… Matifou dice que este método es peor que usar la prueba de Wald.
skan
7

Rβ=rβRr

y=β0 0+β1X+tu

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

Para este tipo de hipótesis, puede usar la linearHypothesisfunción del paquete de automóviles :

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
fuente
¿Se puede usar para una prueba unilateral?
jpmath
6

Parece que todavía estás tratando de rechazar una hipótesis nula. Hay muchos problemas con eso, uno de los cuales es que es posible que no tengas suficiente potencia para ver que eres diferente de 1. Parece que no te importa que la pendiente sea 0.07 diferente de 1. ¿Pero qué pasa si realmente no puedes decirlo? ¿Qué sucede si realmente está estimando una pendiente que varía enormemente y que en realidad puede estar bastante lejos de 1 con algo así como un intervalo de confianza de ± 0.4. Su mejor táctica aquí no es cambiar la hipótesis nula, sino hablar razonablemente sobre una estimación de intervalo. Si aplica el comando confint () a su modelo, puede obtener un intervalo de confianza del 95% alrededor de su pendiente. Luego puede usar esto para discutir la pendiente que obtuvo. Si 1 está dentro del intervalo de confianza, puede indicar que está dentro del rango de valores que cree que probablemente contenga el valor verdadero. Pero lo más importante es que también puede indicar cuál es ese rango de valores.

John
fuente
3

El punto de prueba es que desea rechazar su hipótesis nula, no confirmarla. El hecho de que no haya una diferencia significativa no es en modo alguno una prueba de la ausencia de una diferencia significativa. Para eso, tendrás que definir qué tamaño de efecto consideras razonable para rechazar el nulo.

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

Ahora debe tener en cuenta el hecho de que el tamaño del efecto para el cual una diferencia se vuelve significativa, es

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

siempre que tengamos un estimador decente del error estándar en la pendiente. Por lo tanto, si decide que solo se debe detectar una diferencia significativa de 0.1, puede calcular el DF necesario de la siguiente manera:

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

Eso sí, esto depende bastante de la estimación del seslope. Para obtener una mejor estimación de seslope, puede hacer un nuevo muestreo de sus datos. Una manera ingenua sería:

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

poniendo seslope2 en la función de optimización, devuelve:

$minimum
[1] 6.954609

Todo esto le indicará que su conjunto de datos arrojará un resultado significativo más rápido de lo que considere necesario, y que solo necesita 7 grados de libertad (en este caso, 9 observaciones) si desea asegurarse de que no significativo significa lo que quiere. medio.

Joris Meys
fuente