如何计算两个斜率之差?


11

有没有一种方法可以了解两条线(或多或少)是否平行?我有两条线是从线性回归生成的,我想了解它们是否平行。换句话说,我想得到这两条线的斜率的不同。

是否有R函数来计算?

编辑: ...,以及如何获得线性回归线的斜率(以度为单位)?

Answers:


23

我想知道我是否缺少明显的东西,但是您不能使用ANCOVA进行统计吗?一个重要的问题是两个回归的斜率估计误差。它们是对总体人口坡度的估计。如果关注的是总体中两条回归线是否平行那么进行比较是没有意义的一个1个一个2直接进行精确对等;它们都受到错误/不确定性的影响,需要加以考虑。

如果我们从统计角度考虑这一点,我们可以将 Xÿ 以某种有意义的方式(即 Xÿ 这两个集合中的两个都是从两个变量具有相似范围的两个总体中得出的,只是两个变量中它们之间的关系是不同的),那么我们可以拟合以下两个模型:

ÿ^=b0+b1个X+b2G

ÿ^=b0+b1个X+b2G+b3XG

哪里 b一世 是模型系数,并且 G 是分组变量/因子,指示每个观察值所属的数据集。

我们可以使用ANOVA表或F比率来测试第二个更复杂的模型是否比简单模型更好地拟合数据。较简单的模型指出,两条线的斜率相同(b1个),但各行之间的偏移量为 b2

更复杂的模型包括线的斜率和分组变量之间的相互作用。如果此交互项的系数显着不同于零,或者ANOVA / F比率表明越复杂的模型对数据的拟合越好,那么我们必须拒绝零线假设,即两条线是平行的。

这是R中使用伪数据的示例。首先,斜率相等的数据:

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)

这使

> 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

表示我们未能拒绝此数据样本中等斜率的零假设。当然,我们想向自己保证,如果确实存在差异,我们将有足够的能力来检测差异,从而不会因为样本量太小而无法达到预期效果而导致错误地拒绝无效值。

现在具有不同的坡度。

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)

这使:

> 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

在这里,我们有充分的证据反对原假设,因此我们可以拒绝原假设,而选择替代(换句话说,我们拒绝两条线的斜率相等的假设)。

我拟合的两个模型中的交互作用项(b3XG)给出两组的斜率估计差。对于第一个模型,坡度差异的估算值很小(〜0.003)

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

和一个 Ť-test不能拒绝零斜率差为0的零假设:

> 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 

如果转到适合第二个数据集的模型,使两组的斜率不同,我们会看到两条线的斜率估计差约为1个单位。

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

组“ A”的斜率约为0.49(x在以上输出中),而要获得组“ B”的斜率,我们需要将差异斜率(通过交互作用项记住)添加到组“ A”的斜率; 〜0.49 +〜1 =〜1.49。这与1.5组“ B”的规定斜率非常接近。一个Ť对斜率差的-test也表明该差的估计值的界线为0:

> 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

非常感谢您的出色解释。我的目标是了解坡度是否相同或更少,所以我认为我将使用方差分析对其进行测试。
众议院

如果我有两个离散向量并且我想比较它们的斜率,但是我没有y(lm(x〜y),如何使用ANOVA?我尝试了anova(lm(x〜1),lm(y 〜1)),但我收到警告
停泊时间:

这里的向量是什么意思?在R意义上还是在数学意义上?这与您提出的问题非常不同,因此请提出一个新问题- 不要 编辑该问题- 无法在评论中进行如此广泛的跟进。
加文·辛普森,

不用等待,我必须将两个模型与方差分析进行比较...好,但是如果我用以下公式创建一个模型:x〜1和另一个模型与y〜1,我会得到警告。我在说R的意思。我能怎么做?
Dail

1
@Dail,如果您拟合了两个回归以获得两条斜率/直线,则两个数据集都有x和y数据。就像我在“答案”中说的那样,如果xs和ys在两个数据集中是可比较的,那么您只需合并所有数据添加分组变量即可。我的示例显示了如何使用伪数据执行此操作,但是您已经具有x和y数据,这是用于拟合单独回归的数据。
加文·辛普森

8

第一个问题实际上来自几何。如果您有两行表格:

ÿ=一个1个X+b1个
ÿ=一个2X+b2

那么它们是平行的,如果 一个1个=一个2。因此,如果斜率相等,则直线是平行的。

对于第二个问题,请使用以下事实: 棕褐色α=一个1个,在哪里 α 线与之形成的角度 X轴和 一个1个是线的斜率。所以

α=Arctan一个1个

并转换为度,记得 2π=360。因此,度数的答案将是

α=Arctan一个1个3602π

R函数 Arctan被称为atan

样本R代码:

> 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 

最后一行是度数。

更新。对于负斜率值,转换为度数应遵循不同的规则。请注意,由于我们假设该角度在x轴之上,因此与x轴的角度可以得到0到180的值。所以对于负值一个1个,公式为:

α=180-Arctan一个1个3602π

注意。虽然让我想起高中三角函数很有趣,但真正有用的答案是加文·辛普森(Gavin Simpson)给出的答案。由于回归线的斜率是随机变量,为了比较它们,应使用统计假设框架。


谢谢!如何从回归得到斜率?我必须获取系数并进行拦截吗?
众议院

线性回归是否可以通过某些函数直接返回度?
众议院

说degress = +45和degress = -315不是同一行吗?不在谈论同一条线吗?
Dail

1

...遵循@mpiktas的答案,以下是从lm对象提取坡度并应用上述公式的方法。

# 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 

非常感谢您提供的示例,在这种情况下,度数是-200?
众议院

是。如果您认为自己的问题已解决,请在@mpiktas的答案中打勾,作为正确的答案,谢谢。
RomanLuštrik2011年

@RomanLuštrik,您错过了分组表决 2π
mpiktas

1
@RomanLuštrik,我已修复代码并添加了正确的输出。随时删除更正。
mpiktas 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.