ฉันสามารถใช้การทดสอบใดในการเปรียบเทียบความชันจากแบบจำลองการถดถอยสองแบบขึ้นไป


29

ฉันต้องการทดสอบความแตกต่างในการตอบสนองของตัวแปรสองตัวต่อตัวทำนายหนึ่งตัว นี่คือตัวอย่างที่ทำซ้ำได้น้อยที่สุด

library(nlme) 
## gls is used in the application; lm would suffice for this example
m.set <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "setosa")
m.vir <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "virginica")
m.ver <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "versicolor")

ฉันเห็นได้ว่าสัมประสิทธิ์ความชันต่างกัน:

m.set$coefficients
(Intercept) Petal.Width 
  4.7771775   0.9301727
m.vir$coefficients
(Intercept) Petal.Width 
  5.2694172   0.6508306 
m.ver$coefficients
(Intercept) Petal.Width 
   4.044640    1.426365 

ฉันมีสามคำถาม:

  1. ฉันจะทดสอบความแตกต่างระหว่างความชันได้อย่างไร
  2. ฉันจะทดสอบความแตกต่างระหว่างผลต่างที่เหลือได้อย่างไร
  3. วิธีที่ง่ายและมีประสิทธิภาพในการนำเสนอการเปรียบเทียบเหล่านี้คืออะไร

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


ในเรื่องที่เกี่ยวกับคำถามแรกที่เห็นstats.stackexchange.com/questions/55501/...
russellpierce

คำตอบ:


22

ฉันจะทดสอบความแตกต่างระหว่างความชันได้อย่างไร

รวมถึงหุ่นจำลองสำหรับสปีชีส์ปล่อยให้มันมีปฏิสัมพันธ์กับและดูว่าหุ่นจำลองนี้มีความสำคัญหรือไม่ ให้เป็นความยาว sepal และเป็นความกว้างของคันเหยียบและเป็นตัวแปรจำลองสำหรับสามสปีชีส์ การเปรียบเทียบรูปแบบL i P i S 1 , S 2 , S 3PผมLผมPผมS1,S2,S3

E(Lผม)=β0+β1Pผม

ด้วยโมเดลที่อนุญาตให้เอฟเฟกต์ของแตกต่างกันไปในแต่ละสปีชีส์:Pผม

E(Lผม)=α0+α1S2+α2S3+α4Pผม+α5PผมS2+α6PผมS3

ตัวประมาณ GLS เป็น MLEs และโมเดลแรกเป็นแบบจำลองย่อยในวินาทีดังนั้นคุณสามารถใช้การทดสอบอัตราส่วนความน่าจะเป็นที่นี่ ความน่าจะเป็นสามารถดึงออกมาได้โดยใช้logLikฟังก์ชั่นและระดับความอิสระสำหรับการทดสอบจะเท่ากับเนื่องจากคุณได้ลบพารามิเตอร์เพื่อให้ถึงแบบจำลองย่อย444

วิธีที่ง่ายและมีประสิทธิภาพในการนำเสนอการเปรียบเทียบคืออะไร

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

แก้ไข:ฉันสังเกตเห็นว่ามีการเพิ่มคำถามอื่นเข้าไปในร่างกาย ดังนั้นฉันกำลังเพิ่มคำตอบไปที่:

ฉันจะทดสอบความแตกต่างระหว่างผลต่างที่เหลือได้อย่างไร

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

  • ถ้าคุณเพียงต้องการที่จะทดสอบความแปรปรวนขณะที่ออกจากผลกระทบหลักในแล้ว "null" รูปแบบที่ควรจะเป็นรุ่นที่มีการโต้ตอบที่ผมเคยเขียนไว้ข้างต้น องศาของเสรีภาพสำหรับการทดสอบแล้ว22

  • หากคุณต้องการทดสอบความแปรปรวนร่วมกับสัมประสิทธิ์โมเดลแบบโมฆะควรเป็นโมเดลแรกที่ฉันเขียนไว้ด้านบน องศาของเสรีภาพสำหรับการทดสอบแล้ว66


เหตุใดจึงไม่มีในรุ่นที่สอง คือการดำเนินการที่ถูกต้องของรูปแบบใน R? S1gls(Sepal.Length ~ species:Petal.Width, data = iris)
Abe

S1α0+α4Pผมspeciesgls(Sepal.Length ~ species*Petal.Width, data=iris)

@Macro คำตอบที่ดี (+1)! ฉันสงสัยว่าคุณสามารถปรับglsโมเดลได้หรือไม่ แต่ยอมให้มีความแปรปรวนที่เหลือต่างกันสำหรับแต่ละสปีชีส์ด้วยตัวเลือกweights=varIdent(form=~1|Species)(เกี่ยวกับคำถามที่สอง)?
COOLSerdash

15

ในการตอบคำถามเหล่านี้ด้วยรหัส R ให้ใช้ดังต่อไปนี้:
1. ฉันจะทดสอบความแตกต่างระหว่างความชันได้อย่างไร
คำตอบ: ตรวจสอบ ANOVA p-value จากปฏิกิริยาของ Petal.Width โดย Species แล้วเปรียบเทียบความลาดชันโดยใช้ lsmeans :: lstrends ดังนี้

library(lsmeans)
m.interaction <- lm(Sepal.Length ~ Petal.Width*Species, data = iris)
anova(m.interaction)
 Analysis of Variance Table

 Response: Sepal.Length
                      Df Sum Sq Mean Sq  F value Pr(>F)    
 Petal.Width           1 68.353  68.353 298.0784 <2e-16 ***
 Species               2  0.035   0.017   0.0754 0.9274    
 Petal.Width:Species   2  0.759   0.380   1.6552 0.1947    
 Residuals           144 33.021   0.229                    
 ---
 Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

# Obtain slopes
m.interaction$coefficients
m.lst <- lstrends(m.interaction, "Species", var="Petal.Width")
 Species    Petal.Width.trend        SE  df   lower.CL upper.CL
 setosa             0.9301727 0.6491360 144 -0.3528933 2.213239
 versicolor         1.4263647 0.3459350 144  0.7425981 2.110131
 virginica          0.6508306 0.2490791 144  0.1585071 1.143154

# Compare slopes
pairs(m.lst)
 contrast                 estimate        SE  df t.ratio p.value
 setosa - versicolor    -0.4961919 0.7355601 144  -0.675  0.7786
 setosa - virginica      0.2793421 0.6952826 144   0.402  0.9149
 versicolor - virginica  0.7755341 0.4262762 144   1.819  0.1669

2. ฉันจะทดสอบความแตกต่างระหว่างผลต่างที่เหลือได้อย่างไร
ถ้าฉันเข้าใจคำถามคุณสามารถเปรียบเทียบความสัมพันธ์ของเพียร์สันกับการแปลงของฟิชเชอร์หรือที่เรียกว่า "ฟิชเชอร์ส r-to-z" ดังนี้

library(psych)
library(data.table)
iris <- as.data.table(iris)
# Calculate Pearson's R
m.correlations <- iris[, cor(Sepal.Length, Petal.Width), by = Species]
m.correlations
# Compare R values with Fisher's R to Z
paired.r(m.correlations[Species=="setosa", V1], m.correlations[Species=="versicolor", V1], 
         n = iris[Species %in% c("setosa", "versicolor"), .N])
paired.r(m.correlations[Species=="setosa", V1], m.correlations[Species=="virginica", V1], 
         n = iris[Species %in% c("setosa", "virginica"), .N])
paired.r(m.correlations[Species=="virginica", V1], m.correlations[Species=="versicolor", V1], 
         n = iris[Species %in% c("virginica", "versicolor"), .N])

3. วิธีที่ง่ายและมีประสิทธิภาพในการนำเสนอการเปรียบเทียบเหล่านี้คืออะไร?
"เราใช้การถดถอยเชิงเส้นเพื่อเปรียบเทียบความสัมพันธ์ของความยาวของ Sepal กับความกว้างของกลีบดอกไม้สำหรับแต่ละสายพันธุ์เราไม่พบปฏิสัมพันธ์ที่สำคัญในความสัมพันธ์ของความยาวของ Sepal กับความกว้างของกลีบสำหรับI. Setosa (B = 0.9), I. Versicolor (B = 1.4) หรือI. Virginica (B = 0.6); F (2, 144) = 1.6, p = 0.19 การเปรียบเทียบ r-to-z ของ Fisher แสดงให้เห็นว่าความสัมพันธ์ของ Pearson สำหรับI. Setosa (r = 0.28) คือ อย่างมีนัยสำคัญต่ำกว่า (p = 0.02) มากกว่าI. Versicolor (r = 0.55) ในทำนองเดียวกันความสัมพันธ์สำหรับI. Virginica (r = 0.28) อ่อนแอลงอย่างมีนัยสำคัญ (p = 0.02) กว่าที่สังเกตสำหรับI. Versicolorอย่างมีนัยสำคัญ."

สุดท้ายให้นึกภาพผลลัพธ์ของคุณเสมอ!

plotly_interaction <- function(data, x, y, category, colors = col2rgb(viridis(nlevels(as.factor(data[[category]])))), ...) {
  # Create Plotly scatter plot of x vs y, with separate lines for each level of the categorical variable. 
  # In other words, create an interaction scatter plot.
  # The "colors" must be supplied in a RGB triplet, as produced by col2rgb().

  require(plotly)
  require(viridis)
  require(broom)

  groups <- unique(data[[category]])

  p <- plot_ly(...)

  for (i in 1:length(groups)) {
    groupData = data[which(data[[category]]==groups[[i]]), ]
    p <- add_lines(p, data = groupData,
                   y = fitted(lm(data = groupData, groupData[[y]] ~ groupData[[x]])),
                   x = groupData[[x]],
                   line = list(color = paste('rgb', '(', paste(colors[, i], collapse = ", "), ')')),
                   name = groups[[i]],
                   showlegend = FALSE)
    p <- add_ribbons(p, data = augment(lm(data = groupData, groupData[[y]] ~ groupData[[x]])),
                     y = groupData[[y]],
                     x = groupData[[x]],
                     ymin = ~.fitted - 1.96 * .se.fit,
                     ymax = ~.fitted + 1.96 * .se.fit,
                     line = list(color = paste('rgba','(', paste(colors[, i], collapse = ", "), ', 0.05)')), 
                     fillcolor = paste('rgba', '(', paste(colors[, i], collapse = ", "), ', 0.1)'),
                     showlegend = FALSE)
    p <- add_markers(p, data = groupData, 
                     x = groupData[[x]], 
                     y = groupData[[y]],
                     symbol = groupData[[category]],
                     marker = list(color=paste('rgb','(', paste(colors[, i], collapse = ", "))))
  }
  p <- layout(p, xaxis = list(title = x), yaxis = list(title = y))
  return(p)
}

plotly_interaction(iris, "Sepal.Length", "Petal.Width", "Species")

irisPlot


8

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


ดูเหมือนว่าเราโพสต์คำตอบที่ค่อนข้างคล้ายกันเกือบจะในเวลาเดียวกัน +1
มาโคร

@Macro ใช่ แต่ส่วนใหญ่ของคุณดีกว่า (+1 ก่อนหน้า); คุณตอบคำถามทั้ง 3 ข้อซึ่งฉันพลาดในการอ่านคำถามแรก (ไม่ละเอียด) การมีส่วนร่วมของฉันที่นี่เป็นส่วนหนึ่งของการทำให้สับสน
gung - Reinstate Monica

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

3
จากวิธีคิดของฉันคุณควรได้รับ upvotes ซึ่งเป็นสิ่งที่ฉันทำ
Michael R. Chernick

1
ข้อเสนอแนะตัวแปรดัมมี่เป็นสิ่งที่ดีหากความแปรปรวนของข้อผิดพลาดไม่แตกต่างกันอย่างเห็นได้ชัดในโมเดล มิฉะนั้นคุณสามารถใช้ Satterthwaite-Welch t-test (ซึ่งมีข้อได้เปรียบเอกพจน์ของการมีอยู่เมื่อทราบสถิติสรุปเท่านั้นซึ่งมักจะเป็นกรณีเมื่ออ่านเอกสารที่ตีพิมพ์) หรือใช้กำลังสองน้อยที่สุดเพื่อให้พอดีกับรูปแบบที่รวมกัน
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.