Je me demande si je manque quelque chose d'évident, mais ne pourriez-vous pas le faire statistiquement en utilisant ANCOVA? Un problème important est que les pentes des deux régressions sont estimées avec erreur. Ce sont des estimations des pentes de l'ensemble des populations. Si la préoccupation est de savoir si les deux droites de régression sont parallèles ou non dans la population, il n'est pas logique de comparer directement a1 avec a2 pour une équivalence exacte; ils sont tous les deux sujets à des erreurs / incertitudes qui doivent être prises en compte.
Si nous y réfléchissons d'un point de vue statistique, et que nous pouvons combiner les données sur et pour les deux ensembles de données de manière significative (c'est-à-dire que et dans les deux ensembles sont tirés des deux populations avec des plages similaires pour les deux variables c'est juste la relation entre elles qui sont différentes dans les deux populations), alors on peut adapter les deux modèles suivants:y x yxyxy
y^=b0+b1x+b2g
et
y^=b0+b1x+b2g+b3xg
Où sont les coefficients du modèle et est une variable / facteur de regroupement, indiquant à quel ensemble de données appartient chaque observation. gbig
Nous pouvons utiliser une table ANOVA ou un rapport F pour tester si le deuxième modèle, plus complexe, correspond mieux aux données que le modèle plus simple. Le modèle plus simple indique que les pentes des deux lignes sont les mêmes ( ) mais les lignes sont décalées l'une de l'autre d'un montant .b 2b1b2
Le modèle plus complexe comprend une interaction entre la pente de la ligne et la variable de regroupement. Si le coefficient de ce terme d'interaction est significativement différent de zéro ou si le rapport ANOVA / F indique que le modèle plus complexe correspond mieux aux données, nous devons rejeter l'hypothèse Null selon laquelle deux lignes sont parallèles.
Voici un exemple dans R utilisant des données fictives. Tout d'abord, les données avec des pentes égales:
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)
Qui donne
> 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
Indiquant que nous ne parvenons pas à rejeter l'hypothèse nulle de pentes égales dans cet échantillon de données. Bien sûr, nous voudrions nous assurer que nous avions suffisamment de puissance pour détecter une différence s'il y en avait vraiment une afin que nous ne soyons pas amenés à échouer par erreur à rejeter le zéro parce que notre taille d'échantillon était trop petite pour l'effet attendu.
Maintenant avec différentes pentes.
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)
Qui donne:
> 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
Ici, nous avons des preuves substantielles contre l'hypothèse nulle et nous pouvons donc la rejeter en faveur de l'alternative (en d'autres termes, nous rejetons l'hypothèse que les pentes des deux droites sont égales).
Les termes d'interaction dans les deux modèles que j'ai ajustés ( ) donnent la différence estimée de pentes pour les deux groupes. Pour le premier modèle, l'estimation de la différence de pente est faible (~ 0,003)b3xg
> coef(m1)
(Intercept) x gB x:gB
2.100068977 0.500596394 2.659509181 0.002846393
et un test à ce sujet ne permettrait pas de rejeter l'hypothèse nulle selon laquelle cette différence de pente est de 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 nous nous tournons vers le modèle ajusté au deuxième ensemble de données, où nous avons fait différer les pentes pour les deux groupes, nous voyons que la différence estimée dans les pentes des deux lignes est d'environ 1 unité.
> coef(m2)
(Intercept) x gB x:gB
2.3627432 0.4920317 2.8931074 1.0048653
La pente pour le groupe "A" est ~ 0,49 ( x
dans la sortie ci-dessus), tandis que pour obtenir la pente pour le groupe "B", nous devons ajouter les différences de pente (données par le terme d'interaction rappelez-vous) à la pente du groupe "A" ; ~ 0,49 + ~ 1 = ~ 1,49. Ceci est assez proche de la pente indiquée pour le groupe "B" de 1,5. Un test sur cette différence de pentes indique également que l'estimation de la différence est limitée à 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