今回の実習では、dplyr というパッケージを利用する。 インストール済みでない場合は、install.packages()
でまずインストールする。インストールが済んだら、library()
でパッケージを読み込む。
前回の実習で使ったデータを利用する。 (前回ダウンロードしていない者は、データ (lec13-data.csv) をダウンロードし、プロジェクト内の data フォルダの中に保存する(このデータは架空のものである)。)
データセットを read.csv()
で読み込み、 myd
という名前で利用する。
データセットに含まれる変数を確認しよう。
## [1] "id" "female" "support" "height" "faheight"
このデータセットに含まれているのは、以下の変数である。
データの一部を確認してみよう。
## id female support height faheight
## 1 1 0 1 174.5 179.0
## 2 2 0 1 171.3 166.4
## 3 3 0 0 174.2 169.7
## 4 4 0 1 173.5 171.5
## 5 5 0 1 169.7 156.5
## 6 6 1 0 157.0 163.1
## id female support height faheight
## 995 995 0 1 172.4 170.0
## 996 996 0 1 172.1 168.8
## 997 997 0 1 170.7 171.4
## 998 998 1 0 161.5 171.9
## 999 999 1 0 159.5 173.5
## 1000 1000 0 1 172.4 169.7
親子の身長の関係に興味があるとしよう。ここでは、息子の身長 (height) と父親の身長 (faheight) の関係を調べたい。
私たちのデータの height には、息子の身長だけでなく、娘の身長も含まれているので、データセットから息子の行だけ抜き出したい。データセットには、女性を示すfemale という変数が含まれているので、この変数の値が0の行だけ抜き出せばよい。これは、dplyr パッケージの filter()
で実行できる。男性だけのデータセット myd_m を作ってみよう。
男性だけ抜き出せたか確認してみよう。
##
## 0
## 500
female の値がすべて0なので、男性だけ抜き出せたことがわかる。
息子の身長と父親の身長の関係を調べてみよう。2変数とも量的変数なので、散布図を作り、相関係数を求める。
## [1] 0.8121794
散布図と相関係数から、息子の身長と父親の身長の間には、強い正の相関がありそうだということがわかる。
息子の身長と父親の身長の間に正の相関があることはわかった。この2つの変数の関係を理論的に考えてみると、父親の身長が高いことが原因であり、息子の身長が結果であるという関係(遺伝関係)が想定される。つまり、2つの変数には、因果関係がありそうだということが考えられる。では、原因と結果にはどのような関係があるだろうか。
変数間に因果関係が想定されるとき、結果となる変数のことを結果変数 (outcome variable)、原因となる変数のことを説明変数(explanatory variable[s])と呼んで分析を行う。私たちの例では、
である。
この2つの変数の間に「直線的な」因果関係を想定する。すなわち、次のような関数を想定する。
\[y_n = a + b x_n + \epsilon_n.\] ただし、\(n=1, 2, \dots, N\) (大文字の \(N\) が標本サイズ)で、\(\epsilon_n\) は誤差(つまり、散布図上ですべての点が直線上に乗るわけではなく、線と点にズレがあることを想定している)である。 直線を求めるとは、\(a\) (\(y\)切片) と \(b\)(直線の傾き)の値を求めるということである。このような関係を想定して直線を推定することを、「\(y\) を \(x\) に回帰する (regress \(y\) on \(x\))」という。
息子の身長を父親の身長に回帰しよう。Rで回帰直線 (regression line) を求めるには、lm()
という関数を使う。lm は linear method のイニシャルであり、linear とは「線形」という意味である。大雑把にいうと、直線を推定する方法 (method) ということだ。 lm()
の使い方は、lm(結果変数 ~ 説明変数, data = データセットの名前)
である。これに fit(当てはめ)という名前をつけて実行してみよう。
これで、fit に回帰分析の実行結果が保存された。この結果の詳しい読み方は、『計量経済学』の講義で説明する。
ここでは、\(a\) と \(b\) の推定値を取り出そう。これらの値は係数(coefficients)と呼ばれており、coef()
を使うと取り出せる。先ほど保存した fit から係数を取り出してみよう。
## (Intercept) faheight
## 125.9522573 0.2763852
値を1つずつ取り出したいときは、次のようにする。
## (Intercept)
## 125.9523
## faheight
## 0.2763852
切片 (intercept) \(a\) の推定値が約125.95、父親の身長 (faheight) の係数 \(b\) の推定値が約0.28であることがわかる。つまり、求める回帰直線は、 \[\widehat{息子の身長} = 125.95 + 0.28 \times 父親の身長\] である。 この式で、「息子の身長」の上についている記号は「ハット」と読み、実際の値ではなく予測値(または推定値)であることを示す。
この回帰直線を、図にしてみよう。plot()
で散布図を描いた後に、abline()
で直線を引く。abline()
では、a (切片) と b(直線の傾き)を指定する。
plot(height ~ faheight, data = myd_m, pch = 16,
xlab = "父親の身長 (cm)", ylab = "息子の身長 (cm)")
abline(a = coef(fit)[1], b = coef(fit)[2], col = "red", lwd = 2)
次に、この直線の意味を考えよう。既に述べたとおり、この直線は、 \[\widehat{息子の身長} = 125.95 + 0.28 \times 父親の身長\] という式で表される。では、この式の126.95 と 0.28 は何を表しているのだろうか。
まず、切片である125.95が表しているのは、「父親の身長」が0のときの、息子の身長の予測値である。つまり、父親の身長が0cm であれば、息子の身長は平均すると125.95cm だろうと予測することになる。ただし、身長が0cmの父親は存在しないので、この例では、この数字自体に意味はない(このような意味のない値を推定することを避ける方法は『計量経済学』で解説する)。一般的には、「説明変数の値が0のときの結果変数の予測値」が切片の意味である。
次に、「父親の身長」の係数の推定値である 0.28 は何を意味しているのだろうか。これは、父親の身長が1cm高くなると、息子の身長は平均して0.28cm 高くなるということを示している。つまり、この数値が、説明変数が結果変数に与える影響の強さを表している。 回帰直線は直線なので、父親の身長が10cm高くなると、息子の身長は平均2.8cm高くなると言うこともできる。また、父親の身長が5cm 低くなると、息子の身長は平均 \(0.28 \times (-5) = -1.4\)cm 高くなる(つまり、1.4cm低くなる)ということもできる。
最後に、予測値を計算してみよう。予測値を計算するためには、説明変数である「父親の身長」に具体的な数値を代入すればよい。 例えば、父親の身長が175cmのときの息子の身長の予測値は、 \[\widehat{息子の身長} = 125.95 + 0.28 \times 175 = 174.95\] であり、父親の身長が164cm のときは、 \[\widehat{息子の身長} = 125.95 + 0.28 \times 164 = 171.87\] である。 そして、これらの予測値の集合が、回帰直線である。
実習課題: 娘の身長を父親の身長に回帰しなさい。回帰直線を図示し、父親の身長が娘の身長に与える影響について説明しなさい。また、父親の身長が165cm、170cm、175cmのそれぞれの場合について、娘の身長の予測値を求めなさい。