今回は、多変量解析の代表的な手法である回帰分析について解説する。
工学系や農学系の実験等を行う領域では頻繁に使用される手法であるが、 日常的な話題の中でも概念は広く利用されているので、 取っ付き易い手法ではないだろうか。 過去のデータからその構造を把握し、新規に測定されたデータに対する予測を 行ないたいと言うときに、回帰分析は有用である。 構造のシンプルな単回帰分析でこの手法の原理を理解し、 複数の説明変量を用いた重回帰分析に拡張する。 残差の取り方や、その二乗和を最少にするという考えは同じである。
散布図にもっともらしい「直線」を当てはめたい。
皆さんから収集した体格データを用いて、散布図を描いてみよう。どういう直線が「もっともらしい」と考えるか?
後々の分析(残差プロット)時に、データに欠損値が含まれていると計算できないので、分析対象の変量だけを切り出して、欠損値を除外しておく。
加えて、今回、新しいデータを提供する。 第3回の講義の中で、学生データとして「StudAll20a.xlsx」 (Excel形式)を提供したが、その後新しいデータが得られたので、 追加したものを「StudAll20c.xlsx」としてMoodleに置いておいた。 もし、より多くのデータを対象に演習がしたいと考えるのであれば、 Moodleからダウンロードし、CSV形式に変換して演習に供されたい。 以下では、そのデータ(StudAll20c.csv)を用いて話を進めるが、 「前のデータのままで良い」という場合は、 以下の「StudAll20c」を「StudAll20a」に読み替えて 実行すれば良い。若干計算結果は異なるが、 大きな違いはないので、理解の妨げになることはないと考えている。
# データの切り出し
colnames(Student20c)
## [1] "Sex" "Height" "Weight" "Chest" "Residence"
## [6] "Remittance" "Carrier" "Fee"
StudTmp1<-Student20c[,2:3] # 身長(2番目)と体重(3番目)だけを切り出す
StudTmp1[1:20,]
## Height Weight
## 1 145.0 38.0
## 2 146.7 41.0
## 3 148.0 42.0
## 4 148.0 43.0
## 5 148.9 NA
## 6 149.0 45.0
## 7 150.0 46.0
## 8 151.0 45.0
## 9 151.0 46.0
## 10 151.0 50.0
## 11 151.7 41.5
## 12 152.0 35.0
## 13 152.0 43.0
## 14 152.0 44.0
## 15 153.0 41.0
## 16 153.0 42.0
## 17 153.0 46.5
## 18 153.0 50.0
## 19 153.0 55.0
## 20 153.0 NA
dim(StudTmp)
## [1] 494 8
元々の身長と体重のデータは 494例だったが、欠損値を含むデータが56例あり、 残ったのは438例である。
StudHW<-na.omit(StudTmp1) # 欠損値を含むデータを削除
dim(StudHW)
## [1] 438 2
colnames(StudHW)
## [1] "Height" "Weight"
## RresultHW <- lm(Weight ~ Height, data=StudHW)
## RresultHW
## summary(RresultHW)
以後は、Student20cの代わりにStudHWを使って分析を行う。
式の展開、解法。
直線の方程式:
測定値と予測値のズレ:
ズレの2乗の和を最小に:
[余談] 回帰分析では「2乗和」を最小にすることを考えるが、「絶対値和」とか「符号付き和(1乗和)」を最小にする方法もアイディアとしてはあり得る。 2乗和だと式の展開が楽になる。
# 表記方法 その1
Rresult1 <- lm(StudHW$Weight ~ StudHW$Height,
data=StudHW) # 線形モデル, Linear Model
Rresult1
##
## Call:
## lm(formula = StudHW$Weight ~ StudHW$Height, data = StudHW)
##
## Coefficients:
## (Intercept) StudHW$Height
## -78.0283 0.8127
summary(Rresult1)
##
## Call:
## lm(formula = StudHW$Weight ~ StudHW$Height, data = StudHW)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.446 -4.446 -1.038 3.212 34.617
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -78.02833 7.39601 -10.55 <2e-16 ***
## StudHW$Height 0.81271 0.04364 18.62 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.072 on 436 degrees of freedom
## Multiple R-squared: 0.443, Adjusted R-squared: 0.4418
## F-statistic: 346.8 on 1 and 436 DF, p-value: < 2.2e-16
# 表記方法 その2
RresultHW <- lm(Weight ~ Height,
data=StudHW) # 線形モデル, Linear Model
RresultHW
##
## Call:
## lm(formula = Weight ~ Height, data = StudHW)
##
## Coefficients:
## (Intercept) Height
## -78.0283 0.8127
summary(RresultHW)
##
## Call:
## lm(formula = Weight ~ Height, data = StudHW)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.446 -4.446 -1.038 3.212 34.617
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -78.02833 7.39601 -10.55 <2e-16 ***
## Height 0.81271 0.04364 18.62 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.072 on 436 degrees of freedom
## Multiple R-squared: 0.443, Adjusted R-squared: 0.4418
## F-statistic: 346.8 on 1 and 436 DF, p-value: < 2.2e-16
coef <-RresultHW$coefficient
resid<-RresultHW$residuals
coef # 回帰係数
## (Intercept) Height
## -78.0283291 0.8127064
resid[1:20] # 残差(先頭の20例)
## 1 2 3 4 6 7
## -1.8141038 -0.1957047 -0.2522231 0.7477769 1.9350705 2.1223640
## 8 9 10 11 12 13
## 0.3096576 1.3096576 5.3096576 -3.7592369 -10.5030488 -2.5030488
## 14 15 16 17 18 19
## -1.5030488 -5.3157553 -4.3157553 0.1842447 3.6842447 8.6842447
## 22 23
## -0.7221085 -1.1284617
plot(Weight ~ Height, data=StudHW)
abline(RresultHW)
abline(h=seq(40,100,10), lty=3)
abline(v=seq(140,190,5), lty=3)
# 残差プロット: 対身長に対して
plot(StudHW$Height, RresultHW$residuals)
abline(v=seq(140,190,5),lty=3) # 点線を追記
abline(h=seq(-10,30,10),lty=3) # 点線を追記
abline(h=0,lty=1) # 原点を追記
# 残差プロット: 対体重に対して
plot(StudHW$Weight, RresultHW$residuals)
abline(v=seq(30,100,5),lty=3) # 点線を追記
abline(h=seq(-10,30,10),lty=3) # 点線を追記
abline(h=0,lty=1) # 原点を追記
# 残差のヒストグラム
hist(RresultHW$residuals, right=F)
abline(h=seq(0,150,25),lty=3) # 点線を追記
# 残差の箱ひげ図
boxplot(RresultHW$residuals, horizontal=T)
abline(v=seq(-10,30,10),lty=3) # 点線を追記
# 残差のQQプロット: 正規確率プロット
qqnorm(RresultHW$residuals)
qqline(RresultHW$residuals, lty=2)
abline(h=0,lty=1) # 点線を追記
abline(h=seq(-10,30,10),lty=3) # 点線を追記
[検討事項] 残差が20を超える辺りの5例ほどは(少なくとも)分布を乱しているように見える。===> 外れ値か? 吟味が必要。
ここまでで回帰直線の当てはめに疑義がなければ、他に得られる情報についても知っておくと良い。
Adjusted R-squared: 0.4418
F-statistic: 346.8 on 1 and 436 DF, p-value: < 2.2e-16
Estimate Std. Error t value Pr(>|t|) (Intercept) -78.02833 7.39601 -10.55 <2e-16 *** Height 0.81271 0.04364 18.62 <2e-16 ***
summary(RresultHW)
##
## Call:
## lm(formula = Weight ~ Height, data = StudHW)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.446 -4.446 -1.038 3.212 34.617
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -78.02833 7.39601 -10.55 <2e-16 ***
## Height 0.81271 0.04364 18.62 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.072 on 436 degrees of freedom
## Multiple R-squared: 0.443, Adjusted R-squared: 0.4418
## F-statistic: 346.8 on 1 and 436 DF, p-value: < 2.2e-16
対象になったのは 438名。
誤差は「説明変量」の軸と垂直に取ることに注意せよ。 誤差は測定時に混入していると考えてモデルが構築されているから。
有効桁数に注意せよ : どこまでが「意味ある桁」か?
測定精度上回る計算結果は出せても、意味はない。 プログラムの出力をそのまま書き写さないように。
[重要な注意] 統計ソフトは単なる道具。使いこなすのは各自。
67.8 <=== 67.75~67.84
68 <=== 67.5 ~68.4
[例2] 日本の観測史上の最高気温は、 2018(平成30)年7月23日に熊谷市で観測された41.1度であり、 最低気温は、1902(明治35)年1月25日に北海道旭川市の-41度であった。===> -41.0度
[例3] 2001年のイチロー選手の打率は3割5分であった。 2006年は3割3分1厘であった。===> 3割5分0厘