@Ronald'ın cevabı en iyisidir ve birçok benzer soruna yaygın olarak uygulanabilir (örneğin, erkekler ve kadınlar arasında kilo ve yaş arasındaki ilişkide istatistiksel olarak anlamlı bir fark var mı?). Bununla birlikte, niceliksel olmasa da ( p- değeri sağlamaz ), farkın güzel bir grafik görüntüsünü veren başka bir çözüm ekleyeceğim .
DÜZENLEME : göre bu soruya , bu gibi görünüyor predict.lm
kullandığı işlevi, ggplot2
güven aralıkları hesaplamak için, hesaplamak gelmez eşzamanlı güven bantları regresyon eğrisi etrafında, ama sadece noktasal güven bantları. Bu son bantlar, takılan iki doğrusal modelin istatistiksel olarak farklı olup olmadığını değerlendirmek için doğru olanlar değildir veya başka bir şekilde, aynı gerçek modelle uyumlu olup olmadıklarını söyleyebilirler. Böylece, sorunuzu cevaplamak için doğru eğriler değildirler. Görünüşe göre aynı anda güven bantları (garip!) Almak için R yerleşik yok, çünkü kendi fonksiyonumu yazdım. İşte burada:
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)
İç bantlar tarafından varsayılan olarak hesaplanan olanlardır geom_smooth
: bunlar noktasal regresyon kıvrımlarda% 95 güven bantlar. Dış, yarı saydam bantlar (grafik ipucu için teşekkürler, @Roland) aynı anda % 95 güven bantlarıdır. Gördüğünüz gibi, bunlar beklendiği gibi noktasal bantlardan daha büyük. İki eğriden eşzamanlı güven bantlarının örtüşmemesi, iki model arasındaki farkın istatistiksel olarak anlamlı olduğunun bir göstergesi olarak alınabilir.
Tabii ki, geçerli p değeri olan bir hipotez testi için @Roland yaklaşımı izlenmelidir, ancak bu grafiksel yaklaşım keşifsel veri analizi olarak görülebilir. Ayrıca, plan bize bazı ek fikirler verebilir. İki veri seti için olan modellerin istatistiksel olarak farklı olduğu açıktır. Ama aynı zamanda iki derece 1 modelin iki kuadratik modelin yanı sıra neredeyse verilere uyması gibi görünüyor. Bu hipotezi kolayca test edebiliriz:
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
Derece 1 modeli ile derece 2 modeli arasındaki fark anlamlı değildir, bu nedenle her veri kümesi için iki doğrusal regresyon da kullanabiliriz.