Jawaban @Ronald adalah yang terbaik dan secara luas dapat diterapkan untuk banyak masalah serupa (misalnya, apakah ada perbedaan yang signifikan secara statistik antara pria dan wanita dalam hubungan antara berat badan dan usia?). Namun, saya akan menambahkan solusi lain yang, meskipun bukan sebagai kuantitatif (tidak memberikan nilai- p ), memberikan tampilan grafis yang bagus tentang perbedaannya.
EDIT : menurut pertanyaan ini , sepertinya predict.lm
, fungsi yang digunakan oleh ggplot2
untuk menghitung interval kepercayaan, tidak menghitung band - band kepercayaan simultan di sekitar kurva regresi, tetapi hanya band-band percaya diri yang searah. Pita terakhir ini bukan yang tepat untuk menilai apakah dua model linier yang sesuai secara statistik berbeda, atau dikatakan dengan cara lain, apakah mereka dapat kompatibel dengan model yang sama atau tidak. Jadi, itu bukan kurva yang tepat untuk menjawab pertanyaan Anda. Karena ternyata tidak ada R builtin untuk mendapatkan band kepercayaan simultan (aneh!), Saya menulis fungsi saya sendiri. Ini dia:
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)
Pita dalam adalah pita yang dihitung secara default dengan geom_smooth
: ini adalah pita kepercayaan 95% pointwise di sekitar kurva regresi. Pita terluar, semitransparan (terima kasih atas tip grafisnya, @Roland) sebagai gantinya band kepercayaan 95% simultan . Seperti yang Anda lihat, mereka lebih besar dari band-band pointwise, seperti yang diharapkan. Fakta bahwa pita kepercayaan simultan dari dua kurva tidak tumpang tindih dapat diambil sebagai indikasi fakta bahwa perbedaan antara kedua model secara statistik signifikan.
Tentu saja, untuk uji hipotesis dengan nilai- p yang valid , pendekatan @Rand harus diikuti, tetapi pendekatan grafis ini dapat dilihat sebagai analisis data eksplorasi. Juga, alur ceritanya dapat memberi kita beberapa ide tambahan. Jelas bahwa model untuk dua set data berbeda secara statistik. Tetapi juga terlihat bahwa dua model derajat 1 akan cocok dengan data hampir sama halnya dengan dua model kuadratik. Kami dapat dengan mudah menguji hipotesis ini:
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
Perbedaan antara model derajat 1 dan model derajat 2 tidak signifikan, sehingga kami juga dapat menggunakan dua regresi linier untuk setiap set data.