Câu trả lời của @Ronald là tốt nhất và nó có thể áp dụng rộng rãi cho nhiều vấn đề tương tự (ví dụ: có sự khác biệt đáng kể về mặt thống kê giữa nam và nữ trong mối quan hệ giữa cân nặng và tuổi tác không?). Tuy nhiên, tôi sẽ thêm một giải pháp khác, mặc dù không phải là định lượng (nó không cung cấp giá trị p ), mang lại một màn hình đồ họa đẹp về sự khác biệt.
EDIT : theo câu hỏi này , có vẻ như predict.lm
, hàm được sử dụng ggplot2
để tính các khoảng tin cậy, không tính các dải tin cậy đồng thời xung quanh đường hồi quy, mà chỉ là các dải tin cậy theo chiều. Các dải cuối cùng này không phải là những dải phù hợp để đánh giá xem hai mô hình tuyến tính được trang bị có khác nhau về mặt thống kê hay nói theo một cách khác, liệu chúng có thể tương thích với cùng một mô hình thật hay không. Vì vậy, họ không phải là đường cong phù hợp để trả lời câu hỏi của bạn. Vì rõ ràng không có R dựng sẵn để có được các dải tin cậy đồng thời (lạ!), Tôi đã viết chức năng của riêng mình. Đây là:
simultaneous_CBs <- function(linear_model, newdata, level = 0.95){
# Working-Hotelling 1 – α confidence bands for the model linear_model
# at points newdata with α = 1 - level
# summary of regression model
lm_summary <- summary(linear_model)
# degrees of freedom
p <- lm_summary$df[1]
# residual degrees of freedom
nmp <-lm_summary$df[2]
# F-distribution
Fvalue <- qf(level,p,nmp)
# multiplier
W <- sqrt(p*Fvalue)
# confidence intervals for the mean response at the new points
CI <- predict(linear_model, newdata, se.fit = TRUE, interval = "confidence",
level = level)
# mean value at new points
Y_h <- CI$fit[,1]
# Working-Hotelling 1 – α confidence bands
LB <- Y_h - W*CI$se.fit
UB <- Y_h + W*CI$se.fit
sim_CB <- data.frame(LowerBound = LB, Mean = Y_h, UpperBound = UB)
}
library(dplyr)
# sample datasets
setosa <- iris %>% filter(Species == "setosa") %>% select(Sepal.Length, Sepal.Width, Species)
virginica <- iris %>% filter(Species == "virginica") %>% select(Sepal.Length, Sepal.Width, Species)
# compute simultaneous confidence bands
# 1. compute linear models
Model <- as.formula(Sepal.Width ~ poly(Sepal.Length,2))
fit1 <- lm(Model, data = setosa)
fit2 <- lm(Model, data = virginica)
# 2. compute new prediction points
npoints <- 100
newdata1 <- with(setosa, data.frame(Sepal.Length =
seq(min(Sepal.Length), max(Sepal.Length), len = npoints )))
newdata2 <- with(virginica, data.frame(Sepal.Length =
seq(min(Sepal.Length), max(Sepal.Length), len = npoints)))
# 3. simultaneous confidence bands
mylevel = 0.95
cc1 <- simultaneous_CBs(fit1, newdata1, level = mylevel)
cc1 <- cc1 %>% mutate(Species = "setosa", Sepal.Length = newdata1$Sepal.Length)
cc2 <- simultaneous_CBs(fit2, newdata2, level = mylevel)
cc2 <- cc2 %>% mutate(Species = "virginica", Sepal.Length = newdata2$Sepal.Length)
# combine datasets
mydata <- rbind(setosa, virginica)
mycc <- rbind(cc1, cc2)
mycc <- mycc %>% rename(Sepal.Width = Mean)
# plot both simultaneous confidence bands and pointwise confidence
# bands, to show the difference
library(ggplot2)
# prepare a plot using dataframe mydata, mapping sepal Length to x,
# sepal width to y, and grouping the data by species
p <- ggplot(data = mydata, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
# add data points
geom_point() +
# add quadratic regression with orthogonal polynomials and 95% pointwise
# confidence intervals
geom_smooth(method ="lm", formula = y ~ poly(x,2)) +
# add 95% simultaneous confidence bands
geom_ribbon(data = mycc, aes(x = Sepal.Length, color = NULL, fill = Species, ymin = LowerBound, ymax = UpperBound),alpha = 0.5)
print(p)
Các ban nhạc bên trong là những tính bằng cách mặc định bằng cách geom_smooth
: đây là những pointwise 95% các ban nhạc tự tin xung quanh các đường cong hồi quy. Thay vào đó, các dải bán trong suốt (cảm ơn về mẹo đồ họa, @Roland) thay vào đó là các dải tin cậy 95% đồng thời . Như bạn có thể thấy, chúng lớn hơn các dải theo chiều, như mong đợi. Việc các dải tin cậy đồng thời từ hai đường cong không trùng nhau có thể được coi là một dấu hiệu cho thấy thực tế là sự khác biệt giữa hai mô hình có ý nghĩa thống kê.
Tất nhiên, đối với thử nghiệm giả thuyết với giá trị p hợp lệ , phải tuân theo cách tiếp cận @Roland, nhưng phương pháp đồ họa này có thể được xem là phân tích dữ liệu thăm dò. Ngoài ra, cốt truyện có thể cho chúng ta một số ý tưởng bổ sung. Rõ ràng là các mô hình cho hai tập dữ liệu là khác nhau về mặt thống kê. Nhưng có vẻ như hai mô hình độ 1 sẽ phù hợp với dữ liệu gần như hai mô hình bậc hai. Chúng ta có thể dễ dàng kiểm tra giả thuyết này:
fit_deg1 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,1))
fit_deg2 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,2))
anova(fit_deg1, fit_deg2)
# Analysis of Variance Table
# Model 1: Sepal.Width ~ Species * poly(Sepal.Length, 1)
# Model 2: Sepal.Width ~ Species * poly(Sepal.Length, 2)
# Res.Df RSS Df Sum of Sq F Pr(>F)
# 1 96 7.1895
# 2 94 7.1143 2 0.075221 0.4969 0.61
Sự khác biệt giữa mô hình độ 1 và mô hình độ 2 là không đáng kể, do đó chúng tôi cũng có thể sử dụng hai hồi quy tuyến tính cho mỗi bộ dữ liệu.