Answers:
我想知道我是否缺少明显的东西,但是您不能使用ANCOVA进行统计吗?一个重要的问题是两个回归的斜率估计有误差。它们是对总体人口坡度的估计。如果关注的是总体中两条回归线是否平行,那么进行比较是没有意义的 与 直接进行精确对等;它们都受到错误/不确定性的影响,需要加以考虑。
如果我们从统计角度考虑这一点,我们可以将 和 以某种有意义的方式(即 和 这两个集合中的两个都是从两个变量具有相似范围的两个总体中得出的,只是两个变量中它们之间的关系是不同的),那么我们可以拟合以下两个模型:
和
哪里 是模型系数,并且 是分组变量/因子,指示每个观察值所属的数据集。
我们可以使用ANOVA表或F比率来测试第二个更复杂的模型是否比简单模型更好地拟合数据。较简单的模型指出,两条线的斜率相同(),但各行之间的偏移量为 。
更复杂的模型包括线的斜率和分组变量之间的相互作用。如果此交互项的系数显着不同于零,或者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
在这里,我们有充分的证据反对原假设,因此我们可以拒绝原假设,而选择替代(换句话说,我们拒绝两条线的斜率相等的假设)。
我拟合的两个模型中的交互作用项()给出两组的斜率估计差。对于第一个模型,坡度差异的估算值很小(〜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
第一个问题实际上来自几何。如果您有两行表格:
那么它们是平行的,如果 。因此,如果斜率相等,则直线是平行的。
对于第二个问题,请使用以下事实: ,在哪里 线与之形成的角度 轴和 是线的斜率。所以
并转换为度,记得 。因此,度数的答案将是
R函数 被称为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的值。所以对于负值,公式为:
注意。虽然让我想起高中三角函数很有趣,但真正有用的答案是加文·辛普森(Gavin Simpson)给出的答案。由于回归线的斜率是随机变量,为了比较它们,应使用统计假设框架。
...遵循@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