La respuesta de @Ronald es la mejor y es ampliamente aplicable a muchos problemas similares (por ejemplo, ¿hay una diferencia estadísticamente significativa entre hombres y mujeres en la relación entre peso y edad?) Sin embargo, voy a añadir otra solución que, aunque no es tan cuantitativa (no proporciona una p -valor), ofrece una bonita representación gráfica de la diferencia.
EDITAR según esta pregunta Parece que predict.lm
la función utilizada por ggplot2
para calcular los intervalos de confianza, no calcula bandas de confianza simultáneas alrededor de la curva de regresión, sino sólo bandas de confianza puntuales. Estas últimas bandas no son las adecuadas para evaluar si dos modelos lineales ajustados son estadísticamente diferentes, o dicho de otro modo, si podrían ser compatibles con el mismo modelo verdadero o no. Por lo tanto, no son las curvas adecuadas para responder a su pregunta. Como aparentemente no existe una función de R para obtener bandas de confianza simultáneas (¡extraño!), escribí mi propia función. Aquí la tienes:
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 interiores son las calculadas por defecto por geom_smooth
: estos son puntualmente Bandas de confianza del 95% alrededor de las curvas de regresión. Las bandas exteriores semitransparentes (gracias por el consejo sobre los gráficos, @Roland ) son en cambio el simultánea Bandas de confianza del 95%. Como puede ver, son mayores que las bandas puntuales, como era de esperar. El hecho de que las bandas de confianza simultáneas de las dos curvas no se solapen puede tomarse como una indicación de que la diferencia entre los dos modelos es estadísticamente significativa.
Por supuesto, para una prueba de hipótesis con un p -valor, debe seguirse el enfoque @Roland, pero este enfoque gráfico puede considerarse un análisis exploratorio de datos. Además, el gráfico puede darnos algunas ideas adicionales. Está claro que los modelos de 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 comprobar 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 de grado 2 no es significativa, por lo que podemos utilizar dos regresiones lineales para cada conjunto de datos.
0 votos
Me parece que el comentario del usuario @Roland a la pregunta que enlazas, responde perfectamente a tu pregunta. ¿Qué es exactamente lo que no entiendes?
0 votos
Bueno un par de cosas, no estaba seguro de si esta era o no una respuesta adecuada ya que estaba en la sección de comentarios, pero si está funcionando entonces, sólo necesito estar seguro de haber entendido. Básicamente, debo crear un nuevo conjunto de datos en el que crear una columna con como 1s y 0s en función de los conjuntos de datos que originalmente provienen de? Después creo dos modelos, uno con todos los datos y otro con sólo uno de los conjuntos de datos. Luego aplico el test anova. ¿Es así? Además, nunca he utilizado el test anova. He visto que hablaban de un valor p adecuado, ¿qué sería eso exactamente?
1 votos
En su caso, las dos regresiones se refieren al mismo intervalo. Este es el mejor caso para interpretar las bandas de confianza de una regresión lineal. En este caso, las dos regresiones no son estadísticamente diferentes si son completamente dentro de la banda de confianza de cada uno en todo el intervalo ( $[0,100]$ en tu caso)- no si sólo se solapan en un pequeño subintervalo.