¿Cómo calcular la diferencia de dos pendientes?

11

¿Hay algún método para entender si dos líneas son (más o menos) paralelas? Tengo dos líneas generadas a partir de regresiones lineales y me gustaría entender si son paralelas. En otras palabras, me gustaría obtener la diferencia de las pendientes de esas dos líneas.

¿Hay una función R para calcular esto?

EDITAR: ... y ¿cómo puedo obtener la pendiente (en grados) de una línea de regresión lineal?

Dail
fuente

Respuestas:

23

Me pregunto si me estoy perdiendo algo obvio, pero ¿no podrías hacer esto estadísticamente usando ANCOVA? Una cuestión importante es que las pendientes en las dos regresiones se estiman con error. Son estimaciones de las pendientes en las poblaciones en general. Si la preocupación es si las dos líneas de regresión son paralelas o no en la población, entonces no tiene sentido comparar con directamente para obtener la equivalencia exacta; Ambos están sujetos a errores / incertidumbres que deben tenerse en cuenta.a 2a1a2

Si pensamos en esto desde un punto de vista estadístico, y podemos combinar los datos en e para ambos conjuntos de datos de alguna manera significativa (es decir, e en ambos conjuntos se extraen de las dos poblaciones con rangos similares para los dos variables es solo la relación entre ellas que son diferentes en las dos poblaciones), entonces podemos ajustar los siguientes dos modelos:y x yxyxy

y^=b0+b1x+b2g

y

y^=b0+b1x+b2g+b3xg

Donde son los coeficientes del modelo, es una variable / factor de agrupación, que indica a qué conjunto de datos pertenece cada observación. gbig

Podemos usar una tabla ANOVA o una relación F para probar si el segundo modelo más complejo se ajusta mejor a los datos que el modelo más simple. El modelo más simple establece que las pendientes de las dos líneas son las mismas ( ) pero las líneas están desplazadas entre sí por una cantidad .b 2b1b2

El modelo más complejo incluye una interacción entre la pendiente de la línea y la variable de agrupación. Si el coeficiente para este término de interacción es significativamente diferente de cero o la relación ANOVA / F indica que el modelo más complejo se ajusta mejor a los datos, entonces debemos rechazar la hipótesis nula de que dos líneas son paralelas.

Aquí hay un ejemplo en R usando datos ficticios. Primero, datos con pendientes iguales:

set.seed(2)
samp <- factor(sample(rep(c("A","B"), each = 50)))
d1 <- data.frame(y = c(2,5)[as.numeric(samp)] + (0.5 * (1:100)) + rnorm(100),
                 x = 1:100,
                 g = samp)
m1 <- lm(y ~ x * g, data = d1)
m1.null <- lm(y ~ x + g, data = d1)
anova(m1.null, m1)

Lo que da

> anova(m1.null, m1)
Analysis of Variance Table

Model 1: y ~ x + g
Model 2: y ~ x * g
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     97 122.29                           
2     96 122.13  1   0.15918 0.1251 0.7243

Indicando que no podemos rechazar la hipótesis nula de pendientes iguales en esta muestra de datos. Por supuesto, quisiéramos asegurarnos de que teníamos el poder suficiente para detectar una diferencia si realmente existiera, de modo que no se nos condujera a fallar erróneamente en rechazar el valor nulo porque nuestro tamaño de muestra era demasiado pequeño para el efecto esperado.

Ahora con diferentes pendientes.

set.seed(42)
x <- seq(1, 100, by = 2)
d2 <- data.frame(y = c(2 + (0.5 * x) + rnorm(50),
                       5 + (1.5 * x) + rnorm(50)),
                 x = x,
                 g = rep(c("A","B"), each = 50))
m2 <- lm(y ~ x * g, data = d2)
m2.null <- lm(y ~ x + g, data = d2)
anova(m2.null, m2)

Lo que da:

> anova(m2.null, m2)
Analysis of Variance Table

Model 1: y ~ x + g
Model 2: y ~ x * g
  Res.Df     RSS Df Sum of Sq     F    Pr(>F)    
1     97 21132.0                                 
2     96   103.8  1     21028 19439 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Aquí tenemos evidencia sustancial contra la hipótesis nula y, por lo tanto, podemos rechazarla a favor de la alternativa (en otras palabras, rechazamos la hipótesis de que las pendientes de las dos líneas sean iguales).

Los términos de interacción en los dos modelos que ( ) dan la diferencia estimada en pendientes para los dos grupos. Para el primer modelo, la estimación de la diferencia en pendientes es pequeña (~ 0.003)b3xg

> coef(m1)
(Intercept)           x          gB        x:gB 
2.100068977 0.500596394 2.659509181 0.002846393

y una prueba sobre esto no podría rechazar la hipótesis nula de que esta diferencia en pendientes es 0:t

> summary(m1)

Call:
lm(formula = y ~ x * g, data = d1)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.32886 -0.81224 -0.01569  0.93010  2.29984 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.100069   0.334669   6.275 1.01e-08 ***
x           0.500596   0.005256  95.249  < 2e-16 ***
gB          2.659509   0.461191   5.767 9.82e-08 ***
x:gB        0.002846   0.008047   0.354    0.724    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 1.128 on 96 degrees of freedom
Multiple R-squared: 0.9941, Adjusted R-squared: 0.9939 
F-statistic:  5347 on 3 and 96 DF,  p-value: < 2.2e-16 

Si recurrimos al modelo ajustado al segundo conjunto de datos, donde diferenciamos las pendientes de los dos grupos, vemos que la diferencia estimada en las pendientes de las dos líneas es de ~ 1 unidad.

> coef(m2)
(Intercept)           x          gB        x:gB 
  2.3627432   0.4920317   2.8931074   1.0048653 

La pendiente para el grupo "A" es ~ 0.49 ( xen la salida anterior), mientras que para obtener la pendiente para el grupo "B" necesitamos agregar las pendientes de diferencia (dadas por el término de interacción recordar) a la pendiente del grupo "A" ; ~ 0.49 + ~ 1 = ~ 1.49. Esto está bastante cerca de la pendiente indicada para el grupo "B" de 1.5. Una prueba en esta diferencia de pendientes también indica que la estimación de la diferencia está limitada desde 0:t

> summary(m2)

Call:
lm(formula = y ~ x * g, data = d2)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.1962 -0.5389  0.0373  0.6952  2.1072 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.362743   0.294220   8.031 2.45e-12 ***
x           0.492032   0.005096  96.547  < 2e-16 ***
gB          2.893107   0.416090   6.953 4.33e-10 ***
x:gB        1.004865   0.007207 139.424  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 1.04 on 96 degrees of freedom
Multiple R-squared: 0.9994, Adjusted R-squared: 0.9994 
F-statistic: 5.362e+04 on 3 and 96 DF,  p-value: < 2.2e-16
Gavin Simpson
fuente
Muchas gracias por esta muy buena explicación. Mi objetivo es entender si las pendientes son más o menos iguales, así que creo que usaré ANOVA para probarlo.
Dail
si tengo dos vectores distintos y me gustaría comparar sus slops pero no tengo el y (lm (x ~ y), ¿cómo puedo usar ANOVA? Intenté anova (lm (x ~ 1), lm (y ~ 1)) pero recibo una advertencia
Dail
¿Qué quieres decir con vectores aquí? ¿En el sentido R o en el sentido matemático? Esto es muy diferente de la cuestión que usted plantea, por lo que tiene que iniciar una nueva pregunta - no no editar éste - que es imposible llevar a cabo seguimientos de tan amplio una naturaleza en los comentarios.
Gavin Simpson, el
no, espere, tengo que comparar dos modelos con ANOVA ... ok, pero si creo un modelo con esta fórmula: x ~ 1 y otro modelo con y ~ 1 recibo la advertencia. Estoy hablando en el sentido R. ¿Como lo puedo hacer?
Dail
1
@Dail si ajustó dos regresiones para obtener dos pendientes / líneas, tiene datos x e y para ambos conjuntos de datos. Como dije en mi respuesta, si las xs e ys son comparables en los dos conjuntos de datos, entonces puede combinar todos los datos y agregar una variable de agrupación. Mi ejemplo muestra cómo hacer esto usando datos ficticios, pero ya tiene datos x e y, son los datos que utilizó para ajustar las regresiones separadas.
Gavin Simpson, el
8

La primera pregunta es en realidad de la geometría. Si tiene dos líneas del formulario:

y = a 2 x + b 2

y=a1x+b1
y=a2x+b2

entonces son paralelos si . Entonces, si las pendientes son iguales, entonces las líneas son paralelas.a1=a2

Para la segunda pregunta, use el hecho de que , donde es el ángulo que forma la línea con el eje , y es la pendiente de la línea. Entonces α x a 1tanα=a1αxa1

α=arctana1

y para convertir a grados, recuerde que . Entonces la respuesta en los grados será2π=360

α=arctana13602π.

Se llama a la función R para .arctanatan

Código R de muestra:

> x<-rnorm(100)
> y<-x+1+rnorm(100)/2
> mod<-lm(y~x)
> mod$coef
    (Intercept)           x 
      0.9416175   0.9850303 
    > mod$coef[2]
        x 
0.9850303 
> atan(mod$coef[2])*360/2/pi
       x 
44.56792 

La última línea son los grados.

Actualizar. Para los valores de pendiente negativos, la conversión a grados debe seguir una regla diferente. Tenga en cuenta que el ángulo con el eje x puede obtener valores de 0 a 180, ya que suponemos que el ángulo está por encima del eje x. Entonces, para valores negativos de , la fórmula es:a1

α=180arctana13602π.

Nota. Si bien fue divertido para mí recordar la trigonometría de la escuela secundaria, la respuesta realmente útil es la que dio Gavin Simpson. Dado que las pendientes de las líneas de regresión son variables aleatorias, para compararlas se debe utilizar el marco de hipótesis estadística.

mpiktas
fuente
¡gracias! ¿Cómo obtener la pendiente de la regresión? ¿tengo que obtener coeficiente e interceptar?
Dail
¿Quizás la regresión lineal devuelva los grados directamente con alguna función?
Dail
¿decir degress = +45 y degress = -315 no son la misma línea? ¿Qué no está hablando de la misma línea?
Dail
1

... siguiendo la respuesta de @mpiktas, así es como extraería la pendiente de un lmobjeto y aplicaría la fórmula anterior.

# prepare some data, see ?lm
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)

lm.D9 <- lm(weight ~ group)
# extract the slope (this is also used to draw a regression line if you wrote abline(lm.D9)
coefficients(lm.D9)["groupTrt"] 
      groupTrt 
   -0.371 
# use the arctan*a1 / (360 / (2*pi)) formula provided by mpiktas
atan(coefficients(lm.D9)["groupTrt"]) * (360/(2 * pi)) 
 groupTrt 
-20.35485 
180-atan(coefficients(lm.D9)["groupTrt"]) * (360/(2 * pi))
 groupTrt 
200.3549 
Roman Luštrik
fuente
muchas gracias por el ejemplo, en este caso los grados son -200?
Dail
Si. Si cree que su problema se ha resuelto, marque la respuesta de @mpiktas como correcta, gracias.
Roman Luštrik
@ RomanLuštrik, te perdiste la división por2π
mpiktas
1
@ RomanLuštrik, arreglé el código y agregué la salida correcta. Siéntase libre de eliminar la corrección.
mpiktas