はじめよう実験計画

実験を早く終わらせるための技術

Rを使ったBox-Cox変換

誤差が正規分布に従う仮定

通常の線形回帰分析では、データの誤差が正規分布に従うことを仮定しているため、データの誤差が正規分布に従わない場合、そのままでは回帰分析を行うことが出来ません

図1を見てください。このデータに対して線形回帰モデルを当てはめてみると、青線のようになります。

f:id:Sturgeon:20200812211837p:plain

図1 データはxが大きいときばらつきも大きく、回帰直線はx=1のときのデータをあまり反映していない。

この直線はx=1のときのデータ点を通っていなことや、x=3, 4のデータのばらつきがやや大きいことから、もっとx=1, 2ときのデータ点を通る直線であるべきでは?と考えられます。

この回帰直線に対して、残差(Residuals)と予測値(Fitted values)をプロットしたものが図2です。図2より、予測値が小さいとき残差のばらつきは小さいですが、予測値が大きくなるにつれて残差のばらつきが大きくなっていることが分かります。

f:id:Sturgeon:20200524101659p:plain

図2. 残差プロット。予測値が小さいとき残差のばらつきは小さいですが、予測値が大きくなるにつれて残差のばらつきは大きくなっている。

したがって、誤差は正規分布に従っていないと考えれ、回帰直線も正しくないと考えられます。

このように誤差が正規分布に従わない場合、データyに何らかの変換を施してから回帰分析を実施する必要があります。

Box-Cox変換

Box-Cox変換では、y→yλの変換で、異なるλに対する回帰に用いるモデルについて、残差平方和を計算し比較することを考えます(残差平方和が小さいほど良いモデル)。

しかし、y→yλの変換を行うと残差のスケールも変換されますから、異なるλを用いて計算した残差平方和を直接比較することはできません。そこで、残差平方和を比較する際には、yλに変換する代わりに

y^{(\lambda)} = \left\{\begin{array}{c} \frac{y^{\lambda}-1}{\lambda} \ (\lambda\neq0)\\ \ln{(y)} \ (\lambda=0)\end{array}\right.\tag{1}

という変換を行って残差平方和を計算する、というのがBox-Cox変換のテクニックです。残差平方和を計算するときだけyλではなくy(λ)に変換することで、異なるλに対する残差平方和を比較することができるようになっています。そして、最も小さな残差平方和を与える(対数尤度最大の)λを見つけたら、実際にはy→yλの変換を行い回帰分析を行います。

Rを使ったBox-Cox変換

以下にRを使ったBox-Cox変換のコードを示します。データは図1のものです。

> x
 [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
> y
 [1]  0.34  0.91  6.31 17.15  0.12  2.94  8.37 11.82  1.23  2.14  9.75 10.95  0.70  2.36
[15]  6.09 17.20  1.75  2.86  9.82 14.35  0.12  4.55  7.24 16.82
> plot(x,y, col="blue")#図1
> result <- lm(y~x)
> abline(result, col="blue")#図1の青線
> 
> library(car)#carパッケージのboxCox関数でbox-Cox変換の対数尤度をプロット
> boxCox(result,  lambda = seq(-1, 1, 1/10))#図3
> 
> plot(x,y**0.5, col="red")#図4
> result2 <- lm(y**0.5~x)
> abline(result2, col="red")#図4の赤線

コードの中身としては、パッケージcarの関数boxCox(result, lambda = seq(-1, 1, 1/10))に、データresultを渡すだけです。すると、Box-Cox変換における対数尤度のプロットが図3のように出力されます。このグラフより、λが約0.5のとき(y→y0.5)対数尤度が最大、すなわち残差平方和が最小となることが分かります。

f:id:Sturgeon:20200524110818p:plain

図3. Box-Cox変換における対数尤度プロット。λが約0.5のとき対数尤度最大(残差平方和が最小)。

 次に、y→y0.5の変換を行い、そのデータに対して回帰分析をしたのが下の図4です(縦軸はy0.5)。

f:id:Sturgeon:20200524110928p:plain

図4. y→y0.5による変換後の回帰分析

変換前の図1と比べて、すべてのデータ点を偏りなく通る直線を引けていますね。実際、R2の値も0.87→0.92に増加しましたので、y→y0.5の変換により、データをよりよく説明するモデルができました。

まとめ

Box-Cox変換は、残差が変数xの値によって異なるとき、(従属)変数yをyλに変換し、yλに対する残差平方和がxの大きさに依らないようにする目的で行います。

λを決める際はyλではなくy(λ)(式(1)を参照)に変換して残差平方和が最も小さくなるようなλを選びます(実際の変換はyλであることに注意!)。この計算はRパッケージcarの関数boxCoxで行うことができます。

参考書籍

参考にした本は下のDesign and Analysis of Experiment 10th editionです。実験に必要な統計学の知識がたくさん書いてあります。