baseball <- read.csv("baseball2016.csv",na.strings="*")
え,こんなにも色々なことができるの?と思われたかもしれません。ちょっと大げさに表現していますが,これらはいずれも今日の「回帰分析」を応用したRQです。RQのうしろ,カッコ内の分析名がより正しいモデル名なのですが,いずれも「回帰分析」の応用系なのです。
回帰分析とは,ある目的となる変数を説明する関数を当てはめることです。一般に,\[y=ax+b\] という線形関数を当てはめます。
身長と体重を例にして説明しましょう。 この二つの変数の散布図を書いてみます。
library(ggplot2)
g <- ggplot(baseball,aes(x=height,y=weight)) + geom_point()
plot(g)
右肩あがりの関係がありそうです。線を入れてみます。
g <- g + geom_smooth(method="lm")
plot(g)
この線の引き方が,線形回帰をするということです。回帰モデルをデータに当てはめる,とも言います。 lmは,liner model(線形モデル)という意味です。
この線形モデルを数式で表現するのが次の方法です。
reg <- lm(weight~height,data=baseball)
reg
##
## Call:
## lm(formula = weight ~ height, data = baseball)
##
## Coefficients:
## (Intercept) height
## -125.518 1.172
すなわち,体重=1.172 * 身長 -125.5118 という関係にあるということがわかります。言い換えると,身長が1cm高いと体重が1.17kg大きいということです(このデータの中では)。また。Intercept(切片)は身長が0だった時の(!)値です。
もちろん,すべてのデータがこの直線上に乗っているわけではありません。むしろほとんど外れていますが,この線が「当てはまっている」といえるのはどうしてでしょうか?ここでは,最小二乗基準 によってこの数字を決めています。最小二乗法による回帰分析,ということもあります。 推定値の決め方は他にもある,ということを頭の片隅に置いておいてください。
さて,最小二乗基準で推定値が得られはしましたが,誤差も多いので,これをどう評価すればよいでしょうか。 ちなみに,推定値や誤差は結果のオブジェクトに入っています。
reg$residuals #誤差。残差ともいう。
## 1 2 3 4 5
## 5.52516074 7.55718176 17.80512571 3.90118876 2.80512571
## 6 7 8 9 10
## 6.04117125 9.18115373 15.41719927 4.04117125 8.69716424
## 11 12 13 14 15
## 16.69716424 -1.33485678 11.46111870 8.69716424 5.35315724
## 16 17 18 19 20
## 6.69716424 14.04117125 11.55718176 -5.09881124 -2.44281824
## 21 22 23 24 25
## 7.90118876 -0.44281824 -0.44281824 8.07319227 -1.09881124
## 26 27 28 29 30
## -5.89478671 3.04117125 5.76120628 -0.41079722 3.07319227
## 31 32 33 34 35
## -11.44281824 -1.89478671 3.55718176 -9.47483926 -9.44281824
## 36 37 38 39 40
## -5.64684276 -3.95882875 6.07319227 3.07319227 1.38517825
## 41 42 43 44 45
## 0.00915023 -0.44281824 -0.44281824 -12.27081474 -5.78682525
## 46 47 48 49 50
## -8.27081474 8.07319227 -10.95882875 -5.30283576 5.21317475
## 51 52 53 54 55
## 10.07319227 0.90118876 -8.67886378 -6.75480423 -3.92680773
## 56 57 58 59 60
## -13.92680773 6.38517825 3.24519577 22.41719927 2.24519577
## 61 62 63 64 65
## 11.04117125 4.55718176 -7.75480423 3.55718176 -0.44281824
## 66 67 68 69 70
## -6.44281824 -2.58280073 -2.75480423 -4.23879372 -2.27081474
## 71 72 73 74 75
## 5.69716424 -4.58280073 1.69716424 10.55718176 4.21317475
## 76 77 78 79 80
## 6.07319227 -8.58280073 -13.58280073 -1.81884627 4.58920278
## 81 82 83 84 85
## 0.04117125 -0.58280073 1.32113622 -3.30283576 -7.67886378
## 86 87 88 89 90
## 0.18115373 11.66514322 -19.02287079 2.52516074 -4.81884627
## 91 92 93 94 95
## 9.55718176 -1.53888130 -2.16285327 -14.39889881 -4.19487429
## 96 97 98 99 100
## 5.66514322 12.18115373 14.46111870 12.66514322 -0.30283576
## 101 102 103 104 105
## -1.92680773 -8.44281824 9.86916775 3.21317475 -7.09881124
## 106 107 108 109 110
## -4.44281824 -8.44281824 1.69716424 -2.27081474 3.35315724
## 111 112 113 114 115
## -2.13083225 1.07319227 -14.78682525 -0.95882875 5.10521329
## 116 117 118 119 120
## -4.41079722 8.41719927 -0.47483926 1.55718176 -6.61482175
## 121 122 123 124 125
## -5.44281824 2.79322730 -12.47483926 -16.61482175 -0.44281824
## 126 127 128 129 130
## -1.09881124 1.86916775 -10.95882875 1.79322730 -3.44281824
## 131 132 133 134 135
## -6.61482175 -4.13083225 -16.36687780 2.52516074 -12.44281824
## 136 137 138 139 140
## -7.47483926 -8.47483926 1.07319227 -5.92680773 0.07319227
## 141 142 143
## -6.30283576 -4.44281824 10.86916775
reg$fitted.values #推定値
## 1 2 3 4 5 6 7
## 92.47484 85.44282 104.19487 83.09881 104.19487 88.95883 94.81885
## 8 9 10 11 12 13 14
## 79.58280 88.95883 91.30284 91.30284 98.33486 106.53888 91.30284
## 15 16 17 18 19 20 21
## 93.64684 91.30284 88.95883 85.44282 83.09881 85.44282 83.09881
## 22 23 24 25 26 27 28
## 85.44282 85.44282 81.92681 83.09881 74.89479 88.95883 77.23879
## 29 30 31 32 33 34 35
## 78.41080 81.92681 85.44282 74.89479 85.44282 92.47484 85.44282
## 36 37 38 39 40 41 42
## 93.64684 88.95883 81.92681 81.92681 86.61482 95.99085 85.44282
## 43 44 45 46 47 48 49
## 85.44282 84.27081 87.78683 84.27081 81.92681 88.95883 91.30284
## 50 51 52 53 54 55 56
## 87.78683 81.92681 83.09881 100.67886 80.75480 81.92681 81.92681
## 57 58 59 60 61 62 63
## 86.61482 80.75480 79.58280 80.75480 88.95883 85.44282 80.75480
## 64 65 66 67 68 69 70
## 85.44282 85.44282 85.44282 79.58280 80.75480 77.23879 84.27081
## 71 72 73 74 75 76 77
## 91.30284 79.58280 91.30284 85.44282 87.78683 81.92681 79.58280
## 78 79 80 81 82 83 84
## 79.58280 94.81885 78.41080 88.95883 79.58280 100.67886 91.30284
## 85 86 87 88 89 90 91
## 100.67886 94.81885 98.33486 103.02287 92.47484 94.81885 85.44282
## 92 93 94 95 96 97 98
## 106.53888 97.16285 112.39890 104.19487 98.33486 94.81885 106.53888
## 99 100 101 102 103 104 105
## 98.33486 91.30284 81.92681 85.44282 90.13083 87.78683 83.09881
## 106 107 108 109 110 111 112
## 85.44282 85.44282 91.30284 84.27081 93.64684 90.13083 81.92681
## 113 114 115 116 117 118 119
## 87.78683 88.95883 74.89479 78.41080 79.58280 92.47484 85.44282
## 120 121 122 123 124 125 126
## 86.61482 85.44282 70.20677 92.47484 86.61482 85.44282 83.09881
## 127 128 129 130 131 132 133
## 90.13083 88.95883 70.20677 85.44282 86.61482 90.13083 105.36688
## 134 135 136 137 138 139 140
## 92.47484 85.44282 92.47484 92.47484 81.92681 81.92681 81.92681
## 141 142 143
## 91.30284 85.44282 90.13083
この推定値と実際のデータとの相関係数が当てはまりの良さ(適合度)の一つの指標です。相関係数が高ければ高いほど,良い予測ができていると言えます。 相関係数は-1から1までの値を取りますが,適合度指標としては相関係数の二乗を使います(R-squared)。 この指標も実は結果のオブジェクトに既に入っています。
summary(reg)
##
## Call:
## lm(formula = weight ~ height, data = baseball)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.0229 -5.2008 -0.4428 5.1592 22.4172
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -125.5178 18.3500 -6.84 2.22e-10 ***
## height 1.1720 0.1008 11.63 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.704 on 141 degrees of freedom
## Multiple R-squared: 0.4896, Adjusted R-squared: 0.486
## F-statistic: 135.3 on 1 and 141 DF, p-value: < 2.2e-16
0.5ほどですね。これは実際のデータとしては,とても良い当てはまりだと言えます。
説明する変数が増えたら重回帰分析(Multiple Regression Analysis)と名前が変わります。 モデルの書き方はそれほど変わりません。
reg2 <- lm(weight~age+height,data=baseball)
reg2
##
## Call:
## lm(formula = weight ~ age + height, data = baseball)
##
## Coefficients:
## (Intercept) age height
## -134.7002 0.3667 1.1607
summary(reg2)
##
## Call:
## lm(formula = weight ~ age + height, data = baseball)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.0067 -5.3351 0.1374 4.4695 21.4743
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -134.70024 18.41031 -7.317 1.8e-11 ***
## age 0.36669 0.14887 2.463 0.015 *
## height 1.16072 0.09912 11.711 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.57 on 140 degrees of freedom
## Multiple R-squared: 0.5108, Adjusted R-squared: 0.5038
## F-statistic: 73.09 on 2 and 140 DF, p-value: < 2.2e-16
年齢が1年上だと体重が0.3kg増えるようで,身長が1kg高いと1.16cm高いようです。一応どちらも統計的にも有意であるようですが,どちらが重要なファクターなのでしょう?単位が違うから比べられないと思いませんか?
そこで,データの標準化を考えます。
baseball2 <- subset(baseball,select=c("weight","age","height")) #データの一部抜き出し
baseball2z <- scale(baseball2) #標準化
baseball2z <- data.frame(baseball2z) #データフレーム型にしておく
summary(baseball2z)
## weight age height
## Min. :-2.02513 Min. :-2.49175 Min. :-2.3347
## 1st Qu.:-0.72233 1st Qu.:-0.61885 1st Qu.:-0.7761
## Median :-0.07093 Median : 0.08349 Median :-0.3085
## Mean : 0.00000 Mean : 0.00000 Mean : 0.0000
## 3rd Qu.: 0.67353 3rd Qu.: 0.66878 3rd Qu.: 0.4709
## Max. : 3.18607 Max. : 2.42463 Max. : 3.2765
こうした上で,あらためて。
reg3 <- lm(weight~age+height,baseball2z)
reg3
##
## Call:
## lm(formula = weight ~ age + height, data = baseball2z)
##
## Coefficients:
## (Intercept) age height
## 1.003e-15 1.458e-01 6.930e-01
summary(reg3)
##
## Call:
## lm(formula = weight ~ age + height, data = baseball2z)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.76871 -0.49647 0.01279 0.41592 1.99833
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.003e-15 5.890e-02 0.000 1.000
## age 1.458e-01 5.918e-02 2.463 0.015 *
## height 6.930e-01 5.918e-02 11.711 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7044 on 140 degrees of freedom
## Multiple R-squared: 0.5108, Adjusted R-squared: 0.5038
## F-statistic: 73.09 on 2 and 140 DF, p-value: < 2.2e-16
こうすると単位が整っていますから,大きさを比較することができます。年齢の係数は0.145,身長の係数は0.693なので,身長の方が体重との関係が強いことがわかります。
前回はMDSで選手をプロットしたりしたのでした。ちょっと再現して見ましょう。
身長と体重だけのサブセットを作って選手の散布図(!)を書いて見ます。
subdat <- subset(baseball,select=c("height","weight")) #二変数だけ抽出
subdat.dist <- dist(subdat) # 距離行列を計算
player.map <- cmdscale(subdat.dist,2) # MDSで座標を得る
plot(player.map,type="n")
text(player.map,levels(baseball$name))
たくさんの選手がいて,野球に詳しくない人には特徴がわかりにくいかもしれません。 しかし,MDSによって一人一人に座標=連続的な数字が割り当てられたのですから,その座標値を予測する変数があれば,次元の意味がわかるかもしれません!
baseball$dim1 <- player.map[,1]
reg4 <- lm(dim1~HR, data=baseball)
summary(reg4)
##
## Call:
## lm(formula = dim1 ~ HR, data = baseball)
##
## Residuals:
## Min 1Q Median 3Q Max
## -36.471 -5.534 1.157 7.620 26.004
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.3402 1.3894 3.843 0.000183 ***
## HR -0.5241 0.1030 -5.087 1.14e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 10.88 on 141 degrees of freedom
## Multiple R-squared: 0.1551, Adjusted R-squared: 0.1491
## F-statistic: 25.87 on 1 and 141 DF, p-value: 1.142e-06
これはホームランの本数を独立変数にして,座標を従属変数にした時の回帰係数です。-0.5なのでホームランが増えるほど左のほうにプロットされるようです。もっとも\(R^2\)が小さいので,それほど説明力はありませんが・・・。
とまれ,このような使い方もできる,というのは知っておいてください。
pokemon <- read.csv("pokemon.csv",header=T)
dat <- subset(pokemon[1:30,],select=c("HP","Kougeki","Bougyo","Tokko","Tokubou","Subayasa"))
result.map <- cmdscale(dist(dat),2)
#パッケージのインストール
#install.packages("ggiraph")
library(ggplot2)
plot.dat <- transform(result.map)
plot.dat$name <- pokemon[1:30,]$name
g2 <- ggplot(plot.dat,aes(x=X1,y=X2,color=name))+geom_point()
g2
この二軸をどのように解釈すれば良いでしょうか。エビデンスとともに(統計的な根拠を元に)論じてください。