Відповідь @Ronald є найкращою і широко застосовується до багатьох подібних проблем (наприклад, чи є статистично значуща різниця між чоловіками та жінками у співвідношенні між вагою та віком?). Однак я додам ще одне рішення, яке, хоча і не настільки кількісне (воно не забезпечує p -значення), дає хороший графічний показ різниці.
EDIT : відповідно до цього питання , схоже 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
: це точкові смуги довіри 95% навколо кривих регресії. Зовнішні, напівпрозорі смуги (спасибі за графічну підказку, @Roland) - це замість одночасних 95% довірчих смуг. Як бачимо, вони більші, ніж очікувані смуги. Той факт, що параметри одночасної довіри з двох кривих не перетинаються, може сприйматися як ознака того, що різниця між двома моделями є статистично значущою.
Звичайно, для тесту гіпотези з дійсним значенням p- значення слід дотримуватися підходу @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 не є суттєвою, тому ми можемо також використовувати дві лінійні регресії для кожного набору даних.