La respuesta de @Ronald es la mejor y es ampliamente aplicable a muchos problemas similares (por ejemplo, ¿existe una diferencia estadísticamente significativa entre hombres y mujeres en la relación entre peso y edad?). Sin embargo, agregaré otra solución que, aunque no es tan cuantitativa (no proporciona un valor p ), ofrece una buena visualización gráfica de la diferencia.
EDITAR : según esta pregunta , parece que predict.lm
la función utilizada ggplot2
para calcular los intervalos de confianza no calcula las bandas de confianza simultáneas alrededor de la curva de regresión, sino solo las bandas de confianza puntuales. Estas últimas bandas no son las correctas para evaluar si dos modelos lineales ajustados son estadísticamente diferentes, o si se dice de otra manera, si podrían ser compatibles con el mismo modelo verdadero o no. Por lo tanto, no son las curvas correctas para responder a su pregunta. Como aparentemente no hay R incorporado para obtener bandas de confianza simultáneas (¡extraño!), Escribí mi propia función. Aquí está:
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)
Las bandas internas son las calculadas por defecto por geom_smooth
: estas son bandas puntuales de confianza del 95% alrededor de las curvas de regresión. Las bandas externas semitransparentes (gracias por la punta de los gráficos, @Roland) son en cambio las bandas de confianza simultáneas del 95%. Como puede ver, son más grandes que las bandas puntiagudas, como se esperaba. El hecho de que las bandas de confianza simultáneas de las dos curvas no se superpongan puede tomarse como una indicación del hecho de que la diferencia entre los dos modelos es estadísticamente significativa.
Por supuesto, para una prueba de hipótesis con un valor p válido , se debe seguir el enfoque @Roland, pero este enfoque gráfico se puede ver como un análisis de datos exploratorio. Además, la trama puede darnos algunas ideas adicionales. Está claro que los modelos para los dos conjuntos de datos son estadísticamente diferentes. Pero también parece que dos modelos de grado 1 se ajustarían a los datos casi tan bien como los dos modelos cuadráticos. Podemos probar fácilmente esta hipótesis:
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
La diferencia entre el modelo de grado 1 y el modelo de grado 2 no es significativa, por lo tanto, también podemos usar dos regresiones lineales para cada conjunto de datos.