予測と発展的なモデル
(Press ?
for help, n
and p
for next and previous slide)
村田 昇
回帰係数 \(\beta_0,\beta_1,\dotsc,\beta_p\) を用いた一次式
\begin{equation} y=\beta_0+\beta_1x_1+\dotsb+\beta_px_p \end{equation}
誤差項 を含む確率モデルで観測データを表現
\begin{equation} y_i=\beta_0+\beta_1 x_{i1}+\cdots+\beta_px_{ip}+\epsilon_i \quad (i=1,\dotsc,n) \end{equation}
確率モデル
\begin{equation} \boldsymbol{y} =X\boldsymbol{\beta}+\boldsymbol{\epsilon}, \quad\boldsymbol{\epsilon}\sim\text{確率分布} \end{equation}
式の評価 : 残差平方和 の最小化による推定
\begin{equation} S(\boldsymbol{\beta}) =(\boldsymbol{y}-X\boldsymbol{\beta})^{\mathsf{T}} (\boldsymbol{y}-X\boldsymbol{\beta}) \end{equation}
解の条件 : 正規方程式
\begin{equation} X^{\mathsf{T}}X\boldsymbol{\beta} =X^{\mathsf{T}}\boldsymbol{y} \end{equation}
解の一意性 : Gram 行列 \(X^{\mathsf{T}}X\) が正則
\begin{equation} \hat{\boldsymbol{\beta}} = (X^{\mathsf{T}}X)^{-1} X^{\mathsf{T}}\boldsymbol{y} \end{equation}
データの概要
日付 | 気温 | 降雨 | 日射 | 降雪 | 風向 | 風速 | 気圧 | 湿度 | 雲量 |
---|---|---|---|---|---|---|---|---|---|
2023-09-01 | 29.2 | 0.0 | 24.01 | 0 | SSE | 4.3 | 1012.1 | 71 | 2.0 |
2023-09-02 | 29.6 | 0.0 | 22.07 | 0 | SSE | 3.1 | 1010.3 | 72 | 8.0 |
2023-09-03 | 29.1 | 3.5 | 18.64 | 0 | ENE | 2.8 | 1010.6 | 74 | 9.3 |
2023-09-04 | 26.1 | 34.0 | 7.48 | 0 | N | 2.6 | 1007.5 | 96 | 10.0 |
2023-09-05 | 29.3 | 0.0 | 22.58 | 0 | S | 3.5 | 1005.2 | 77 | 3.5 |
2023-09-06 | 27.5 | 0.5 | 13.17 | 0 | SSW | 2.6 | 1003.6 | 79 | 10.0 |
2023-09-07 | 27.0 | 0.5 | 11.01 | 0 | ENE | 2.5 | 1007.9 | 72 | 10.0 |
2023-09-08 | 21.9 | 107.5 | 2.10 | 0 | NW | 3.4 | 1007.8 | 98 | 10.0 |
2023-09-09 | 24.8 | 1.0 | 8.81 | 0 | S | 2.2 | 1006.8 | 93 | 7.5 |
2023-09-10 | 27.8 | 0.0 | 17.57 | 0 | S | 3.1 | 1009.1 | 83 | 6.3 |
2023-09-11 | 28.1 | 0.0 | 17.19 | 0 | SSE | 3.1 | 1010.1 | 79 | 9.0 |
2023-09-12 | 27.7 | 0.0 | 20.02 | 0 | SSE | 2.8 | 1010.0 | 76 | 4.8 |
2023-09-13 | 28.0 | 0.0 | 22.00 | 0 | SE | 2.4 | 1010.9 | 74 | 4.5 |
2023-09-14 | 28.2 | 0.0 | 14.54 | 0 | SSE | 2.8 | 1009.9 | 80 | 7.0 |
2023-09-15 | 27.4 | 10.5 | 9.21 | 0 | NE | 2.0 | 1010.9 | 88 | 8.5 |
関連するデータの散布図
Figure 1: 散布図
観測値とあてはめ値の比較
Figure 2: モデルの比較
決定係数 (R-squared)
\begin{equation} R^2 = 1-\frac{\sum_{i=1}^n\hat{\epsilon}_i^2}{\sum_{i=1}^n(y_i-\bar{y})^2} \end{equation}
自由度調整済み決定係数 (adjusted R-squared)
\begin{equation} \bar{R}^2 = 1-\frac{\frac{1}{n{-}p{-}1}\sum_{i=1}^n\hat{\epsilon}_i^2} {\frac{1}{n{-}1}\sum_{i=1}^n(y_i-\bar{y})^2} \end{equation}
決定係数(\(R^{2}\)・ Adjusted \(R^{2}\))によるモデルの比較
Characteristic | モデル1 | モデル2 | モデル3 | モデル4 | モデル5 | |||||
---|---|---|---|---|---|---|---|---|---|---|
Beta | 95% CI1 | Beta | 95% CI1 | Beta | 95% CI1 | Beta | 95% CI1 | Beta | 95% CI1 | |
気圧 | -0.21 | -0.49, 0.06 | -0.36 | -0.55, -0.18 | -0.32 | -0.53, -0.12 | -0.36 | -0.55, -0.17 | ||
日射 | 0.25 | 0.14, 0.37 | 0.30 | 0.20, 0.40 | 0.35 | 0.21, 0.49 | 0.32 | 0.18, 0.46 | ||
湿度 | 0.05 | -0.06, 0.16 | ||||||||
雲量 | 0.05 | -0.26, 0.36 | ||||||||
R² | 0.082 | 0.414 | 0.632 | 0.644 | 0.633 | |||||
Adjusted R² | 0.049 | 0.393 | 0.604 | 0.603 | 0.591 | |||||
1 CI = Confidence Interval |
\(F\)統計量: 決定係数(または残差)を用いて計算
\begin{equation} F =\frac{n{-}p{-}1}{p}\frac{R^2}{1-R^2} \end{equation}
\(F\)統計量によるモデルの比較
Characteristic | モデル1 | モデル2 | モデル3 | モデル4 | モデル5 | |||||
---|---|---|---|---|---|---|---|---|---|---|
Beta | 95% CI1 | Beta | 95% CI1 | Beta | 95% CI1 | Beta | 95% CI1 | Beta | 95% CI1 | |
気圧 | -0.21 | -0.49, 0.06 | -0.36 | -0.55, -0.18 | -0.32 | -0.53, -0.12 | -0.36 | -0.55, -0.17 | ||
日射 | 0.25 | 0.14, 0.37 | 0.30 | 0.20, 0.40 | 0.35 | 0.21, 0.49 | 0.32 | 0.18, 0.46 | ||
湿度 | 0.05 | -0.06, 0.16 | ||||||||
雲量 | 0.05 | -0.26, 0.36 | ||||||||
R² | 0.082 | 0.414 | 0.632 | 0.644 | 0.633 | |||||
Statistic | 2.51 | 19.8 | 23.1 | 15.7 | 14.9 | |||||
p-value | 0.12 | <0.001 | <0.001 | <0.001 | <0.001 | |||||
1 CI = Confidence Interval |
\(t\)統計量: 各係数ごと,\(\zeta\) は \((X^{\mathsf{T}} X)^{-1}\) の対角成分
\begin{equation} t=\frac{\hat{\beta}_j}{\hat{\sigma}\zeta_{j}} \end{equation}
\(t\)統計量によるモデルの比較
Characteristic | モデル1 | モデル2 | モデル3 | モデル4 | モデル5 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Beta | SE1 | Statistic | p-value | Beta | SE1 | Statistic | p-value | Beta | SE1 | Statistic | p-value | Beta | SE1 | Statistic | p-value | Beta | SE1 | Statistic | p-value | |
(Intercept) | 243 | 137 | 1.78 | 0.086 | 23 | 0.855 | 27.1 | <0.001 | 386 | 91.0 | 4.25 | <0.001 | 346 | 101 | 3.44 | 0.002 | 384 | 92.8 | 4.13 | <0.001 |
気圧 | -0.21 | 0.135 | -1.58 | 0.12 | -0.36 | 0.090 | -3.99 | <0.001 | -0.32 | 0.098 | -3.32 | 0.003 | -0.36 | 0.092 | -3.90 | <0.001 | ||||
日射 | 0.25 | 0.057 | 4.45 | <0.001 | 0.30 | 0.048 | 6.35 | <0.001 | 0.35 | 0.069 | 5.05 | <0.001 | 0.32 | 0.069 | 4.62 | <0.001 | ||||
湿度 | 0.05 | 0.052 | 0.948 | 0.4 | ||||||||||||||||
雲量 | 0.05 | 0.151 | 0.317 | 0.8 | ||||||||||||||||
1 SE = Standard Error |
モデル2
Figure 3: モデル3の診断
モデル3
Figure 4: モデル3の診断
モデル4
Figure 5: モデル4の診断
新しいデータ (説明変数) \(\boldsymbol{x}\) に対する 予測値
\begin{equation} \hat{y} = (1,\boldsymbol{x}^{\mathsf{T}})\hat{\boldsymbol{\beta}}, \qquad \hat{\boldsymbol{\beta}} = (X^{\mathsf{T}}X)^{-1} X^{\mathsf{T}}\boldsymbol{y} \end{equation}
予測値は元データの目的変数の重み付け線形和
\begin{equation} \hat{y} = \boldsymbol{w}(\boldsymbol{x})^{\mathsf{T}}\boldsymbol{y}, \qquad \boldsymbol{w}(\boldsymbol{x})^{\mathsf{T}} = (1,\boldsymbol{x}^{\mathsf{T}}) (X^{\mathsf{T}}X)^{-1} X^{\mathsf{T}} \end{equation}
推定量は以下の性質をもつ多変量正規分布
\begin{align} \mathbb{E}[\hat{\boldsymbol{\beta}}] &=\boldsymbol{\beta}\\ \mathrm{Cov}(\hat{\boldsymbol{\beta}}) &=\sigma^{2}(X^{\mathsf{T}}X)^{-1} \end{align}
この性質を利用して以下の3つの値の違いを評価
\begin{align} \hat{y}&=(1,\boldsymbol{x}^{\mathsf{T}})\hat{\boldsymbol{\beta}} &&\text{(回帰式による予測値)}\\ \tilde{y}&=(1,\boldsymbol{x}^{\mathsf{T}})\boldsymbol{\beta} &&\text{(最適な予測値)}\\ y&=(1,\boldsymbol{x}^{\mathsf{T}})\boldsymbol{\beta}+\epsilon &&\text{(観測値)} \end{align}
差の分布は以下の平均・分散をもつ正規分布に従う
\begin{align} \mathbb{E}[\tilde{y}-\hat{y}] &=(1,\boldsymbol{x}^{\mathsf{T}})\boldsymbol{\beta} -(1,\boldsymbol{x}^{\mathsf{T}})\mathbb{E}[\hat{\boldsymbol{\beta}}] =0\\ \mathrm{Var}(\tilde{y}-\hat{y}) &=\underbrace{\sigma^{2}(1,\boldsymbol{x}^{\mathsf{T}})(X^{\mathsf{T}}X)^{-1} (1,\boldsymbol{x}^{\mathsf{T}})^{\mathsf{T}}}_{\text{\(\hat{\boldsymbol{\beta}}\)の推定誤差による分散}} =\sigma^{2}\gamma_{c}(\boldsymbol{x})^{2} \end{align}
標準化による表現
\begin{equation} \frac{\tilde{y}-\hat{y}}{\sigma\gamma_{c}(\boldsymbol{x})} \sim \mathcal{N}(0,1) \end{equation}
未知の分散を不偏分散で推定
\begin{equation} Z= \frac{\tilde{y}-\hat{y}}{\hat{\sigma}\gamma_{c}(\boldsymbol{x})} \sim \mathcal{T}(n{-}p{-}1) \quad (\text{\(t\)分布}) \end{equation}
確率 \(\alpha\) の信頼区間
\begin{equation} \mathcal{I}^{c}_{\alpha} = \left( \hat{y}-C_{\alpha}\hat{\sigma}\gamma_{c}(\boldsymbol{x}),\; \hat{y}+C_{\alpha}\hat{\sigma}\gamma_{c}(\boldsymbol{x}) \right) \end{equation}\begin{equation} P(|Z| < {C_{\alpha}} | Z\sim\mathcal{T}(n{-}p{-}1)) =\alpha \end{equation}
差の分布は以下の平均・分散をもつ正規分布に従う
\begin{align} \mathbb{E}[y-\hat{y}] &=(1,\boldsymbol{x}^{\mathsf{T}})\boldsymbol{\beta} +\mathbb{E}[\boldsymbol{\epsilon}] -(1,\boldsymbol{x}^{\mathsf{T}}) \mathbb{E}[\hat{\boldsymbol{\beta}}] =0\\ \mathrm{Var}(y-\hat{y}) &=\underbrace{\sigma^{2} (1,\boldsymbol{x}^{\mathsf{T}})(X^{\mathsf{T}}X)^{-1} (1,\boldsymbol{x}^{\mathsf{T}})^{\mathsf{T}} }_{\text{\(\hat{\boldsymbol{\beta}}\)の推定誤差による分散}} +\underbrace{\sigma^{2}}_{\text{誤差の分散}} =\sigma^{2}\gamma_{p}(\boldsymbol{x})^{2} \end{align}
標準化による表現
\begin{equation} \frac{y-\hat{y}}{\sigma\gamma_{p}(\boldsymbol{x})} \sim \mathcal{N}(0,1) \end{equation}
未知の分散を不偏分散で推定
\begin{equation} Z= \frac{y-\hat{y}}{\hat{\sigma}\gamma_{p}(\boldsymbol{x})} \sim \mathcal{T}(n{-}p{-}1) \quad (\text{\(t\)分布}) \end{equation}
確率 \(\alpha\) の予測区間
\begin{equation} \mathcal{I}^{p}_{\alpha} = \left( \hat{y}-C_{\alpha}\hat{\sigma}\gamma_{p}(\boldsymbol{x}),\; \hat{y}+C_{\alpha}\hat{\sigma}\gamma_{p}(\boldsymbol{x}) \right) \end{equation}\begin{equation} P(|Z| < {C_{\alpha}} | Z\sim\mathcal{T}(n{-}p{-}1)) =\alpha \end{equation}
関数 stats::predict()
を用いた予測
#' モデルの作成 toy_train <- tibble(x1 = ..., x2 = ..., y = ...) toy_lm <- lm(y ~ x1 + x2, data = toy_train) toy_train_fitted <- predict(toy_lm) # あてはめ値の計算 #' 新しいデータの予測 toy_test <- tibble(x1 = ..., x2 = ...) # 予測したいデータの説明変数 toy_test_fitted <- predict(toy_lm, # 予測値の計算 newdata = toy_test) toy_test_conf <- predict(toy_lm, newdata = toy_test, # 信頼区間 interval = "confidence", level = 0.95) toy_test_pred <- predict(toy_lm, newdata = toy_test, # 予測区間 interval = "prediction", level = 0.95) #' 信頼区間,予測区間の水準の既定値は0.95
関数 broom::augment()
を用いた予測
#' モデルの作成 toy_train <- tibble(x1 = ..., x2 = ..., y = ...) toy_lm <- lm(y ~ x1 + x2, data = toy_train) toy_train_fitted <- augment(toy_lm) # あてはめ値の計算 #' 新しいデータの予測 toy_test <- tibble(x1 = ..., x2 = ...) # 予測したいデータの説明変数 toy_test_fitted <- augment(toy_lm, # 予測値の計算 newdata = toy_test) toy_test_conf <- augment(toy_lm, newdata = toy_test, # 信頼区間 interval = "confidence", conf.level = 0.95) toy_test_pred <- augment(toy_lm, newdata = toy_test, # 予測区間 interval = "prediction", conf.level = 0.95) #' 信頼区間,予測区間の水準の既定値は0.95
東京の気候データによる例
#' 9,10月のデータでモデルを構築し,8,11月のデータを予測 #' データの整理 tw_data <- read_csv("data/tokyo_weather.csv") tw_train <- tw_data |> # モデル推定用データ filter(month %in% c(9,10)) # %in% は集合に含むかどうかを判定 tw_test <- tw_data |> # 予測用データ filter(month %in% c(8,11)) #' モデルの構築 tw_model <- temp ~ solar + press # モデルの定義 tw_lm <- lm(tw_model, data = tw_train) # モデルの推定 tidy(tw_lm) # 回帰係数の評価 glance(tw_lm) # モデルの評価 #' あてはめ値と予測値の計算 tw_train_fitted <- augment(tw_lm, newdata = tw_train) # あてはめ値 tw_test_fitted <- augment(tw_lm, newdata = tw_test) # 予測値
グラフ表示の例
#' 予測結果を図示 bind_rows(tw_train_fitted, tw_test_fitted) |> # 2つのデータフレームを結合 mutate(month = as_factor(month)) |> # 月を因子化して表示に利用 ggplot(aes(x = .fitted, y = temp)) + geom_point(aes(colour = month, shape = month)) + # 月ごとに色と形を変える geom_abline(slope = 1, intercept = 0, # 予測が完全に正しい場合のガイド線 colour = "gray") + labs(x = "fitted", y = "observed")
関数 ggplot2::geom_errorbar()
: 区間の表示
geom_errorbar( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., na.rm = FALSE, orientation = NA, show.legend = NA, inherit.aes = TRUE ) #' mapping: 区間を表すために xmin,xmax または ymin,ymax を与える #' data: データフレーム #' ...: その他の描画オプション #' orientation: 特別な場合に指定 (一般に向きは mapping で自動的決定) #' 詳細は '?ggplot2::geom_errorbar' を参照
broom::augment()
の場合は ’.lower/.upper’ を用いるstats::predict()
の場合は ’lwr/upr’ を用いる東京の気候データを用いて以下の実験を試みなさい
#' 特定の月のデータを取り出すには,例えば以下のようにすればよい tw_data <- read_csv("data/tokyo_weather.csv") tw_train <- tw_data |> filter(month == 8) # 単一の数字と比較 tw_test <- tw_data |> filter(month %in% c(9,10)) # 集合と比較
1つの変数の多項式は関数 I()
を用いる
#' 目的変数 Y, 説明変数 X1,X2,X3 #' 交互作用を含む式 (formula) の書き方 Y ~ X1 + X1:X2 # X1 + X1*X2 Y ~ X1 * X2 # X1 + X2 + X1*X2 Y ~ (X1 + X2 + X3)^2 # X1 + X2 + X3 + X1*X2 + X2*X3 + X3*X1 #' 非線形変換を含む式 (formula) の書き方 Y ~ f(X1) # f(X1) (fは任意の関数) Y ~ X1 + I(X2^2) # X1 + X2^2
陽に扱う場合は関数 factor()
を利用する
#' factor属性の与え方 X <- c("A", "S", "A", "B", "D") Y <- c(85, 100, 80, 70, 30) toy_data1 <- tibble(X, Y) toy_data2 <- toy_data1 |> # 因子化 mutate(X2 = factor(X)) # 関数as_factor()を用いてもよい glimpse(toy_data2) # 作成したデータフレームの素性を見る(pillar::glimpse()) toy_data3 <- toy_data2 |> # 順序付き(levels)の因子化 mutate(X3 = factor(X, levels=c("S","A","B","C","D"))) glimpse(toy_data3) # toy_data2とはfactorの順序が異なる toy_data4 <- toy_data2 |> mutate(Y2 = factor(Y > 60)) # 条件による因子化 glimpse(toy_data4) # 条件の真偽で2値に類別される
関数 stats::step()
で自動化することができる
#' モデルの探索 adv_data <- read_csv('https://www.statlearning.com/s/Advertising.csv') summary(lm(sales ~ radio, data = adv_data)) summary(lm(sales ~ TV + radio, data = adv_data)) summary(lm(sales ~ TV + radio + newspaper, data = adv_data)) summary(adv_init <- lm(sales ~ TV * radio * newspaper, data = adv_data)) adv_opt <- step(adv_init) # 最大のモデルから削減増加による探索 summary(adv_opt) # 探索された(準)最適なモデルの確認
モデルの再構築のための視覚化
などが用意されている