Як обчислити різницю двох схилів?


12

Чи існує метод зрозуміти, чи дві лінії (більш-менш) паралельні? У мене є два рядки, породжені лінійними регресіями, і я хотів би зрозуміти, чи вони паралельні. Іншими словами, я хотів би отримати різні схили цих двох ліній.

Чи існує функція R для її обчислення?

EDIT: ... і як я можу отримати нахил (у градусах) лінійної регресійної лінії?

Відповіді:


24

Цікаво, чи я пропускаю щось очевидне, але чи не могли ви це зробити статистично, використовуючи ANCOVA? Важливим питанням є те , що схили в двох регресій оцінюються з помилкою. Вони є оцінками схилів у цілому популяції. Якщо занепокоєння , чи є дві лінії регресії паралельна чи ні в популяції , то це не має сенсу порівнювати а1 з а2 безпосередньо для точної еквівалентності; обидва вони підлягають помилкам / невизначеності, які потрібно враховувати.

Якщо ми думаємо про це зі статистичної точки зору, і ми можемо об'єднати дані на і для обох наборів даних якимось значущим чином (тобто і в обох наборах виведені з двох груп із однаковими діапазонами для двох змінні - це лише відношення між ними, які відрізняються у двох групах), то ми можемо помістити наступні дві моделі:хуху

у^=б0+б1х+б2г

і

у^=б0+б1х+б2г+б3хг

Де - модельні коефіцієнти, а - змінна / коефіцієнт групування, що вказує, до якого набору даних належить кожне спостереження.бiг

Ми можемо використовувати таблицю ANOVA або коефіцієнт F, щоб перевірити, чи відповідає друга, більш складна модель краще, ніж простіша модель. Простіша модель стверджує, що нахили двох ліній однакові ( ), але лінії зміщені одна від одної на величину .б1б2

Більш складна модель включає взаємодію між нахилом лінії та групувальною змінною. Якщо коефіцієнт для цього терміну взаємодії суттєво відрізняється від нуля або співвідношення 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)б3хг

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

і тест з цього приводу не зможе відкинути нульову гіпотезу, що ця різниця укосів дорівнює 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 

Нахил для групи "А" становить ~ 0,49 ( xу наведеному вище висновку), тоді як для отримання нахилу для групи "В" нам потрібно додати різницькі схили (задати терміном взаємодії запам'ятати) до схилу групи "А" ; ~ 0,49 + ~ 1 = ~ 1,49. Це досить близько до заявленого схилу для групи "В" 1,5. -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

дуже дякую за це дуже гарне пояснення. Моя мета - зрозуміти, чи схил менше чи більше однаковий, тому я думаю, що я буду використовувати ANOVA для його тестування.
Dail

якщо у мене два вектори дистрибутива, і я хотів би порівняти їх нахили, але у мене немає y (lm (x ~ y), як я можу використовувати ANOVA? Я спробував anova (lm (x ~ 1), lm (y ~ 1)) але я отримую попередження
Dail

Що ви маєте на увазі під векторами тут? У сенсі R чи математичному сенсі? Це дуже відрізняється від питання поставлених вами, тому , будь ласка , почати нове питання - нічого НЕ змінити цю - не можна проводити простеження таких широкої природи в коментарях.
Гевін Сімпсон

не чекайте, я повинен порівняти дві моделі з ANOVA ... нормально, але якщо я створю модель з такою формулою: x ~ 1 та іншу модель з y ~ 1, я отримую попередження. Я говорю в сенсі R. Як я можу зробити?
Dail

1
@Dail, якщо ви встановили дві регресії для отримання двох схилів / ліній, у вас є дані x і y для обох наборів даних. Як я вже говорив у своєму відповіді, якщо xs та ys порівнянні у двох наборах даних, ви можете просто об'єднати всі дані та додати змінну групування. Мій приклад показує, як це зробити за допомогою фіктивних даних, але ви вже маєте дані x і y, це дані, які ви використовували, щоб відповідати окремим регресіям.
Гевін Сімпсон

8

Перше питання насправді з геометрії. Якщо у вас є два рядки форми:

у=а1х+б1
у=а2х+б2

то вони паралельні, якщо . Отже, якщо нахили рівні, то лінії паралельні.а1=а2

Для другого питання скористайтеся тим фактом, що , де - кут, який лінія робить за допомогою -axis, а - нахил лінії. Томузасмагаα=а1αха1

α=арктана1

і перетворити в градуси, згадаймо, що . Тож відповідь у градусах буде2π=360

α=арктана13602π.

Функція 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 може отримати значення від 0 до 180, оскільки вважаємо, що кут вище осі x. Отже, для від’ємних значень формула така:а1

α=180-арктана13602π.

Примітка. Хоча мені було весело згадати середньошкільну тригонометрію, справді корисною відповіддю є відповідь, яку дав Гевін Сімпсон. Оскільки нахили регресійних ліній є випадковими змінними, для їх порівняння слід використовувати рамки статистичної гіпотези.


Дякую тобі! як отримати нахил від регресії? мені потрібно отримати коефіцієнт і перехопити?
Dail

можливо, лінійна регресія повертає градуси безпосередньо за допомогою якоїсь функції?
Dail

кажучи degress = +45 та degress = -315 - це не той самий рядок? whare не говорять про одну лінію?
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?
Dail

Так. Якщо ви вважаєте, що ваше питання вирішено, позначте відповідь @mpiktas як правильну, дякую.
Роман Луштрик

@ RomanLuštrik, ти пропустив поділ за адресою 2π
mpiktas

1
@ RomanLuštrik, я виправив код і додав правильний вихід. Ви можете зняти виправлення.
mpiktas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.