線形モデルの枠組み

ここでは、解析のさまざまな目的に対応できるとても汎用性の高い枠組みである、”線形モデル”について概念的な説明をおこなう。

線形モデルは、ある要因(説明変数)が別の要因(目的変数)に与える影響を検証するものである。

説明変数は複数でもよく、その場合には複数の説明変数それぞれの影響が個別に検証される。

ANOVA(分散分析)、回帰分析、ANCOVA、重回帰分析などなど、すべて線形モデルが使われている。

まず、線形モデルが統計解析全体の中でどのような位置を占めるかを説明し、次に線形モデルの考え方のエッセンスを図を使って説明する。最後に、Rによる一般線形モデルの記法を例を用いて解説する。

線形モデルの位置づけとその種類

線形モデルは「ある要因が他の要因に与える影響(効果)を検証したい」という場面で用いられる。

一見、特定の目的にしか使えないように感じられるかもしれないけれど、「群間の差を検証したい」という目的も線形モデルの枠組みで扱える(言い換えれば「”複数群”という要因の影響を検証したい」ということなので)ことを考えると、線形モデルの対応できる場面はかなり広い。

下の図は、よく行われる統計解析とその目的を雑多にまとめたものである。

図1. 線形モデルの位置づけとその種類。こういうのは統計曼荼羅とか呼ばれていて、偉い人たちがいろいろなバージョンを書いている。

線形モデルにもいろいろある…という印象を受けるかもしれないが、実のところ大きく分ければ一般線形モデル、GLM、ランダム効果入りモデルの3種類しかない(ほかにはGLSなど)。

どれを使うかは、1. 目的変数の正規性・等分散性がみたされているか? 2. 同一個体や同一場所からの反復測定があるか?の主に2つの分かれ道で決まる(正規性とは、目的変数が正規分布かどうかということ。実践的には、データの分布が一山型で左右対称であれば良いと思う。等分散性とは、説明変数の変化に関わらず目的変数のばらつきが変わらないということ。これが満たされないと、群間(あるいは説明変数の値の違いで)でばらつきに違いが生まれる)。

なお、PCA、RDA、CCAやMANOVAは線形モデルを多変量に拡張したものである。

線形モデルの考え方

図2

各説明変数が目的変数に与える影響の、線形モデルによる検証の背景にあるエッセンスは、”変動(分散)の分解”である。

たとえば、図3のようなデータYが得られて、シンボルの形と色によって、Yの値が異なるのかどうか知りたいとする。

図3

まずはシンボルの形で2群に分け、各群の平均値を算出してみよう。

図4

左が〇の群、右が△の群であり、グレーの実線と点線が各群の平均値を示している。

確かに△の平均値は〇の平均値に比べて高くなっている。一方で、各群の点は各群の平均値の周りで大きくばらついていることもわかる。


ここで、〇群と△群の平均値のばらつき(2つしかないのでわかりづらいが)を群間変動と呼び、〇群内・△群内のばらつきを群内変動と呼ぶ。

両者は全変動との間に、以下のような関係をもつ。

全変動=群間変動+群内変動

つまり、全変動は群間変動と群内変動に分解することができる。

この関係に基づいた図4のような操作を”変動の分解”と呼ぶ。

図に戻ると、各群の平均値には確かに違いがみられるが、群内のばらつきが互いの平均値を大きく超えてばらついている。つまり、群間変動に対して群内変動がかなり大きい。そのため、異なるシンボルの形の間に本当は差があったとしても、それが検出しづらくなっている恐れがある。

いったん最初に戻り、今度は、1. 色の影響を調べて、2. 次に形の影響を調べる、という方法を取ることにする。

色によって差があるか調べるため、異なる色で3つに分け、各群の平均値を算出する。

図5

先ほどと同じように、全変動を(色の)群間変動と群内変動に分解することができた。赤が小さく青が大きく、緑はその中間に位置していることがわかる。

今度は、各群の群内変動そのものに注目してみよう。よく見ると、赤群でも青群でも緑群でも、〇が下に、△が上に位置する傾向にありそうだ。言い換えると、この群内変動はシンボルの形の影響を受けている可能性がある。

このような、形の影響を含む群内変動だけにもっと注目するため、色の影響は無視して考えたい。

そのために、少しトリッキーだが、各群を全平均に向かって上下方向に丸ごと平行移動させ、各群の平均の水平線が全平均の水平線に一致するように揃えてしまおう(各点ごとに、その点が属する群の平均と全平均との差分を取ったことになる)。

図6

これは、全変動からの色の群間変動の引き算に相当する。これができるのは、全変動=群間変動+群内変動という関係があるからである。

色の影響は取り除かれたので、すべてを一群にまとめなおそう。

図7

〇と△の差を比較するため(形の影響)、これを形でさらに2群に分け、各群の平均値を算出する。

図8

図4と比較すればわかるように、最初に全データを形で分けた時より、明らかに群内変動が小さくなっている。色の影響を取り除いたことにより、形の影響が見やすく(高い精度で検証できるように)なったのである。

図6-7と同じ操作をして、形の影響も取り除いてしまおう。

図9

山なりの密度プロットを示す変動の小さい点の集団が残された。このように、全変動からモデルに入れた要因の変動を取り除いたものを、モデルの誤差または残差と呼ぶ。線形モデルの各要因の影響の有意性は、基本的に群間変動と誤差を比べることで行われる。

変動が分解される過程をおさらいすると以下のようになる。

図10

これを改めて式で書き下すと、教科書等でよく目にするお馴染みの式になる。

このように、線形モデルは変動を分解することで各要因の影響を高い精度で検証できる枠組みである。上の説明では、色の影響を取り除くことで形の影響が見やすくなると説明したが、誤差からは形と色双方の影響が取り除かれているため、見方を変えれば色の影響もより高い精度で検証できるようになっている。このことは、適切な要因のセットをモデルに組み込むことで、互いの影響をより検証しやすくなることを意味している。(ただし、要因を増やし過ぎるとモデルが複雑になるので避けた方がよい)

Rで作る線形モデル

最後に、Rによる線形モデルの記法・作り方を説明する。

関数と記法

線形モデルはlm関数によって作成できる。lm関数では、1番目の引数にモデル式が入り、2番目に線形モデルを作るためのデータセット(データフレーム)が入る。

データ"iris"を使って、Sepal.Lengthを目的変数にして線形モデルを作成してみる。

data(iris) #データの読み込み


##線形モデル作成

m.intercept <- lm(Sepal.Length ~ 1, iris) #Y=intercept+ε

m.Species <- lm(Sepal.Length ~ Species, iris) #Y=intercept+X+ε

m.PLength <- lm(Sepal.Length ~ Petal.Length, iris) #Y=intercept+X+ε

m.SpeciesPLength <- lm(Sepal.Length ~ Species + Petal.Length, iris) #Y=intercept+X1+X2+ε

m.SpeciesbyPLength <- lm(Sepal.Length ~ Species*Petal.Length, iris) #Y=intercept+X1+X2+X1xX2+ε

m.SpeciesbyPLength2 <- lm(Sepal.Length ~ Species + Petal.Length + Species:Petal.Length, iris) #m.SpeciesbyPLengthと全く同じモデルが作成される


##作成したモデルの概要

summary(m.intercept)

summary(m.Species)

summary(m.PLength)

summary(m.SpeciesPLength)

summary(m.SpeciesbyPLength)

summary(m.SpeciesbyPLength2)

切片(intercept)は1で表されるが、切片のみモデルでなければモデル式からは省略可能である。また、記号*:が登場しているが、これは"交互作用"項を作るための記法である。Rでは、要因1と2の交互作用X1×X2はX1:X2と表される。Y ~ X1*X2Y ~ X1 + X2 + X1:X2 と全く同じである。右のように書き下すのは面倒なので、モデル式上は普通は*を使うことが多い。

交互作用の説明はこのページの最後で行う。

実践

”線形モデルの考え方”のセクションを、線形モデルを使って改めて理解し直してみよう。

#データ作成


set.seed(101)


c.red <- rnorm(20, 3, 5)

c.blue <- rnorm(20, 20, 5)

c.green <- rnorm(20, 10, 5)

t.red <- rnorm(20, 10, 5)

t.blue <- rnorm(20, 27, 5)

t.green <- rnorm(20, 17, 5)


data <- data.frame(

  Value=c(c.red, c.blue, c.green, t.red, t.blue, t.green), 

  Symbol=c(rep("c", 60), rep("t", 60)), 

  Color=c(rep("red", 20), rep("blue", 20), rep("green", 20), 

          rep("red", 20), rep("blue", 20), rep("green", 20)))

data$Symbol <- as.factor(data$Symbol)

data$Color <- as.factor(data$Color)


head(data)

以上のスクリプトをコピペすると、上記セクションのデータを作成することができる。

Symbolをシンボルの形に、Colorをシンボルの色と読み替えてほしい。

各々の群にはそれぞれ20個のデータが存在する。

まず、図3を線形モデルで表現してみよう。

図3の上部にある式の通りに、線形モデルを作成してみる。

m1 <- lm(Value ~ 1, data)


summary(m1)


mean(data$Value)

> summary(m1)


Call:

lm(formula = Value ~ 1, data = data)


Residuals:

    Min      1Q  Median      3Q     Max 

-21.696  -7.709  -1.001   7.931  21.817 


Coefficients:

            Estimate Std. Error t value Pr(>|t|)    

(Intercept)  14.4441     0.8831   16.36   <2e-16 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 9.674 on 119 degrees of freedom


> mean(data$Value)

[1] 14.44413

Coefficientsのリストのうち、(Intercept)の行のEstimateを、mean関数で計算した全平均と比較してみると、完全に一致している。図3の全平均とも見比べてみてほしい。また、Residual standard errorの数値は”全変動”を示している(sd(data$Value)を計算すると、これも9.674となる)。

次に、図4を表現してみよう。

図4のような、シンボルの形という要因による変動の分解は、線形モデルの説明変数にシンボルの形(Symbol)を投入することで行うことができる。

m2 <- lm(Value ~ Symbol, data)


summary(m2)


with(data, tapply(Value, Symbol, mean))

なお、tapply関数はベクトルに対してカテゴリごとに指定の関数を適用する関数であり、with関数はカッコ内で指定したデータフレームの列名によってベクトルを表すことができるようになる関数である。

> summary(m2)


Call:

lm(formula = Value ~ Symbol, data = data)


Residuals:

     Min       1Q   Median       3Q      Max 

-17.6929  -6.9881  -0.9527   6.6103  17.8139 


Coefficients:

            Estimate Std. Error t value Pr(>|t|)    

(Intercept)   10.441      1.141   9.152 2.02e-15 ***

Symbolt        8.005      1.613   4.962 2.37e-06 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 8.837 on 118 degrees of freedom

Multiple R-squared:  0.1726,  Adjusted R-squared:  0.1656 

F-statistic: 24.62 on 1 and 118 DF,  p-value: 2.371e-06


> with(data, tapply(Value, Symbol, mean))

       c        t 

10.44139 18.44688 

ここでも、Coefficientsのリストにある、InterceptとSymbolの行のEstimateに注目しよう。

InterceptのEstimateとマニュアルで計算したcの平均が、InterceptのEstimate+SymboltのEstimate(10.441+8.005)とbの平均が一致している。図4の平均値も参照のこと。また、Residual standard errorの値が9.674から8.837に下がっている。

図5でもまったく同じことが可能である。

m3 <- lm(Value ~ Color, data)


summary(m3)


with(data, tapply(Value, Color, mean))

> summary(m3)


Call:

lm(formula = Value ~ Color, data = data)


Residuals:

     Min       1Q   Median       3Q      Max 

-14.8119  -4.1897   0.1287   3.6635  14.4522 


Coefficients:

            Estimate Std. Error t value Pr(>|t|)    

(Intercept)   6.0566     0.9875   6.133 1.20e-08 ***

Colorblue    18.0040     1.3966  12.892  < 2e-16 ***

Colorgreen    7.1586     1.3966   5.126 1.18e-06 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 6.246 on 117 degrees of freedom

Multiple R-squared:  0.5902,  Adjusted R-squared:  0.5832 

F-statistic: 84.26 on 2 and 117 DF,  p-value: < 2.2e-16


> with(data, tapply(Value, Color, mean))

      red      blue     green 

 6.056595 24.060584 13.215225 

InterceptのEstimateはColorのredの平均に(6.566)、

InterceptのEstimate+ColorblueのEstimateはColorのblueの平均に(24.061)、

InterceptのEstimate+ColorgreenのEstimateはColorのgreenの平均に(13.215)、それぞれ一致している(図5の平均値参照)。

また、Residual standard errorの値が9.674から6.246に下がっている。

このように、線形モデルとは、「目的変数の平均値が説明変数の値によってどう変化するかを表現するモデル」であると言うことができる。

さらに、図5のモデルにShoriAを説明変数として投入し、図8-9と同じことを行う。

m4 <- lm(Value ~ Symbol + Color, data)


summary(m4)


aggregate(Value ~ Symbol + Color, data, mean)

なお、aggregate関数はtapply関数と機能は似ているが、関数を適用するカテゴリの種類を2つ以上指定できる。

> summary(m4)


Call:

lm(formula = Value ~ Symbol + Color, data = data)


Residuals:

     Min       1Q   Median       3Q      Max 

-11.1367  -3.2716  -0.0953   3.6270  10.4495 


Coefficients:

            Estimate Std. Error t value Pr(>|t|)    

(Intercept)   2.0538     0.8712   2.357   0.0201 *  

Symbolt       8.0055     0.8712   9.189 1.89e-15 ***

Colorblue    18.0040     1.0670  16.873  < 2e-16 ***

Colorgreen    7.1586     1.0670   6.709 7.54e-10 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 4.772 on 116 degrees of freedom

Multiple R-squared:  0.7628,  Adjusted R-squared:  0.7567 

F-statistic: 124.4 on 3 and 116 DF,  p-value: < 2.2e-16


> aggregate(Value ~ Symbol + Color, data, mean)

  Symbol  Color     Value

1      c    red  2.513413

2      t    red  9.599777

3      c   blue 19.974886

4      t   blue 28.146282

5      c  green  8.835865

6      t  green 17.594584

Residual standard errorは6.246から4.772にさらに下がっている。

いっぽう、本来であれば、

Intercept(2.0538)がSymbol(c)Color(red)の平均(2.513413)に、

Intercept+Symbolt(10.059)がSymbol(t)Color(red)の平均(9.599777)に、

という感じに一致していくはずだが、モデルと実際の平均値に食い違いが見られる。

これは、このモデルがSymbolとColorとの"交互作用"を考慮していないからである。

丸・赤と三角・赤の平均値の差と、丸・青と三角・青の平均値の差と、丸・緑と三角・緑の平均値の差がすべて一致するようなことは実際にはあまりありそうにないことである。にもかかわらず、このモデルは色が赤でも青でも緑でも、形における丸と三角の差は等しく8.0055であると仮定している。

Symbolにおけるcとtの差が、Colorの水準(red,  blue, green)ごとに異なる、という効果をSymbolとColorの交互作用と呼ぶ。

最後に、交互作用も含めたモデルを作ってみる。

m5 <- lm(Value ~ Symbol*Color, data)


summary(m5)


aggregate(Value ~ Symbol + Color, data, mean)

> summary(m5)


Call:

lm(formula = Value ~ Symbol * Color, data = data)


Residuals:

     Min       1Q   Median       3Q      Max 

-11.5133  -3.5515   0.0192   3.5699  10.0728 


Coefficients:

                Estimate Std. Error t value Pr(>|t|)    

(Intercept)        2.513      1.073   2.342   0.0209 *  

Symbolt            7.086      1.518   4.668 8.35e-06 ***

Colorblue         17.461      1.518  11.503  < 2e-16 ***

Colorgreen         6.322      1.518   4.165 6.08e-05 ***

Symbolt:Colorblue  1.085      2.147   0.505   0.6142    

Symbolt:Colorgreen 1.672      2.147   0.779   0.4376    

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 4.8 on 114 degrees of freedom

Multiple R-squared:  0.7641,  Adjusted R-squared:  0.7538 

F-statistic: 73.87 on 5 and 114 DF,  p-value: < 2.2e-16


> aggregate(Value ~ Symbol + Color, data, mean)

  Symbol  Color     Value

1      c    red  2.513413

2      t    red  9.599777

3      c   blue 19.974886

4      t   blue 28.146282

5      c  green  8.835865

6      t  green 17.594584


c.redの平均       = Intercept

t.redの平均       = Intercept + Symbolt

c.blueの平均    = Intercept + Colorblue

t.blueの平均    = Intercept + Symbolt + Colorblue + Symbolt:Colorblue

c.greenの平均 = Intercept + Colorgreen

t.greenの平均 = Intercept + Symbolt + Colorgreen + Symbolt:Colorgreen

のように、完全に一致しているはずである。

'18 12/26