คำตอบของ @Ronald เป็นคำตอบที่ดีที่สุดและใช้ได้อย่างกว้างขวางกับปัญหาที่คล้ายคลึงกันหลายประการ (เช่นมีความแตกต่างอย่างมีนัยสำคัญระหว่างผู้ชายกับผู้หญิงในความสัมพันธ์ระหว่างน้ำหนักและอายุหรือไม่) อย่างไรก็ตามฉันจะเพิ่มวิธีแก้ปัญหาอื่นซึ่งในขณะที่ไม่เชิงปริมาณ (ไม่ได้ให้ค่าp ) ให้การแสดงผลกราฟิกที่ดีของความแตกต่าง
แก้ไข : ตามคำถามนี้ดูเหมือนว่าpredict.lm
ฟังก์ชั่นที่ใช้ggplot2
ในการคำนวณช่วงความเชื่อมั่นไม่คำนวณแถบความเชื่อมั่นพร้อมกันรอบ ๆ เส้นโค้งการถดถอย แต่มีเพียงแถบความเชื่อมั่นแบบจุดเท่านั้น แถบสุดท้ายเหล่านี้ไม่ใช่สิ่งที่ถูกต้องในการประเมินว่าแบบจำลองเชิงเส้นสองแบบที่ติดตั้งนั้นมีความแตกต่างทางสถิติหรือกล่าวอีกนัยหนึ่งไม่ว่าพวกมันจะเข้ากันได้กับแบบจำลองที่เหมือนกันจริงหรือไม่ ดังนั้นพวกเขาไม่ใช่เส้นโค้งที่ถูกต้องในการตอบคำถามของคุณ เนื่องจากเห็นได้ชัดว่าไม่มี R บิวอินเพื่อรับแถบความมั่นใจพร้อมกัน (แปลก!) ฉันจึงเขียนฟังก์ชั่นของตัวเอง นี่มันคือ:
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)
ภายในวงเป็นผู้คำนวณโดยเริ่มต้นจากgeom_smooth
คนเหล่านี้เป็นpointwise 95% วงดนตรีที่ความเชื่อมั่นรอบเส้นโค้งการถดถอย แถบด้านนอกกึ่งโปร่งใส (ขอบคุณสำหรับปลายกราฟิก @Roland) แทนแถบความมั่นใจ 95% พร้อมกัน อย่างที่คุณเห็นพวกมันมีขนาดใหญ่กว่าวงพอยต์ตามคาด ความจริงที่ว่าแถบความเชื่อมั่นที่เกิดขึ้นพร้อมกันจากทั้งสองเส้นโค้งนั้นไม่ได้ซ้อนทับกันสามารถนำมาใช้เป็นข้อบ่งชี้ถึงความจริงที่ว่าความแตกต่างระหว่างทั้งสองรุ่นนั้นมีนัยสำคัญทางสถิติ
แน่นอนว่าสำหรับการทดสอบสมมติฐานด้วยค่าp- value ที่ถูกต้องจะต้องปฏิบัติตามวิธี @Roland แต่วิธีกราฟิกสามารถดูเป็นการวิเคราะห์ข้อมูลเชิงสำรวจได้ นอกจากนี้เนื้อเรื่องยังช่วยให้เรามีแนวคิดเพิ่มเติม เป็นที่ชัดเจนว่าแบบจำลองสำหรับชุดข้อมูลทั้งสองนั้นมีความแตกต่างทางสถิติ แต่มันก็ดูเหมือนว่าแบบจำลองสององศา 1 จะพอดีกับข้อมูลเกือบจะเป็นแบบสองกำลังสอง เราสามารถทดสอบสมมติฐานนี้ได้อย่างง่ายดาย:
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
ความแตกต่างระหว่างตัวแบบดีกรี 1 และตัวแบบดีกรี 2 นั้นไม่สำคัญดังนั้นเราอาจใช้การถดถอยเชิงเส้นสองชุดสำหรับแต่ละชุดข้อมูล