重回帰分析 - 太郎丸博のホームページ

例題
図 1 を見ると、言語の成績が高いほど、そして親
# MASS パッケージの nlschools データを使い、
の SES が高いほど子供の IQ は高い傾向がみられ
どのような特性を持った子供の IQ が高いか、回
る。さらに重回帰分析でこれらの要因の効果を推
帰分析を使って明らかにしなさい。ただしカテゴ
定したのが、表 1 のモデル 2 である。モデル 2 を
リカルな変数は使わなくてよい。
見ると、親の SES と言語の成績は 0.1%水準で正
また親の SES の IQ に対する総効果を、直接効果、
の有意な効果がみられる。すなわち、両者の効果
国語の試験を媒介にした間接効果、
はモデル中のその他変数の効果をコントロール
クラスのサイズを媒介にした間接効果、の 3 つに
しても有意であることがわかる。
次に、親の SES の総効果を、直接効果と間接効
分割しなさい。
果に分割した。その結果が表 2 である。表 2 を見
ると、親の SES の総効果は 0.060 であるが、その
例題の解答例
うち 64%は言語の成績を媒介としているが、36%
子供の IQ に及ぼす親の社会経済的地位の効果
は直接的なもので、言語の成績とは関係ないこと
太郎丸 博
がわかる。
親の社会経済的地位が子供の IQ と相関してい
car パッケージの nlschools には、子供の IQ
ることは広く知られているが、言語の成績以外に
のほかにいくつかの諸変数が含まれており、この
も、別の科目の成績や一般的な常識などを媒介と
うち課題にあるカテゴリカルな変数を除くと、親
している部分もあるだろうし、もしかしたら、階
の社会経済的地位 (Socio-Economic Status, 以
級文化のようなものが IQ を高めているのかもし
下では SES と省略)(SES)、子供の言語の試験の
れない。
成績(lang)、クラスの人数 (GS) の三つがある。
20
30
40
nlschools$lang
50
18
14
12
10
6
4
4
10
8
jitter(nlschools$IQ)
16
18
16
14
12
10
6
8
jitter(nlschools$IQ)
14
12
10
8
4
6
jitter(nlschools$IQ)
16
18
これらと子供の IQ の散布図が図 1 である。
10
15
20
25
30
35
40
nlschools$GS
10
20
30
nlschools$SES
図 1 子供の IQ と、言語の試験、クラスの人数、親の SES の散布図
表 1 回帰分析の結果
===========================================================
1
40
50
モデル 1 モデル 2 モデル 3
モデル 4
----------------------------------------------------------目的変数
IQ
IQ
言語の成績 クラスの人数
----------------------------------------------------------(Intercept)
10.163*** 5.791*** 32.778*** 25.006***
(0.112)
(0.222)
(0.482)
(0.326)
SES
0.060*** 0.022*** 0.293*** 0.054***
(0.004)
(0.003)
(0.016)
(0.011)
言語の成績
0.131***
(0.004)
クラスの人数
0.003
(0.006)
----------------------------------------------------------R-squared
0.100
0.383
0.126
0.011
N
2287
2287
2287
2287
===========================================================
表 2 親の SES が子供の IQ におよぼす効果の分割
総効果
直接効果
言語の成績を媒
介した間接効果
クラス人数を媒
介した間接効果
係数
0.060
0.022
0.038
0.000
割合(%)
100%
36%
64%
0%
0.2933 * 0.130811, # lang を媒介にした間接効果
0.05421 * 0.003368) # GS を媒介にした間接効果
round(x, 3)
sum(x) # 計算が合っているか検算
# 効果の割合の計算
round(x/sum(x), 2)
問題と計算のためのスクリプト
# MASS パッケージを読み込む
library(MASS)
head(nlschools)
#散布図を作る
par(mfrow=c(1,3)) # 図を 1 行 3 列にならべてプロ
ットできるよう描画領域を分割
plot(nlschools$lang, jitter(nlschools$IQ)) # jitter(ベ
クトル)は、点が重ならないようにずらすのに使う
plot(nlschools$GS, jitter(nlschools$IQ))
plot(nlschools$SES, jitter(nlschools$IQ))
library(memisc)
mtable(lm1, lm2, lm3, lm4)
# state.x77 のデータを使い、どのような特性を持
った州で殺人発生率が高いのか、重回帰分析しな
# 単回帰
lm1 <- lm(IQ ~ SES, data=nlschools)
summary(lm1)
# 重回帰
lm2 <- lm(IQ ~ SES + lang + GS, data=nlschools)
summary(lm2)
さい。また、その分析結果から、高校卒業率が殺
### SES の直接効果と間接効果の計算 ###
# まず SES に、lang と GS を回帰させる
lm3 <- lm(lang ~ SES, data=nlschools)
lm4 <- lm(GS ~ SES, data=nlschools)
lm3
lm4
# 整理すると
0.6008 # 総効果
x <- c(0.021535, # 直接効果
# state.x77 はデータフレームではなく行列なのでデ
ータフレームに変換して d0 と名付ける
d0 <- as.data.frame(state.x77)
head(d0)
# 変数名の途中にスペースが入っていると使いにくい
ので 4 番目と 6 番目の変数名をつけかえる
names(d0)[c(4, 6)] <- c("LifeExp", "HsGrad")
人の発生率に及ぼす総効果を、収入、文盲率、平
均余命を媒介した効果と直接効果に分割して検
討しなさい。
2