A resposta da @Ronald é a melhor e é amplamente aplicável a muitos problemas semelhantes (por exemplo, existe uma diferença estatisticamente significante entre homens e mulheres na relação entre peso e idade?). No entanto, adicionarei outra solução que, embora não seja quantitativa (não fornece um valor- p ), fornece uma boa exibição gráfica da diferença.
EDIT : de acordo com essa pergunta , parece que predict.lm
a função usada ggplot2
para calcular os intervalos de confiança não calcula faixas de confiança simultâneas em torno da curva de regressão, mas apenas faixas de confiança pontuais. Essas últimas bandas não são as corretas para avaliar se dois modelos lineares ajustados são estatisticamente diferentes, ou dito de outra maneira, se poderiam ser compatíveis com o mesmo modelo verdadeiro ou não. Portanto, elas não são as curvas certas para responder à sua pergunta. Como aparentemente não há R embutido para obter faixas de confiança simultâneas (estranho!), Escrevi minha própria função. Aqui 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)
As bandas interiores são aqueles calculados por padrão por geom_smooth
: estes são pontuais 95% intervalos de confiança em torno das curvas de regressão. As bandas externas semitransparentes (obrigado pela dica de gráficos, @Roland) são as bandas simultâneas de 95% de confiança. Como você pode ver, eles são maiores que as bandas pontuais, como esperado. O fato de as faixas de confiança simultâneas das duas curvas não se sobreporem pode ser tomado como uma indicação do fato de que a diferença entre os dois modelos é estatisticamente significativa.
Obviamente, para um teste de hipótese com um valor p válido , a abordagem @Roland deve ser seguida, mas essa abordagem gráfica pode ser vista como análise exploratória de dados. Além disso, o enredo pode nos dar algumas idéias adicionais. É claro que os modelos para os dois conjuntos de dados são estatisticamente diferentes. Mas também parece que os modelos de dois graus 1 se encaixariam nos dados quase tão bem quanto nos dois modelos quadráticos. Podemos facilmente testar esta hipótese:
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
A diferença entre o modelo de grau 1 e o modelo de grau 2 não é significativa; portanto, também podemos usar duas regressões lineares para cada conjunto de dados.