library(ggplot2)
library(tidyr)
library(dplyr)
library(grid)
# サンプルを作成
# サイズと説明変数の設定
<- 50
n <- seq(n)
x # 誤差の設定
# 今回設定した標準偏差の数値に意味はありません。
# 母回帰式との違いや信頼区間が明瞭となるよう、傾きに対して標準偏差を大きめにしています。
# よって、傾き及び切片が有意とならない場合があります。
<- rnorm(n = n, mean = 0, sd = 15)
error # 目的変数の設定
# 今回設定した傾きと切片の数値に意味はありません。
<- 2 * x + 10
Y <- Y + error y
Rで確率・統計:線形回帰における回帰係数の信頼区間、母回帰式の区間推定、目的変数の予測区間、回帰直線の同時信頼区間
Rでデータサイエンス
線形回帰における回帰係数の信頼区間、母回帰式の区間推定、目的変数の予測区間、回帰直線の同時信頼区間
共通準備
- 参考引用資料 1,2,3,7
- 次の1次1変数式を母回帰式とし、有意水準は全て5%とする
\[y=\alpha x + \beta + \epsilon\]
# サンプルを利用して散布図作成そして説明変数(x)と目的変数(y)の線形回帰を取ります
# 有意水準
<- 0.05
significant_level # 自由度n-2、有意水準0.05のt値
<- qt(1 - significant_level/2, n - 2)
t_value # 説明変数xの偏差平方和
<- sum((x - mean(x))^2)
Sxx # 説明変数xと目的変数yの積和
<- sum((x - mean(x)) * (y - mean(y)))
Sxy # 回帰直線の傾きの推定量
<- Sxy/Sxx
a # 回帰直線の切片の推定量
<- mean(y) - mean(x) * a
b # 推定されたy
<- a * x + b
estimated_y # 残差
<- y - estimated_y
residuals # 残差標準偏差
<- sqrt(sum((residuals - mean(residuals))^2)/(n - 2))
sigma # 土台とする散布図作成
<- ggplot(mapping = aes(x = x)) + geom_point(mapping = aes(y = y), size = 1) + theme_minimal() + theme(legend.position = "top", legend.title = element_blank(), legend.key.width = unit(1, "cm"))
g1 # 設定した傾きと切片に基づく直線を引きます。
<- g1 + geom_line(mapping = aes(x = x, y = Y, col = "母回帰式"), size = 0.7)
g2 # 推定された傾きと切片に基づく直線を引きます。
<- g2 + geom_line(mapping = aes(x = x, y = a * x + b, col = "推定回帰式"), size = 0.7) + scale_color_manual(values = c(推定回帰式 = "blue", 母回帰式 = "red"))
g g
# 推定された係数(傾き)と切片
list(a = a, b = b)
$a
[1] 2.036153
$b
[1] 8.158429
# なお推定された係数と切片は以下の方法でも取り出せます。
<- lm(y ~ x)
result_lm # result_lm$coefficients[2] # a
# result_lm$coefficients[1] # b
%>%
result_lm summary()
Call:
lm(formula = y ~ x)
Residuals:
Min 1Q Median 3Q Max
-26.400 -7.844 -0.032 6.578 47.665
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.1584 3.9687 2.056 0.0453 *
x 2.0362 0.1355 15.032 <0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 13.82 on 48 degrees of freedom
Multiple R-squared: 0.8248, Adjusted R-squared: 0.8212
F-statistic: 226 on 1 and 48 DF, p-value: < 0.00000000000000022
回帰係数の信頼区間
- 推定された係数 alpha と 切片 beta それぞれの信頼区間
- 参考資料 3,7
- 次の数式が信頼区間を表します
\[\hat{\alpha}\pm t_{\left(n-2,\dfrac{0.05}{2}\right)}\times\dfrac{\hat{\sigma}}{\displaystyle\sqrt{S_{xx}}},\quad \hat{\beta}\pm t_{\left(n-2,\dfrac{0.05}{2}\right)}\times\hat{\sigma}\times{\displaystyle\sqrt{\dfrac{1}{n}+\dfrac{\bar{x}^{2}}{S_{xx}}}}\]
# 係数(傾き)
<- t_value * sigma/sqrt(Sxx)
ci list(lower = a - ci, upper = a + ci)
$lower
[1] 1.763812
$upper
[1] 2.308493
# 切片
<- t_value * sigma * sqrt(1/n + mean(x)^2/Sxx)
ci list(lower = b - ci, upper = b + ci)
$lower
[1] 0.1787964
$upper
[1] 16.13806
# なお関数confint {stats}でも95%信頼区間が直接求められます
confint(result_lm, level = 0.95)
2.5 % 97.5 %
(Intercept) 0.1787964 16.138061
x 1.7638118 2.308493
母回帰式の区間推定
- 母回帰式の存在範囲推定 = 母回帰式の区間推定
- なおggplotでse = Tとした場合に表示される信頼区間は、この母回帰式の区間推定になります。
- 参考資料 4
- 次の数式が区間推定を表します。
\[\left(\hat{\alpha}x_{0}+\hat{\beta}\right)\pm t_{\left(n-2,\dfrac{0.05}{2}\right)}\times\displaystyle\sqrt{\dfrac{1}{n}+\dfrac{\left(x-\bar{x}\right)^{2}}{S_{xx}}}\times \hat{\sigma}\]
<- t_value * sqrt(1/n + ((x - mean(x))^2)/Sxx) * sigma
ci <- estimated_y - ci
lower1 <- estimated_y + ci
upper1 <- g2 + geom_line(mapping = aes(y = estimated_y, col = "推定回帰式"), size = 0.7) + scale_color_manual(values = c(推定回帰式 = "blue", 母回帰式 = "red"))
g3 <- g3 + geom_line(mapping = aes(y = upper1), size = 0.7, col = "blue", linetype = "dashed") + geom_line(mapping = aes(y = lower1), size = 0.7, col = "blue", linetype = "dashed")
gg1 # geom_smoothで回帰直線と信頼区間を描きますと重なります。
<- gg1 + geom_smooth(mapping = aes(x = x, y = y), method = "lm", se = T, inherit.aes = T)
gg2 ::grid.arrange(gg1, gg2, layout_matrix = c(1, 2) %>%
gridExtramatrix(nrow = 1), top = textGrob("母回帰式の区間推定", gp = gpar(font = 1)))
目的変数の予測区間
- 説明変数 x の値をx0 に指定したときの目的変数 y の信頼区間 = 予測区間
- 参考資料 4
- 次の数式が予測区間を表します。
\[\left(\hat{\alpha}x_{0}+\hat{\beta}\right)\pm t_{\left(n-2,\dfrac{0.05}{2}\right)}\times\displaystyle\sqrt{1+\dfrac{1}{n}+\dfrac{\left(x-\bar{x}\right)^{2}}{S_{xx}}}\times \hat{\sigma}\]
# グレーの範囲が予測区間です。
<- t_value * sqrt(1 + 1/n + ((x - mean(x))^2)/Sxx) * sigma
ci <- estimated_y - ci
lower2 <- estimated_y + ci
upper2 <- g2 + geom_line(mapping = aes(y = estimated_y, col = "推定回帰式"), size = 0.7) + scale_color_manual(values = c(推定回帰式 = "blue", 母回帰式 = "red"))
g3 <- g3 + geom_line(mapping = aes(y = upper2), size = 0.7, col = "blue", linetype = "dashed") + geom_line(mapping = aes(y = lower2), size = 0.7, col = "blue", linetype = "dashed") + geom_ribbon(mapping = aes(ymin = lower2, ymax = upper2), alpha = 0.2) + labs(title = "目的変数 y の信頼区間 = 予測区間")
g g
回帰直線の同時信頼区間
- x = x0 だけでなく、すべての x に対する回帰直線の同時信頼区間
- 参考資料 5,6
- 次の数式が同時信頼区間を表します。
\[\left(\hat{\alpha}x_{0}+\hat{\beta}\right)\pm \displaystyle\sqrt{2F_{\left(2,n-2,\dfrac{0.05}{2}\right)}}\times\displaystyle\sqrt{\dfrac{1}{n}+\dfrac{\left(x-\bar{x}\right)^{2}}{S_{xx}}}\times \hat{\sigma}\]
# グレーの範囲が同時信頼区間です。
<- sqrt(2 * qf(significant_level, 2, n - 2)) * sqrt(1/n + ((x - mean(x))^2)/Sxx) * sigma
ci <- estimated_y - ci
lower3 <- estimated_y + ci
upper3 <- g2 + geom_line(mapping = aes(y = estimated_y, col = "推定回帰式"), size = 0.7) + scale_color_manual(values = c(推定回帰式 = "blue", 母回帰式 = "red"))
g3 <- g3 + geom_line(mapping = aes(y = upper3), size = 0.7, col = "blue", linetype = "dashed") + geom_line(mapping = aes(y = lower3), size = 0.7, col = "blue", linetype = "dashed") + geom_ribbon(mapping = aes(ymin = lower3, ymax = upper3), alpha = 0.2) + labs(title = "すべての x に対する回帰直線の同時信頼区間")
g g
参考引用資料
- http://sphweb.bumc.bu.edu/otlt/MPH-Modules/BS/BS704_Confidence_Intervals/BS704_Confidence_Intervals_print.html
- http://lbm.ab.a.u-tokyo.ac.jp/~omori/kokusai11/kokusai11_1212.html
- http://www2.econ.osaka-u.ac.jp/~tanizaki/class/2016/basic_econome/03.pdf
- http://www.hil.hiroshima-u.ac.jp/sys2/a/kaikibunseki.pdf
- http://stat.sys.i.kyoto-u.ac.jp/titech/class/doc/lec20021114-9.pdf
- https://www.jstage.jst.go.jp/article/jscswabun/14/1/14_KJ00001896557/_pdf
- https://www2.isye.gatech.edu/~yxie77/isye2028/lecture12.pdf
最終更新
Sys.time()
[1] "2024-04-16 05:19:16 JST"
R、Quarto、Package
R.Version()$version.string
[1] "R version 4.3.3 (2024-02-29 ucrt)"
::quarto_version() quarto
[1] '1.4.542'
packageVersion(pkg = "tidyverse")
[1] '2.0.0'