Tôi có thể sử dụng thử nghiệm nào để so sánh độ dốc từ hai hoặc nhiều mô hình hồi quy?


29

Tôi muốn kiểm tra sự khác biệt trong phản ứng của hai biến với một yếu tố dự đoán. Dưới đây là một ví dụ tái sản xuất tối thiểu.

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")

Tôi có thể thấy rằng các hệ số độ dốc là khác nhau:

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 

Tôi có ba câu hỏi:

  1. Làm thế nào tôi có thể kiểm tra sự khác biệt giữa các độ dốc?
  2. Làm thế nào tôi có thể kiểm tra sự khác biệt giữa phương sai dư?
  3. Một cách đơn giản, hiệu quả để trình bày những so sánh này là gì?

Một câu hỏi liên quan, Phương pháp so sánh hệ số biến trong hai mô hình hồi quy , gợi ý chạy lại mô hình với biến giả để phân biệt các sườn, có các tùy chọn nào cho phép sử dụng các tập dữ liệu độc lập không?


Liên quan đến câu hỏi đầu tiên, xem stats.stackexchange.com/questions/55501/ .
russellpierce

Câu trả lời:


22

Làm thế nào tôi có thể kiểm tra sự khác biệt giữa các độ dốc?

Bao gồm một hình nộm cho các loài, để nó tương tác với và xem hình nộm này có ý nghĩa hay không. Đặt là chiều dài sepal và là chiều rộng bàn đạp và là các biến giả cho ba loài. So sánh mô hìnhL i P i S 1 , S 2 , S 3PtôiLtôiPtôiS1,S2,S3

E(Ltôi)= =β0+β1Ptôi

với mô hình cho phép hiệu ứng của khác nhau đối với từng loài:Ptôi

E(Ltôi)= =α0+α1S2+α2S3+α4Ptôi+α5PtôiS2+α6PtôiS3

Các công cụ ước tính GLS là MLE và mô hình đầu tiên là mô hình con trên mô hình thứ hai, vì vậy bạn có thể sử dụng thử nghiệm tỷ lệ khả năng ở đây. Khả năng có thể được trích xuất bằng cách sử dụng logLikhàm và mức độ tự do cho thử nghiệm sẽ là do bạn đã xóa tham số để đến mô hình con.444

Một cách đơn giản, hiệu quả để trình bày so sánh là gì?

Tôi nghĩ rằng cách hấp dẫn nhất sẽ là vẽ các đường hồi quy cho từng loài trên cùng một trục, có thể với các thanh lỗi dựa trên các lỗi tiêu chuẩn. Điều này sẽ làm cho sự khác biệt (hoặc không khác biệt) giữa các loài và mối quan hệ của chúng với rất rõ ràng.Ptôi

Chỉnh sửa: Tôi nhận thấy một câu hỏi khác đã được thêm vào cơ thể. Vì vậy, tôi đang thêm một câu trả lời cho điều đó:

Làm thế nào tôi có thể kiểm tra sự khác biệt giữa phương sai dư?

Đối với điều này, bạn sẽ cần phân tầng tập dữ liệu và phù hợp với các mô hình riêng biệt vì mô hình dựa trên tương tác mà tôi đề xuất sẽ hạn chế phương sai còn lại giống nhau trong mỗi nhóm. Nếu bạn phù hợp với các mô hình riêng biệt, ràng buộc này sẽ biến mất. Trong trường hợp đó, bạn vẫn có thể sử dụng thử nghiệm tỷ lệ khả năng (khả năng cho mô hình lớn hơn hiện được tính bằng cách tính tổng khả năng từ ba mô hình riêng biệt). Mô hình "null" phụ thuộc vào những gì bạn muốn so sánh nó với

  • nếu bạn chỉ muốn kiểm tra phương sai, trong khi để lại các hiệu ứng chính, thì mô hình "null" sẽ là mô hình với các tương tác tôi đã viết ở trên. Mức độ tự do cho bài kiểm tra là .2

  • Nếu bạn muốn kiểm tra phương sai cùng với các hệ số, thì mô hình null sẽ là mô hình đầu tiên tôi đã viết ở trên. Mức độ tự do cho bài kiểm tra là .6


S1gls(Sepal.Length ~ species:Petal.Width, data = iris)

S1α0+α4Ptôispeciesgls(Sepal.Length ~ species*Petal.Width, data=iris)

@Macro Câu trả lời hay (+1)! Tôi tự hỏi liệu bạn có thể phù hợp với glsmô hình không nhưng cho phép các phương sai còn lại khác nhau cho mỗi Loài với tùy chọn weights=varIdent(form=~1|Species)(liên quan đến câu hỏi thứ hai)?
COOLSerdash

15

Để trả lời những câu hỏi này bằng mã R, hãy sử dụng như sau:
1. Làm thế nào tôi có thể kiểm tra sự khác biệt giữa các độ dốc?
Trả lời: Kiểm tra giá trị p ANOVA từ sự tương tác của Petal.Width theo Loài, sau đó so sánh các sườn bằng lsmeans :: lstrends, như sau.

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. Làm thế nào tôi có thể kiểm tra sự khác biệt giữa phương sai dư?
Nếu tôi hiểu câu hỏi, bạn có thể so sánh tương quan Pearson với biến đổi Fisher, còn được gọi là "Fisher's r-to-z", như sau.

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. Cách đơn giản, hiệu quả để trình bày những so sánh này là gì?
"Chúng tôi đã sử dụng hồi quy tuyến tính để so sánh mối quan hệ của Độ dài Sepal với Chiều rộng cánh hoa cho từng loài. Chúng tôi không tìm thấy sự tương tác đáng kể trong các mối quan hệ của Độ dài Sepal với Chiều rộng cánh hoa cho I. Setosa (B = 0.9), I. Vers màu (B = 1,4), cũng không phải I. Virginica (B = 0,6); F (2, 144) = 1,6, p = 0,19. So sánh r-to-z của Fisher chỉ ra rằng tương quan Pearson cho I. Setosa (r = 0,28) thấp hơn đáng kể (p = 0,02) so với I. Vers màu (r = 0,55). Tương tự, tương quan cho I. Virginica (r = 0,28) yếu hơn đáng kể (p = 0,02) so với I. Vers màu. "

Cuối cùng, luôn luôn hình dung kết quả của bạn!

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

Tôi đồng ý với đề nghị trước đó. Bạn nên phù hợp với mô hình hồi quy bội với biến giả cho mỗi bộ dữ liệu. Điều này sẽ cho phép bạn kiểm tra xem các phần chặn có khác nhau không. Nếu bạn cũng muốn biết nếu độ dốc khác nhau, thì bạn cũng cần bao gồm các tương tác giữa các hình nộm và biến trong câu hỏi. Không có vấn đề với thực tế là dữ liệu là độc lập. Lưu ý rằng nếu chúng là hai loài độc lập (ví dụ) khác nhau, thì bạn sẽ không thể biết liệu sự khác biệt bạn tìm thấy là do các loài khác nhau hay do các bộ dữ liệu khác nhau, vì chúng bị nhầm lẫn hoàn toàn. Tuy nhiên, không có bài kiểm tra nào / get-out-of-jail-card sẽ giúp bạn giải quyết vấn đề đó mà không thu thập mẫu mới và tiếp tục học tập.


Có vẻ như chúng tôi đã đăng câu trả lời khá giống nhau gần như cùng một lúc. +1
Macro

@Macro, vâng, nhưng của bạn chủ yếu là tốt hơn (+1 trước đó); bạn đã giải quyết cả 3 câu hỏi mà tôi đã bỏ lỡ trong lần đọc câu hỏi đầu tiên (không kỹ lưỡng) của mình. Đóng góp của tôi ở đây là một phần về gây nhiễu.
gung - Phục hồi Monica

vâng đó là một điểm tốt. Tôi cho rằng nếu bạn đang thực hiện cuộc điều tra này thì bạn phải vận hành theo giả định rằng các bộ dữ liệu đang đo lường cùng một thứ, v.v ... với sự khác biệt duy nhất là các loài khác nhau.
Macro

3
Từ cách suy nghĩ của tôi, cả hai bạn nên nhận được những gì tôi đang làm.
Michael R. Chernick

1
Đề xuất biến giả là một gợi ý tốt với điều kiện phương sai lỗi không khác biệt đáng kể giữa các mô hình. Mặt khác, bạn có thể áp dụng thử nghiệm t Satterthwaite-Welch (có lợi thế duy nhất là có sẵn khi chỉ biết thống kê tóm tắt, như thường thấy khi đọc các bài báo được xuất bản) hoặc sử dụng bình phương có trọng số nhỏ nhất để phù hợp với mô hình kết hợp.
whuber
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.