วิธีการคำนวณความแตกต่างของสองลาด?


12

มีวิธีการที่จะเข้าใจหรือไม่ว่าสองบรรทัดขนานกัน (มากหรือน้อย)? ฉันมีสองบรรทัดที่สร้างขึ้นจากการถดถอยเชิงเส้นและฉันต้องการที่จะเข้าใจว่าพวกมันขนานกันหรือไม่ กล่าวอีกนัยหนึ่งฉันต้องการได้ความแตกต่างของความลาดชันของสองบรรทัดนี้

มีฟังก์ชั่น R เพื่อคำนวณสิ่งนี้หรือไม่?

แก้ไข: ... และฉันจะได้ความชัน (เป็นองศา) ของเส้นการถดถอยเชิงเส้นได้อย่างไร

คำตอบ:


24

ฉันสงสัยว่าฉันขาดอะไรบางอย่างที่เห็นได้ชัด แต่คุณทำสถิตินี้ด้วย ANCOVA ไม่ได้เหรอ? ปัญหาที่สำคัญคือความลาดชันของการถดถอยทั้งสองครั้งนั้นมีข้อผิดพลาด มันเป็นค่าประมาณความลาดชันของประชากรในวงกว้าง หากข้อกังวลคือว่าเส้นถดถอยสองเส้นนั้นขนานกันหรือไม่ในประชากรก็ไม่สมเหตุสมผลที่จะเปรียบเทียบกับโดยตรงเพื่อให้ได้ความเท่าเทียมกันที่แน่นอน ทั้งคู่มีข้อผิดพลาด / ความไม่แน่นอนที่ต้องนำมาพิจารณาa1a2

ถ้าเราคิดถึงเรื่องนี้จากมุมมองทางสถิติและเราสามารถรวมข้อมูลในและสำหรับชุดข้อมูลทั้งสองด้วยวิธีที่มีความหมาย (เช่นและในทั้งสองชุดนั้นมาจากประชากรสองกลุ่มที่มีช่วงใกล้เคียงกันสำหรับทั้งสอง ตัวแปรมันเป็นเพียงความสัมพันธ์ระหว่างพวกเขาที่แตกต่างกันในสองประชากร) จากนั้นเราสามารถใส่สองโมเดลต่อไปนี้:xyxy

y^=b0+b1x+b2g

และ

y^=b0+b1x+b2g+b3xg

โดยที่เป็นค่าสัมประสิทธิ์ของแบบจำลองและคือการจัดกลุ่มตัวแปร / ปัจจัยซึ่งบ่งชี้ว่าชุดข้อมูลใดที่การสังเกตแต่ละครั้งเป็นของbig

เราสามารถใช้ตาราง ANOVA หรืออัตราส่วน F เพื่อทดสอบว่าแบบจำลองที่สองและซับซ้อนกว่านั้นเหมาะกับข้อมูลที่ดีกว่าแบบจำลองที่ง่ายกว่าหรือไม่ ง่ายรัฐรูปแบบที่ลาดของทั้งสองสายจะเหมือนกัน ( ) แต่เส้นจะถูกชดเชยจากอีกคนหนึ่งตามจำนวนเงินที่b_2b1b2

แบบจำลองที่ซับซ้อนยิ่งขึ้นรวมถึงการมีปฏิสัมพันธ์ระหว่างความชันของเส้นและตัวแปรการจัดกลุ่ม หากค่าสัมประสิทธิ์สำหรับคำนี้มีความแตกต่างอย่างมีนัยสำคัญจากศูนย์หรืออัตราส่วน ANOVA / F บ่งชี้ว่ารูปแบบที่ซับซ้อนมากขึ้นเหมาะกับข้อมูลที่ดีกว่าแล้วเราจะต้องปฏิเสธสมมติฐาน Null ว่าเส้นสองเส้นนั้นขนานกัน

นี่คือตัวอย่างใน 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

และ -test ในเรื่องนี้จะล้มเหลวในการปฏิเสธสมมติฐานว่างว่าความแตกต่างในความลาดชันนี้เป็น 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" เราจำเป็นต้องเพิ่มความแตกต่างของความลาดชัน ; ~ 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

ขอบคุณมากสำหรับคำอธิบายที่ดีมาก เป้าหมายของฉันคือเข้าใจว่า sloper น้อยกว่าหรือมากกว่าดังนั้นฉันคิดว่าฉันจะใช้ ANOVA เพื่อทดสอบ
Dail

ถ้าฉันมีเวกเตอร์ที่เบี่ยงเบนสองอันและฉันต้องการเปรียบเทียบเครื่องหมายกากบาทของพวกเขา แต่ฉันไม่มี y (lm (x ~ y) ฉันจะใช้ ANOVA ได้อย่างไรฉันลอง anova (lm (x ~ 1), lm (y ~ 1)) แต่ฉันได้รับคำเตือน
Dail

เวกเตอร์ที่นี่หมายถึงอะไร ในความหมาย R หรือความรู้สึกทางคณิตศาสตร์? นี่คือความแตกต่างจากคำถามที่คุณโพสต์จึงควรเริ่มคำถามใหม่ - ทำ ไม่ได้แก้ไขนี้ - มันเป็นไปไม่ได้ที่จะดำเนินการติดตามดังกล่าวในวงกว้างในลักษณะแสดงความคิดเห็น
Gavin Simpson

ไม่ต้องรอฉันต้องเปรียบเทียบสองรุ่นกับ ANOVA ... ตกลง แต่ถ้าฉันสร้างโมเดลด้วยสูตรนี้: x ~ 1 และอีกรุ่นหนึ่งกับ y ~ 1 ฉันได้รับคำเตือน ฉันกำลังพูดถึงในความรู้สึก R ฉันจะทำอย่างไร
Dail

1
@Dail หากคุณติดตั้งถดถอยสองครั้งเพื่อให้ได้สองลาด / เส้นคุณมีข้อมูล x และ y สำหรับชุดข้อมูลทั้งสอง ดังที่ฉันได้กล่าวไว้ในคำตอบของฉันหาก xs และ ys เปรียบได้ในชุดข้อมูลสองชุดคุณสามารถรวมข้อมูลทั้งหมดและเพิ่มตัวแปรการจัดกลุ่มได้ ตัวอย่างของฉันแสดงวิธีการทำสิ่งนี้โดยใช้ข้อมูลจำลอง แต่คุณมีข้อมูล x และ y อยู่แล้วมันเป็นข้อมูลที่คุณใช้เพื่อให้สอดคล้องกับการถดถอยแบบแยกต่างหาก
Gavin Simpson

8

คำถามแรกนั้นมาจากเรขาคณิต หากคุณมีสองบรรทัดของแบบฟอร์ม:

y=a1x+b1
y=a2x+b2

แล้วพวกเขาก็จะเป็นแนวขนานถ้าa_1ดังนั้นหากความลาดชันเท่ากันแล้วเส้นนั้นขนานกันa1=a2

สำหรับคำถามที่สองใช้ความจริงที่ว่าโดยที่คือมุมที่เส้นที่สร้างด้วย -axis และคือความชันของเส้น ดังนั้นtanα=a1αxa1

α=arctana1

และการแปลงให้เป็นองศาเรียกว่า2ดังนั้นคำตอบในองศาจะเป็น2π=360

α=arctana13602π.

ฟังก์ชั่นสำหรับ Rเรียกว่า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 

บรรทัดสุดท้ายคือดีกรี

ปรับปรุง สำหรับการแปลงค่าความชันเชิงลบเป็นองศาควรปฏิบัติตามกฎที่แตกต่างกัน โปรดทราบว่ามุมที่มีแกน x สามารถรับค่าได้ตั้งแต่ 0 ถึง 180 เนื่องจากเราสมมติว่ามุมนั้นอยู่เหนือแกน x ดังนั้นสำหรับค่าลบของสูตรคือ:a1

α=180arctana13602π.

บันทึก. ในขณะที่ฉันกำลังสนุกกับการจำตรีโกณมิติมัธยมคำตอบที่มีประโยชน์จริงๆคือคำตอบที่กาวินซิมป์สันให้ไว้ เนื่องจากความชันของเส้นถดถอยเป็นตัวแปรสุ่มดังนั้นจึงควรใช้กรอบสมมติฐานทางสถิติ


ขอบคุณ! วิธีรับความชันจากการถดถอย ฉันจะต้องได้รับค่าสัมประสิทธิ์และสกัดกั้น?
Dail

บางทีการถดถอยเชิงเส้นคืนค่าองศาโดยตรงกับฟังก์ชันบางฟังก์ชันใช่หรือไม่
Dail

บอกว่า 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
Dail

ใช่. หากคุณรู้สึกว่าปัญหาของคุณได้รับการแก้ไขให้ติ๊ก @mpiktas เป็นคำตอบที่ถูกต้องขอบคุณ
Roman Luštrik

@ RomanLuštrikคุณพลาดการหาร2π
mpiktas

1
@ RomanLuštrikฉันได้แก้ไขรหัสและเพิ่มผลลัพธ์ที่ถูกต้อง อย่าลังเลที่จะลบการแก้ไข
mpiktas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.