0. 前回のアンケートから: 16名

7. 重回帰分析 : 予測等に使う、連続変量の関係

 ここまでは、構造がシンプルな単回帰分析を例に、この分析方法の考え方や残差の取り方、および、なぜそのように取る必要があるか等を説明した。この節では、より実用場面で登場する重回帰分析まで拡張し、分析の進め方や利用時の注意点を含めて紹介する。いろいろな場面での応用が可能な手法なので、大いに利用していただきたい。

7.1. 定式化: 式の展開、解法

回帰平面の方程式: \[ \textbf{y} = a_{0} + \sum_{j=1}^{p} a_{j}\textbf{x}^t_{j} \]

測定値と予測値のズレ(残差): \[ \varepsilon_{i} = y_{i} - (a_{0}+\sum_{j=1}^{p}a_{j}x_{ij}) \;\;\;\;\;\; (i=1,2,...,n) \]

残差の2乗和を最小に: \[ S = \sum_{i=1}^{n}{\varepsilon_{i}^2} = \sum_{i=1}^{n} \{ {y_{i} - ( a_{0}+\sum_{j=1}^{p}a_{j}x_{ij}})\}^2 \;\;\; { \to min} \]

行列表記: \[ {\textbf{Y}}={\textbf{X} \textbf{A}} \]

ここで、 \[ \textbf{Y}= \begin{pmatrix} y_{1} \\ y_{2} \\ y_{3} \\ \vdots \\ y_{i} \\ \vdots \\ y_{n} \end{pmatrix}, \;\;\; %%% {\textbf{X}}= \begin{pmatrix} 1 & x_{11} & x_{12} & \cdots & x_{1j} & \cdots & x_{1p}\\ 1 & x_{21} & x_{23} & \cdots & x_{2j} & \cdots & x_{2p} \\ 1 & x_{31} & x_{32} & \cdots & x_{3j} & \cdots & x_{3p} \\ \vdots & \vdots & \vdots & \ddots & \vdots & & \vdots \\ 1 & x_{i1} & x_{i2} & \cdots & x_{ij} & \cdots & x_{ip} \\ \vdots & \vdots & \vdots & & \vdots & \ddots & \vdots \\ 1 & x_{n1} & x_{n2} & \cdots & x_{nj} & \cdots & x_{np} \\ \end{pmatrix}, \;\;\; %%% \textbf{A}= \begin{pmatrix} a_{0} \\ a_{1} \\ a_{2} \\ \vdots \\ a_{j} \\ \vdots \\ a_{p} \end{pmatrix}. \]

\(\textbf{A}\) を求めるには、左側から\(\textbf{X}^t\)をかけて、

\[ \textbf{X}^t {\textbf{Y}}={\textbf{X}^t {\textbf{X} \textbf{A}}} \]

その後、今度は左側から\(({{\textbf{X}^t {\textbf{X}}}})^{-1}\)をかけて、

\[ \textbf{A} = ({{\textbf{X}^t {\textbf{X}}}})^{-1} \textbf{X}^t {\textbf{Y}} \]

よって、\(\textbf{A}\) を求めるには、\(({{\textbf{X}^t {\textbf{X}}}})\)が逆行列を持つことが条件となる。



7.2. 前準備: 完全データの抽出

 単回帰分析の時も説明したが、 データに欠損値が含まれていると、後々の分析(残差プロット等)時に、 毎回欠損値を除去する手順を組み込む必要が生じて面倒なので、 分析対象の変量だけをまず切り出し、その上で、欠損値を除外(完全データ)しておく。

# データ切り出し
dim(Student24)
## [1] 792   9
StudHWC<-na.omit(Student24[,3:5]) # 欠損値を含むデータを削除
dim(StudHWC)
## [1] 242   3
colnames(StudHWC)
## [1] "Height" "Weight" "Chest"
StudHWC[1:10,]
##    Height Weight Chest
## 2   145.5   42.0    76
## 3   146.7   41.0    85
## 5   148.0   43.0    80
## 8   150.0   43.0    82
## 9   150.0   46.0    86
## 16  151.7   41.5    80
## 17  152.0   35.0    77
## 23  153.0   46.5    87
## 25  153.0   55.0    78
## 26  153.0   57.0    38

 元々の収集データは772サンプルであったが、 身長と体重と胸囲だけのデータを抽出し、 この中に欠損値を含むサンプルを除外すると、残ったのは239サンプルであった。 よって、欠損値を含んでいたのは533サンプルあったことになる。 変量が多くなると欠損値を含むサンプルが多くなる傾向にある。 以後は、Student24の代わりにStudHWCを使って分析を行う。

7.3. 散布図行列

 既に第4回で紹介したので再掲となるが、 3変量以上の場合に変量間の関係を概観するのに便利な「散布図行列」を再度描画しておく。 3変量の中から2変量ごとを組み合わせて描画した散布図を、 行列形式で配置したものである。 複数変量の関係を視覚的に把握するのに優れた手法であり、 変量間でどの程度関係性がありそうかを視覚的に把握することができて便利である。 例えば、データ分析の初期段階でまずは全体像を掴もうとするような際には有効に機能する。

# 散布図行列
plot(StudHWC)

7.4. プログラム & 計算結果

dim(StudHWC)  # サンプルサイズを改めて確認
## [1] 242   3
# 重回帰分析
RresultHWC<-lm(Weight~Height+Chest, 
               data=StudHWC) # 右辺に説明する変量をプラスマークで追加していく

# 計算結果要約
summary(RresultHWC)
## 
## Call:
## lm(formula = Weight ~ Height + Chest, data = StudHWC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -14.019  -4.341  -1.411   3.280  31.561 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -99.70771    9.92295 -10.048  < 2e-16 ***
## Height        0.80174    0.06103  13.136  < 2e-16 ***
## Chest         0.29231    0.04930   5.929 1.06e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.038 on 239 degrees of freedom
## Multiple R-squared:  0.5393, Adjusted R-squared:  0.5354 
## F-statistic: 139.9 on 2 and 239 DF,  p-value: < 2.2e-16
*以下、順に計算結果を見ていくと、

7.5. 残差分析もお忘れなく

7.6. この分析のまとめ(結果の見方)

# 計算結果要約(再掲)
summary(RresultHWC)
## 
## Call:
## lm(formula = Weight ~ Height + Chest, data = StudHWC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -14.019  -4.341  -1.411   3.280  31.561 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -99.70771    9.92295 -10.048  < 2e-16 ***
## Height        0.80174    0.06103  13.136  < 2e-16 ***
## Chest         0.29231    0.04930   5.929 1.06e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.038 on 239 degrees of freedom
## Multiple R-squared:  0.5393, Adjusted R-squared:  0.5354 
## F-statistic: 139.9 on 2 and 239 DF,  p-value: < 2.2e-16

8. 外れ値への対応: 集団と異なったふるまいをするサンプル

8.1. 該当サンプルの除外

元のExcelファイルに戻って除外する手もあるが、Rの中で実現するには、 不等号や論理演算子、否定(!, Not)等をうまく組み合わせて、対象とするサンプルを除外する。 それぞれの式の意味している事項が理解できるであろうか? もし理解できないようなら、式の中を中から順に分割して出力してみれば理解の促進になるであろう。

# 外れ値と考えたサンプルを抽出
StudTaiOver85<-StudHWC$Weight>85
StudHWC[StudTaiOver85,]                # 体重が85超えのサンプル一覧
##     Height Weight Chest
## 366  169.3   88.5    94
## 539  173.0   90.0    90
## 628  176.9   90.1    98
## 670  178.0  100.0   112
## 684  179.0   87.0   102
## 735  182.0   90.0   100
## 741  183.0   87.0   100
StudKyoLess50<-StudHWC$Chest<50
StudHWC[StudKyoLess50,]                # 胸囲が50未満のサンプル一覧
##     Height Weight Chest
## 26     153     57  38.0
## 355    169     60  30.5
## 538    173     84  46.0
## 599    175     72  45.0
StudHWC[StudTaiOver85|StudKyoLess50,]  # 体重が85超え または 胸囲が50未満のサンプル一覧
##     Height Weight Chest
## 26   153.0   57.0  38.0
## 355  169.0   60.0  30.5
## 366  169.3   88.5  94.0
## 538  173.0   84.0  46.0
## 539  173.0   90.0  90.0
## 599  175.0   72.0  45.0
## 628  176.9   90.1  98.0
## 670  178.0  100.0 112.0
## 684  179.0   87.0 102.0
## 735  182.0   90.0 100.0
## 741  183.0   87.0 100.0
# 一旦変数に置き直すと利用が簡単になる(理解がしやすくなる、実現していることは上記と同じ)
StudOutlier<-StudTaiOver85|StudKyoLess50
StudHWC[StudOutlier,]                 # 体重が85超え または 胸囲が50未満のサンプル
##     Height Weight Chest
## 26   153.0   57.0  38.0
## 355  169.0   60.0  30.5
## 366  169.3   88.5  94.0
## 538  173.0   84.0  46.0
## 539  173.0   90.0  90.0
## 599  175.0   72.0  45.0
## 628  176.9   90.1  98.0
## 670  178.0  100.0 112.0
## 684  179.0   87.0 102.0
## 735  182.0   90.0 100.0
## 741  183.0   87.0 100.0

「体重が85超え または 胸囲が60未満」の11サンプルを特定。 元々は242サンプルあったが、11サンプルを除外したので231サンプルになっている。 以下では変数名をStudHWC2とした。

StudHWC2<-StudHWC[!StudOutlier,]
StudHWC2[1:10,]
##    Height Weight Chest
## 2   145.5   42.0    76
## 3   146.7   41.0    85
## 5   148.0   43.0    80
## 8   150.0   43.0    82
## 9   150.0   46.0    86
## 16  151.7   41.5    80
## 17  152.0   35.0    77
## 23  153.0   46.5    87
## 25  153.0   55.0    78
## 32  154.4   44.0    75
dim(StudHWC2)
## [1] 231   3
dim(StudHWC)
## [1] 242   3

8.2. 改めて重回帰分析

では、抽出したデータ(228サンプル)「StudHWC2」を対象に、改めて重回帰分析を行ってみよう。

dim(StudHWC2)  # サンプルサイズを改めて確認
## [1] 231   3
# 重回帰分析
RresultHWC2<-lm(Weight~Height+Chest, data=StudHWC2)

# 計算結果要約
summary(RresultHWC2)
## 
## Call:
## lm(formula = Weight ~ Height + Chest, data = StudHWC2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -10.911  -3.404  -0.978   3.232  17.344 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -98.63620    7.71208  -12.79   <2e-16 ***
## Height        0.66740    0.04701   14.20   <2e-16 ***
## Chest         0.53132    0.04993   10.64   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.2 on 228 degrees of freedom
## Multiple R-squared:  0.6698, Adjusted R-squared:  0.6669 
## F-statistic: 231.2 on 2 and 228 DF,  p-value: < 2.2e-16
*以下、順に計算結果を見ていくと、

8.3. 改めて残差分析もお忘れなく

# 残差プロット
plot(StudHWC2$Height, RresultHWC2$residuals)  # 対身長
abline(v=seq(140,190,10), lty=3)    # 点線を追記
abline(h=seq(-10,30,5), lty=3)      # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

plot(StudHWC2$Chest, RresultHWC2$residuals)  # 対胸囲
abline(v=seq(30,120,10), lty=3)     # 点線を追記
abline(h=seq(-10,30,5), lty=3)      # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

plot(StudHWC2$Weight, RresultHWC2$residuals)  # 対体重
abline(v=seq(30,100,10), lty=3)     # 点線を追記
abline(h=seq(-10,30,5), lty=3)      # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

残差の正規性を確かめてみよう。

# 残差のヒストグラム
hist(RresultHWC2$residuals, right=F, ylim=c(0,100))
abline(h=seq(0,100,20), lty=3)     # 点線を追記

# 残差の箱ひげ図
boxplot(RresultHWC2$residuals, horizontal=T)
abline(v=seq(-10,15,5), lty=3)      # 点線を追記

# 残差のQQプロット: 正規確率プロット
qqnorm(RresultHWC2$residuals)
qqline(RresultHWC2$residuals, lty=2)
abline(h=seq(-10,30,5), lty=3)   # 点線を追記
abline(h=0, lty=1)               # 実線を追記
abline(v=0, lty=1)               # 実線を追記

外れ値を除外する前後で残差のQQプロットが改善されたことを確認せよ。

8.4. 改めての分析のまとめ(結果の見方)

# 計算結果要約(再掲)
summary(RresultHWC2)
## 
## Call:
## lm(formula = Weight ~ Height + Chest, data = StudHWC2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -10.911  -3.404  -0.978   3.232  17.344 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -98.63620    7.71208  -12.79   <2e-16 ***
## Height        0.66740    0.04701   14.20   <2e-16 ***
## Chest         0.53132    0.04993   10.64   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.2 on 228 degrees of freedom
## Multiple R-squared:  0.6698, Adjusted R-squared:  0.6669 
## F-statistic: 231.2 on 2 and 228 DF,  p-value: < 2.2e-16

[参考: 出力の読み方の詳細] 統計検定のための、Rの出力結果からわかること(回帰分析編)

[演習8.4-1] 上述の重回帰分析について男性のみ、女性のみに分離して分析してみよ。

[演習8.4-2] 先週の単回帰分析について残差の大きいサンプルを除外して分析してみよ。

【今週の思い】回帰分析を成立させる背景やアイディアを理解し、その仮定を逸脱しないように分析を進める手順を習得せよ。

9. 4つの尺度と回帰分析

10. [要約: 回帰分析] 解析する上での注意点

11. 回帰分析にまつわる話題、誤用?!: 【提示資料

12. 【余談】回帰分析と最小二乗法

13. 最終レポート

【最終レポート(後期前半)】
 以下の事項について、WordファイルもしくはPDFファイルでレポートを作成し、Moodleから提出下さい。なお、提出フォームは11月14日(木) 昼から利用可能となります。

1.【必須項目】
 かねてからお伝えしていたように、各自が興味を持って収集したデータに対して統計手法を適用し、何らかの知見を引き出して報告してください。統計手法として、本講義で紹介した統計手法には限定しません。また、対象とするデータは1つ以上いくつでもかまいません。

    ◎記載内容: 以下に挙げるような項目を含めて作成すること。
    1. 所属学部名、学籍番号、氏名
    2. データ内容の説明
    3. どのような点に興味を持ったか
    4. 自分の解析目的
    5. 何を知りたいためにどのような手法を使ったのか
    6. 得られた知見と考察
    7. その他、気付いたこと

2.【必須項目】
 本講義を受講することによって「統計」に抱くイメージが変化したかを述べよ。変化した場合 or しない場合の各々で、講義を聞き終えた現状でどのように感じているか、また今後自分として統計に対してどのように取り組みたい/取り組みたくないかを説明せよ。

3.【任意項目(コメントがあれば嬉しいな)】 講義方法、講義の進め方
 講義内容の感想だけでなく、講義方法等に付いて気になった点や感想、改善希望点をお聞かせください。

【期日】11月21日(木) 朝まで (それ以降は受け付けなくなるので要注意)
【注意】単位取得を考えている者は期日までに提出すること。

82. 参考

このページで取り扱ったプログラムだけを抜き出して以下に列挙しておく。


# ディレクトリの移動。必須ではない。個々人の設定に応じて。
setwd("D:/home_sub3/R_Dir")  # ホームディレクトリに移動(Set Working Directory)
getwd()           # 現在のディレクトリ位置を表示
list.files()      # ファイル・ディレクトリ一覧を表示
setwd("KougiDS24")  # ディレクトリを移動
list.files()      # ファイル・ディレクトリ一覧を表示

# データの読み込み
Student24<-read.csv("StudAll24b.csv", skip=5,
                     header=TRUE, na.strings="NA")
dim(Student24)
colnames(Student24)
Student24[1:5,]

## 7.2. 前準備: 完全データの抽出
# データ切り出し
dim(Student24)
StudHWC<-na.omit(Student24[,3:5]) # 欠損値を含むデータを削除
dim(StudHWC)
colnames(StudHWC)
StudHWC[1:10,]

## 7.3. 散布図行列
# 散布図行列
plot(StudHWC)

## 7.4. プログラム & 計算結果
dim(StudHWC)  # サンプルサイズを改めて確認
# 重回帰分析
RresultHWC<-lm(Weight~Height+Chest, 
               data=StudHWC) # 右辺に説明する変量をプラスマークで追加していく

# 計算結果要約
summary(RresultHWC)

## 7.5. 残差分析もお忘れなく
# 残差プロット
plot(StudHWC$Height, RresultHWC$residuals)  # 対身長
abline(v=seq(140,190,10), lty=3)    # 点線を追記
abline(h=seq(-10,30,10), lty=3)     # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

plot(StudHWC$Chest, RresultHWC$residuals)  # 対胸囲
abline(v=seq(30,120,10), lty=3)     # 点線を追記
abline(h=seq(-10,30,10), lty=3)     # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

plot(StudHWC$Weight, RresultHWC$residuals)  # 対体重
abline(v=seq(30,100,10), lty=3)     # 点線を追記
abline(h=seq(-10,30,10), lty=3)     # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

# 残差のヒストグラム
hist(RresultHWC$residuals, right=F, ylim=c(0,100))
abline(h=seq(0,100,20), lty=3)     # 点線を追記

# 残差の箱ひげ図
boxplot(RresultHWC$residuals, horizontal=T)
abline(v=seq(-10,30,10), lty=3)   # 点線を追記

# 残差のQQプロット: 正規確率プロット
qqnorm(RresultHWC$residuals)
qqline(RresultHWC$residuals, lty=2)
abline(h=seq(-10,30,10), lty=3)   # 点線を追記
abline(h=0, lty=1)                # 実線を追記
abline(v=0, lty=1)               # 実線を追記

## 7.6. この分析のまとめ(結果の見方)
# 計算結果要約(再掲)
summary(RresultHWC)

## 8.1. 該当サンプルの除外
# 外れ値と考えたサンプルを抽出
StudTaiOver85<-StudHWC$Weight>85
StudHWC[StudTaiOver85,]                # 体重が85超えのサンプル一覧

StudKyoLess50<-StudHWC$Chest<50
StudHWC[StudKyoLess50,]                # 胸囲が50未満のサンプル一覧

StudHWC[StudTaiOver85|StudKyoLess50,]  # 体重が85超え または 胸囲が50未満のサンプル一覧

# 一旦変数に置き直すと利用が簡単になる(理解がしやすくなる、実現していることは上記と同じ)
StudOutlier<-StudTaiOver85|StudKyoLess50
StudHWC[StudOutlier,]                 # 体重が85超え または 胸囲が50未満のサンプル
StudHWC2<-StudHWC[!StudOutlier,]
StudHWC2[1:10,]
dim(StudHWC2)
dim(StudHWC)

## 8.2. 改めて重回帰分析
dim(StudHWC2)  # サンプルサイズを改めて確認

# 重回帰分析
RresultHWC2<-lm(Weight~Height+Chest, data=StudHWC2)

# 計算結果要約
summary(RresultHWC2)

## 8.3. 改めて残差分析もお忘れなく
# 残差プロット
plot(StudHWC2$Height, RresultHWC2$residuals)  # 対身長
abline(v=seq(140,190,10), lty=3)    # 点線を追記
abline(h=seq(-10,30,5), lty=3)      # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

plot(StudHWC2$Chest, RresultHWC2$residuals)  # 対胸囲
abline(v=seq(30,120,10), lty=3)     # 点線を追記
abline(h=seq(-10,30,5), lty=3)      # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

plot(StudHWC2$Weight, RresultHWC2$residuals)  # 対体重
abline(v=seq(30,100,10), lty=3)     # 点線を追記
abline(h=seq(-10,30,5), lty=3)      # 点線を追記
abline(h=0, lty=1)                  # ゼロを実線で追記

# 残差のヒストグラム
hist(RresultHWC2$residuals, right=F, ylim=c(0,100))
abline(h=seq(0,100,20), lty=3)     # 点線を追記

# 残差の箱ひげ図
boxplot(RresultHWC2$residuals, horizontal=T)
abline(v=seq(-10,15,5), lty=3)      # 点線を追記

# 残差のQQプロット: 正規確率プロット
qqnorm(RresultHWC2$residuals)
qqline(RresultHWC2$residuals, lty=2)
abline(h=seq(-10,30,10), lty=3)   # 点線を追記
abline(h=0, lty=1)                # 実線を追記
abline(v=0, lty=1)               # 実線を追記

## 8.4. 改めての分析のまとめ(結果の見方)
# 計算結果要約(再掲)
summary(RresultHWC2)