Как рассчитать разницу двух склонов?

11

Есть ли способ понять, если две линии (более или менее) параллельны? У меня есть две линии, сгенерированные из линейных регрессий, и я хотел бы понять, параллельны ли они. Другими словами, я хотел бы получить разные наклоны этих двух линий.

Есть ли функция R для расчета этого?

РЕДАКТИРОВАТЬ: ... и как я могу получить наклон (в градусах) линии линейной регрессии?

нижняя палата парламента Ирландии
источник

Ответы:

23

Интересно, я что-то упускаю из виду, но не могли бы вы сделать это статистически, используя ANCOVA? Важной проблемой является то, что наклоны в двух регрессиях оцениваются с ошибкой. Они являются оценками склонов в населении в целом. Если проблема заключается в том, являются ли две линии регрессии параллельными или нет в популяции, то нет смысла сравнивать с напрямую для точной эквивалентности; они оба подвержены ошибкам / неопределенности, которые необходимо учитывать.2a1a2

Если мы думаем об этом со статистической точки зрения, и мы можем каким-то осмысленным образом объединить данные по и для обоих наборов данных (т. Е. и в обоих наборах взяты из двух групп населения с одинаковыми диапазонами для двух Переменные это просто отношения между ними, которые различаются в двух популяциях), тогда мы можем подогнать следующие две модели:у х уxyxy

y^=b0+b1x+b2g

а также

y^=b0+b1x+b2g+b3xg

Где - коэффициенты модели, а - переменная / коэффициент группировки, указывающая, к какому набору данных относится каждое наблюдение. гbig

Мы можем использовать таблицу ANOVA или F-коэффициент, чтобы проверить, соответствует ли вторая, более сложная модель данным лучше, чем более простая модель. Более простая модель утверждает, что наклоны двух линий одинаковы ( ), но линии смещены относительно друг друга на величину .б 2b1b2

Более сложная модель включает взаимодействие между уклоном линии и переменной группировки. Если коэффициент для этого члена взаимодействия значительно отличается от нуля или отношение 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)b3xg

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

и тест по этому не сможет отвергнуть нулевую гипотезу, что эта разница в наклонах равна 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 

Если мы обратимся к модели, подобранной ко второму набору данных, где мы сделали различия для уклонов для двух групп, мы увидим, что оценочная разница в наклонах двух линий составляет ~ 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. Это довольно близко к заявленному уклону для группы "B" 1,5. -test на этой разнице склонов также указывает , что оценка разности отделена от 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
Гэвин Симпсон
источник
Большое спасибо за это очень хорошее объяснение. Моя цель состоит в том, чтобы понять, являются ли слоперы более или менее одинаковыми, поэтому я думаю, что я буду использовать ANOVA для тестирования.
Dail
если у меня есть два вектора расстояния, и я хотел бы сравнить их наклоны, но у меня нет y (lm (x ~ y), как я могу использовать ANOVA? Я попробовал anova (lm (x ~ 1), lm (y) ~ 1)) но я получаю предупреждение
Dail
Что вы подразумеваете под векторами здесь? В смысле R или математическом смысле? Это очень отличается от вопроса поставленных вами, поэтому , пожалуйста , начать новый вопрос - ничего не изменить эту - нельзя проводить прослеживание таких широкой природы в комментариях.
Гэвин Симпсон
нет ожидания, я должен сравнить две модели с ANOVA ... хорошо, но если я создам модель с этой формулой: x ~ 1 и другую модель с y ~ 1, я получаю предупреждение. Я говорю о смысле R. Как я могу сделать?
Дейл
1
@Dail, если вы установили две регрессии для получения двух уклонов / линий, у вас есть данные x и y для обоих наборов данных. Как я сказал в своем ответе, если xs и ys сопоставимы в двух наборах данных, то вы можете просто объединить все данные и добавить переменную группировки. Мой пример показывает, как это сделать, используя фиктивные данные, но у вас уже есть данные x и y, это те данные, которые вы использовали для соответствия отдельным регрессиям.
Гэвин Симпсон
8

Первый вопрос на самом деле от геометрии. Если у вас есть две строки формы:

y=a1x+b1
y=a2x+b2

a1=a2

tanα=a1αxa1

α=arctana1

2π=360

α=arctana13602π.

arctanatan

Пример кода 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 

Последняя строка - градусы.

a1

α=180arctana13602π.

Запись. Хотя мне было приятно вспомнить тригонометрию средней школы, по-настоящему полезным является ответ Гевина Симпсона. Поскольку наклоны линий регрессии являются случайными величинами, для их сравнения следует использовать статистическую гипотезу.

mpiktas
источник
благодарю вас! как получить уклон от регрессии? я должен получить коэффициент и перехват?
Dail
может быть, линейная регрессия возвращает градусы напрямую с помощью какой-либо функции?
Дейл
говоря, что degress = +45 и degress = -315 не совпадают? о чем идет речь не об одной линии?
Дейл
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 как правильный, спасибо.
Роман Луштрик
2π
1
@ RomanLuštrik, я исправил код и добавил правильный вывод. Не стесняйтесь удалить исправление.
mpiktas