@Ronald의 답변이 최고이며 많은 유사한 문제에 광범위하게 적용됩니다 (예 : 체중과 연령의 관계에서 남성과 여성의 통계적으로 유의미한 차이가 있습니까?). 그러나 양적 ( p- 값을 제공하지는 않음)은 아니지만 그 차이를 그래픽으로 표시하는 다른 솔루션을 추가하겠습니다 .
편집 :에 따라 이 문제 , 그 모양 predict.lm
에 의해 사용되는 함수 ggplot2
신뢰 구간을 계산하기 위해 계산되지 않고 동시 신뢰 대역 회귀 곡선 주위 만 점별 신뢰 밴드. 이 마지막 대역은 두 개의 적합 선형 모델이 통계적으로 다른지 또는 동일한 실제 모델과 호환 될 수 있는지 여부에 대해 다른 방식으로 평가되는지를 판단하는 데 적합하지 않습니다. 따라서 귀하의 질문에 대답하기에 올바른 곡선이 아닙니다. 동시 신뢰 밴드 (이상한!)를 얻을 수있는 R 내장이 없기 때문에 필자는 자체 기능을 작성했습니다. 여기있어:
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)
내부 밴드는 기본적으로 geom_smooth
다음과 같이 계산됩니다 . 회귀 곡선 주변의 포인트 단위 95 % 신뢰 밴드입니다. 외부 반투명 밴드 (그래픽 팁 덕분에 @Roland)는 95 % 의 동시 신뢰 밴드입니다. 보시다시피 예상대로 포인트 단위보다 큽니다. 두 곡선의 동시 신뢰 구간이 겹치지 않는다는 사실은 두 모델 간의 차이가 통계적으로 유의하다는 사실을 나타내는 것으로 간주 할 수 있습니다.
물론 유효한 p- 값 을 사용한 가설 검정의 경우 @Roland 접근법을 따라야하지만이 그래픽 방식은 탐색 적 데이터 분석으로 볼 수 있습니다. 또한 줄거리는 우리에게 몇 가지 추가 아이디어를 줄 수 있습니다. 두 데이터 세트의 모델이 통계적으로 다르다는 것이 분명합니다. 그러나 2 차 1 모형이 2 차 모형뿐만 아니라 거의 데이터에 적합 할 것 같습니다. 이 가설을 쉽게 테스트 할 수 있습니다.
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
차수 1 모델과 차수 2 모델의 차이는 중요하지 않으므로 각 데이터 세트에 대해 두 개의 선형 회귀를 사용할 수도 있습니다.