Làm thế nào để tính toán sự khác biệt của hai độ dốc?


11

Có một phương pháp để hiểu nếu hai dòng là (nhiều hay ít) song song? Tôi có hai dòng được tạo từ hồi quy tuyến tính và tôi muốn hiểu nếu chúng là song song. Nói cách khác, tôi muốn có sự khác biệt về độ dốc của hai đường đó.

Có một hàm R để tính toán điều này?

EDIT: ... và làm thế nào tôi có thể có độ dốc (tính bằng độ) của đường hồi quy tuyến tính?

Câu trả lời:


23

Tôi tự hỏi nếu tôi thiếu một cái gì đó rõ ràng, nhưng bạn không thể làm điều này một cách thống kê bằng ANCOVA? Một vấn đề quan trọng là độ dốc trong hai hồi quy được ước tính lỗi. Chúng là ước tính của các sườn trong quần thể lớn. Nếu mối quan tâm là liệu hai dòng hồi quy là song song hay không trong dân số thì nó không có ý nghĩa để so sánh với trực tiếp cho tương đương chính xác; cả hai đều có lỗi / không chắc chắn cần phải được tính đến.a 2a1a2

Nếu chúng ta nghĩ về điều này theo quan điểm thống kê và chúng ta có thể kết hợp dữ liệu trên và cho cả hai tập dữ liệu theo một cách có ý nghĩa (nghĩa là và trong cả hai tập hợp được rút ra từ hai quần thể có phạm vi tương tự cho hai tập hợp các biến đó chỉ là mối quan hệ giữa chúng khác nhau trong hai quần thể), sau đó chúng ta có thể phù hợp với hai mô hình sau:y x yxyxy

y^=b0+b1x+b2g

y^=b0+b1x+b2g+b3xg

Trong đó là các hệ số mô hình và g là biến / yếu tố nhóm, cho biết tập dữ liệu nào mà mỗi quan sát thuộc về.big

Chúng ta có thể sử dụng bảng ANOVA hoặc tỷ lệ F để kiểm tra xem mô hình thứ hai phức tạp hơn có phù hợp với dữ liệu hơn mô hình đơn giản hơn không. Mô hình đơn giản hơn nói rằng độ dốc của hai đường thẳng là ( ) nhưng các đường được bù với nhau bằng một lượng b 2 .b1b2

Mô hình phức tạp hơn bao gồm sự tương tác giữa độ dốc của đường và biến nhóm. Nếu hệ số cho thuật ngữ tương tác này khác đáng kể so với 0 hoặc tỷ lệ ANOVA / F chỉ ra mô hình phức tạp hơn phù hợp với dữ liệu hơn thì chúng ta phải loại bỏ giả thuyết Null rằng hai đường thẳng song song.

Dưới đây là một ví dụ trong R sử dụng dữ liệu giả. Đầu tiên, dữ liệu có độ dốc bằng nhau:

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)

Mà cho

> 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

Chỉ ra rằng chúng ta không bác bỏ giả thuyết khống về độ dốc bằng nhau trong mẫu dữ liệu này. Tất nhiên, chúng tôi muốn đảm bảo với bản thân rằng chúng tôi có đủ sức mạnh để phát hiện sự khác biệt nếu thực sự có một điều đó để chúng tôi không dẫn đến thất bại trong việc từ chối null vì kích thước mẫu của chúng tôi quá nhỏ so với hiệu quả mong đợi.

Bây giờ với các độ dốc khác nhau.

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)

Cung cấp cho:

> 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

Ở đây chúng tôi có bằng chứng đáng kể chống lại giả thuyết null và do đó chúng tôi có thể từ chối nó theo hướng thay thế (nói cách khác, chúng tôi bác bỏ giả thuyết rằng độ dốc của hai đường bằng nhau).

b3xg

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

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 

Nếu chúng ta chuyển sang mô hình phù hợp với tập dữ liệu thứ hai, ở đó chúng ta tạo độ dốc cho hai nhóm khác nhau, chúng ta sẽ thấy rằng sự khác biệt ước tính về độ dốc của hai đường là ~ 1 đơn vị.

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

xt

> 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

cảm ơn bạn rất nhiều vì lời giải thích rất tốt này Mục tiêu của tôi là để hiểu nếu sloper ít hoặc nhiều giống nhau vì vậy tôi nghĩ rằng tôi sẽ sử dụng ANOVA để kiểm tra nó.
Tweets

Nếu tôi có hai vectơ distint và tôi muốn so sánh các slops của chúng nhưng tôi không có y (lm (x ~ y), làm thế nào tôi có thể sử dụng ANOVA? Tôi đã thử anova (lm (x ~ 1), lm (y ~ 1)) nhưng tôi nhận được cảnh báo
Tweets

Bạn có ý nghĩa gì bởi các vectơ ở đây? Theo nghĩa R hay nghĩa toán học? Đây là rất khác so với các câu hỏi mà bạn đặt ra, vì vậy hãy bắt đầu một câu hỏi mới - làm không chỉnh sửa một này - đó là không thể tiến hành theo-up của rộng như vậy có tính chất trong ý kiến.
Gavin Simpson

không chờ đợi, tôi phải so sánh hai mô hình với ANOVA ... ok, nhưng nếu tôi tạo một mô hình với công thức này: x ~ 1 và một mô hình khác với y ~ 1 tôi nhận được cảnh báo. Tôi đang nói về nghĩa R. Làm thế nào tôi có thể làm được?
Tweets

1
@Dail nếu bạn đã trang bị hai hồi quy để có hai độ dốc / đường, bạn có dữ liệu x và y cho cả hai tập dữ liệu. Như tôi đã nói trong Câu trả lời của mình, nếu xs và ys có thể so sánh được trong hai tập dữ liệu, thì bạn chỉ cần kết hợp tất cả dữ liệu thêm một biến nhóm. Ví dụ của tôi cho thấy cách thực hiện việc này bằng dữ liệu giả, nhưng bạn đã có dữ liệu x và y, đó là dữ liệu bạn đã sử dụng để phù hợp với các hồi quy riêng biệt.
Gavin Simpson

8

Câu hỏi đầu tiên thực sự là từ hình học. Nếu bạn có hai dòng của mẫu:

y=a1x+b1
y=a2x+b2

a1=a2

tanα=a1αxa1 là độ dốc của đường. Vì thế

α=arctana1

2π=360

α=arctana13602π.

Hàm R cho arctanatan

Mã R mẫu:

> 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 

Dòng cuối cùng là độ.

a1 , công thức là:

α=180arctana13602π.

Ghi chú. Mặc dù thật vui khi tôi nhớ lại lượng giác của trường trung học, nhưng câu trả lời thực sự hữu ích là câu trả lời của Gavin Simpson. Do độ dốc của các đường hồi quy là các biến ngẫu nhiên, nên so sánh chúng với khung giả thuyết thống kê nên được sử dụng.


cảm ơn bạn! Làm thế nào để có được độ dốc từ hồi quy? Tôi có phải lấy hệ số và đánh chặn không?
Tweets

có thể hồi quy tuyến tính trả về độ trực tiếp với một số chức năng?
Tweets

nói suy thoái = +45 và suy thoái = -315 không phải là cùng một dòng? Ai không nói về cùng một dòng?
Tweets

1

... theo dõi câu trả lời của @mpiktas, đây là cách bạn trích xuất độ dốc từ một lmđối tượng và áp dụng công thức trên.

# 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 

cảm ơn bạn rất nhiều vì ví dụ, trong trường hợp này độ là -200?
Tweets

Đúng. Nếu bạn cảm thấy vấn đề của mình đã được giải quyết, hãy đánh dấu vào câu trả lời của @mpiktas là chính xác, cảm ơn.
Roman Luštrik

2π

1
@ RomanLuštrik, tôi đã sửa mã và thêm đầu ra chính xác. Hãy gỡ bỏ sự điều chỉnh.
mpiktas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.