Die Antwort von @Ronald ist die beste und auf viele ähnliche Probleme anwendbar (gibt es beispielsweise einen statistisch signifikanten Unterschied zwischen Männern und Frauen in der Beziehung zwischen Gewicht und Alter?). Ich werde jedoch eine andere Lösung hinzufügen, die zwar nicht so quantitativ ist (keinen p- Wert liefert), aber eine schöne grafische Darstellung des Unterschieds liefert.
BEARBEITEN : Nach dieser Frage sieht es so aus predict.lm
, als würde die Funktion ggplot2
zur Berechnung der Konfidenzintervalle keine simultanen Konfidenzbänder um die Regressionskurve berechnen , sondern nur punktweise Konfidenzbänder. Diese letzten Bänder sind nicht die richtigen, um zu beurteilen, ob zwei angepasste lineare Modelle statistisch unterschiedlich sind oder auf andere Weise gesagt werden, ob sie mit demselben wahren Modell kompatibel sein könnten oder nicht. Daher sind sie nicht die richtigen Kurven, um Ihre Frage zu beantworten. Da anscheinend kein R eingebaut ist, um simultane Vertrauensbänder zu erhalten (seltsam!), Schrieb ich meine eigene Funktion. Hier ist es:
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)
Die inneren Bänder sind diejenigen, die standardmäßig berechnet werden durch geom_smooth
: Dies sind punktweise 95% -Konfidenzbänder um die Regressionskurven. Die äußeren, halbtransparenten Bänder (danke für den Grafiktipp @Roland) sind stattdessen die gleichzeitigen 95% -Konfidenzbänder. Wie Sie sehen können, sind sie erwartungsgemäß größer als die punktweisen Bänder. Die Tatsache, dass sich die simultanen Konfidenzbänder aus den beiden Kurven nicht überlappen, kann als Hinweis darauf angesehen werden, dass der Unterschied zwischen den beiden Modellen statistisch signifikant ist.
Natürlich muss für einen Hypothesentest mit einem gültigen p- Wert der @ Roland-Ansatz befolgt werden, aber dieser grafische Ansatz kann als explorative Datenanalyse angesehen werden. Die Handlung kann uns auch einige zusätzliche Ideen geben. Es ist klar, dass die Modelle für die beiden Datensätze statistisch unterschiedlich sind. Es sieht aber auch so aus, als würden zwei Grad-1-Modelle fast genauso gut zu den Daten passen wie die beiden quadratischen Modelle. Wir können diese Hypothese leicht testen:
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
Der Unterschied zwischen dem Grad 1-Modell und dem Grad 2-Modell ist nicht signifikant, daher können wir auch zwei lineare Regressionen für jeden Datensatz verwenden.