@Ronaldの答えが最もよく、それは多くの同様の問題に広く適用できます(たとえば、体重と年齢の関係で男性と女性の間に統計的に有意な差があるかどうか)。ただし、別のソリューションを追加しますが、これは定量的ではありませんが(p値を提供しません)、違いをグラフィカルに表示します。
編集:この質問によれば、信頼区間を計算するためにpredict.lm
使用される関数は、回帰曲線の周りの同時信頼帯ggplot2
ではなく、点ごとの信頼帯のみを計算するように見えます。これらの最後のバンドは、2つの近似線形モデルが統計的に異なるかどうか、または同じ真のモデルと互換性があるかどうかを別の言い方で言うかどうかを評価するのに適切なバンドではありません。したがって、それらはあなたの質問に答えるための正しい曲線ではありません。どうやら、同時の信頼帯(奇妙な!)を取得する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%の信頼バンドです。ご覧のとおり、予想どおり、それらは点ごとのバンドよりも大きくなっています。2つの曲線の同時信頼帯が重ならないという事実は、2つのモデル間の差が統計的に有意であることを示していると見なすことができます。
もちろん、有効なp値を使用した仮説検定では、@ Rolandアプローチに従う必要がありますが、このグラフィカルなアプローチは探索的データ分析と見なすことができます。また、プロットはいくつかの追加のアイデアを与えることができます。2つのデータセットのモデルが統計的に異なることは明らかです。しかし、2つの1次モデルが2つの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のモデルの違いは重要ではないため、データセットごとに2つの線形回帰を使用することもできます。