No.05385 カテゴリー変数とVIFについて  【Sai】 2008/01/15(Tue) 21:39

多重共線性の指標であるVIFについて質問させてください。
カテゴリー変数を独立変数としたとき,VIFはどのように計算されるのでしょうか?
http://aoki2.si.gunma-u.ac.jp/lecture/Regression/mreg/mreg6.html

一応自分でも検索をして探してみたのですが,カテゴリー変数の場合VIFの扱いがどうなるのかわかりませんでした。しかも実際に計算してみるとカテゴリー変数名によって基準点が変わるためVIFの値も変わるというわけのわからないことになってしまいました。
少々長くなりますが,以下にRでやってみた例を示します。
> x1
Fertile Yield
1 C 150
2 C 80
3 S 100
4 P 100
5 A 200
6 M 1
7 F 60
8 A 200
9 A 30
10 A 250
11 A 20
12 M 20
13 A 30
14 N 40
15 C 200
16 P 80
17 C 120
18 C 150
19 C 350
20 P 400
21 P 450
22 A 130
23 C 100
24 C 250
25 P 600

> x2   #Fertile内のAの代わりにOというカテゴリーを使用し,それ以外は変化なし
Fertile Yield
1 C 150
2 C 80
3 S 100
4 P 100
5 O 200
6 M 1
7 F 60
8 O 200
9 O 30
10 O 250
11 O 20
12 M 20
13 O 30
14 N 40
15 C 200
16 P 80
17 C 120
18 C 150
19 C 350
20 P 400
21 P 450
22 O 130
23 C 100
24 C 250
25 P 600

> res1=glm(Yield~Fertile,data=x1)  #Yieldを従属変数,Fertileを独立変数とし一般化線形モデルにあてはめた
> res2=glm(Yield~Fertile,data=x2)

> vif(res1)  #基準点はA
FertileC FertileF FertileM FertileN FertileP FertileS
1.4571 1.0971 1.1829 1.0971 1.3714 1.0971

> vif(res2)  #基準点はC,先ほどは消えていたAの代わりにOが。そして使用するカテゴリー名でVIFに変化が??
FertileF FertileM FertileN FertileO FertileP FertileS
1.08 1.15 1.08 1.35 1.30 1.08
上記のように,使用するアルファベットによりVIFが変わってきます。というかVIFの定義から考えても同一変数内のカテゴリー間で相関があるというのはどういう解釈をすればよいのでしょうか?

No.05386 Re: カテゴリー変数とVIFについて  【青木繁伸】 2008/01/15(Tue) 21:56

まず,「使用するアルファベットにより結果が変わる」ということから解決しましょう。

使用するア ルファベットによりではなく,factor変数の定義により変わるように見えるということです。アルファベットを変えなくても,factor 関数の levels と labels 引数で自分でちゃんと定義しましょう。factor変数にするときに基準とする変数は結果の中に出てこなくなりますから,それをちゃんと自分で指定しま しょう。

No.05387 Re: カテゴリー変数とVIFについて  【青木繁伸】 2008/01/15(Tue) 22:17

「同一変数内のカテゴリー間で相関があるというのはどういう解釈をすればよいのでしょうか」

相関があるのですから,「相関があるというのはどういう解釈をすればよいのか」という質問は理解できないのですけど?
> x1$A  <- ifelse(x1$Fertile == "A", 1, 0)
> x1$C <- ifelse(x1$Fertile == "C", 1, 0)
> x1$F <- ifelse(x1$Fertile == "F", 1, 0)
> x1$M <- ifelse(x1$Fertile == "M", 1, 0)
> x1$N <- ifelse(x1$Fertile == "N", 1, 0)
> x1$P <- ifelse(x1$Fertile == "P", 1, 0)
> x1$S <- ifelse(x1$Fertile == "S", 1, 0)
> x1
Fertile Yield A C F M N P S
1 C 150 0 1 0 0 0 0 0
2 C 80 0 1 0 0 0 0 0
3 S 100 0 0 0 0 0 0 1
4 P 100 0 0 0 0 0 1 0
5 A 200 1 0 0 0 0 0 0
6 M 1 0 0 0 1 0 0 0
7 F 60 0 0 1 0 0 0 0
8 A 200 1 0 0 0 0 0 0
9 A 30 1 0 0 0 0 0 0
10 A 250 1 0 0 0 0 0 0
11 A 20 1 0 0 0 0 0 0
12 M 20 0 0 0 1 0 0 0
13 A 30 1 0 0 0 0 0 0
14 N 40 0 0 0 0 1 0 0
15 C 200 0 1 0 0 0 0 0
16 P 80 0 0 0 0 0 1 0
17 C 120 0 1 0 0 0 0 0
18 C 150 0 1 0 0 0 0 0
19 C 350 0 1 0 0 0 0 0
20 P 400 0 0 0 0 0 1 0
21 P 450 0 0 0 0 0 1 0
22 A 130 1 0 0 0 0 0 0
23 C 100 0 1 0 0 0 0 0
24 C 250 0 1 0 0 0 0 0
25 P 600 0 0 0 0 0 1 0
> round(cor(x1[,3:9]),2)
A C F M N P S
A 1.00 -0.43 -0.13 -0.18 -0.13 -0.31 -0.13
C -0.43 1.00 -0.14 -0.20 -0.14 -0.34 -0.14
F -0.13 -0.14 1.00 -0.06 -0.04 -0.10 -0.04
M -0.18 -0.20 -0.06 1.00 -0.06 -0.15 -0.06
N -0.13 -0.14 -0.04 -0.06 1.00 -0.10 -0.04
P -0.31 -0.34 -0.10 -0.15 -0.10 1.00 -0.10
S -0.13 -0.14 -0.04 -0.06 -0.04 -0.10 1.00

No.05388 Re: カテゴリー変数とVIFについて  【青木繁伸】 2008/01/15(Tue) 22:50

VIFはダミー変数を作って,件のページにあるtolerance関数を使えば計算できます(連続変数を対象にする場合と同じです)
> x1$A  <- ifelse(x1$Fertile == "A", 1, 0)
> x1$C <- ifelse(x1$Fertile == "C", 1, 0)
> x1$F <- ifelse(x1$Fertile == "F", 1, 0)
> x1$M <- ifelse(x1$Fertile == "M", 1, 0)
> x1$N <- ifelse(x1$Fertile == "N", 1, 0)
> x1$P <- ifelse(x1$Fertile == "P", 1, 0)
> x1$S <- ifelse(x1$Fertile == "S", 1, 0)

> x1
Fertile Yield A C F M N P S
1 C 150 0 1 0 0 0 0 0
2 C 80 0 1 0 0 0 0 0
3 S 100 0 0 0 0 0 0 1
4 P 100 0 0 0 0 0 1 0
5 A 200 1 0 0 0 0 0 0
6 M 1 0 0 0 1 0 0 0
7 F 60 0 0 1 0 0 0 0
8 A 200 1 0 0 0 0 0 0
9 A 30 1 0 0 0 0 0 0
10 A 250 1 0 0 0 0 0 0
11 A 20 1 0 0 0 0 0 0
12 M 20 0 0 0 1 0 0 0
13 A 30 1 0 0 0 0 0 0
14 N 40 0 0 0 0 1 0 0
15 C 200 0 1 0 0 0 0 0
16 P 80 0 0 0 0 0 1 0
17 C 120 0 1 0 0 0 0 0
18 C 150 0 1 0 0 0 0 0
19 C 350 0 1 0 0 0 0 0
20 P 400 0 0 0 0 0 1 0
21 P 450 0 0 0 0 0 1 0
22 A 130 1 0 0 0 0 0 0
23 C 100 0 1 0 0 0 0 0
24 C 250 0 1 0 0 0 0 0
25 P 600 0 0 0 0 0 1 0
> tolerance(x1[4:9])
tolerance VIF
C 0.6862745 1.457143 あなたの計算と同じになっていますね
F 0.9114583 1.097143
M 0.8454106 1.182857
N 0.9114583 1.097143
P 0.7291667 1.371429
S 0.9114583 1.097143

> tolerance(x1[3:8])
tolerance VIF
A 0.1736111 5.76
C 0.1633987 6.12
F 0.5208333 1.92
M 0.3623188 2.76
N 0.5208333 1.92
P 0.2083333 4.80
連続変数の場合もそうですが,使う変数セットによって VIFは異なります(相関係数からスタートして計算されるのですから相関係数行列が異なれば結果が異ならない方が不思議です)

tolerance(x1[3:8]) の VIF が大きいのは,S の1は1ケースしかない(変なデータ?)だからですね。きっと。

No.05389 Re: カテゴリー変数とVIFについて  【Sai】 2008/01/16(Wed) 00:56

>アルファベットを変えなくても,factor 関数の levels と labels 引数で自分でちゃんと定義しましょう。

えっとどういうことでしょうか??アルファベットを変えるときは,
> levels(x1$Fertile)=c("A","B","C","D","E","F","G")
> x1
Fertile Yield
1 B 150
2 B 80
3 G 100
4 F 100
5 A 200
6 D 1
7 C 60
8 A 200
9 A 30
10 A 250
11 A 20
12 D 20
13 A 30
14 E 40
15 B 200
16 F 80
17 B 120
18 B 150
19 B 350
20 F 400
21 F 450
22 A 130
23 B 100
24 B 250
25 F 600
のようにしか変える方法を知らないもので…(汗)
一応?factorも見たのですが,ちょっとわかりませんでした…。

>factor変数にするときに基準とする変数は結果の中に出てこなくなりますから,それをちゃんと自分で指定しましょう。

自分で指定できるのですか?てっきりアルファベット順で一番最初に来るものが強制的に基準になるものだと思っていて,自分で切片を動かして各係数を調整していました(汗)もし簡単な引数であればご教授願えますでしょうか…。

>相関があるのですから,「相関があるというのはどういう解釈をすればよいのか」という質問は理解できないのですけど?

個 人的には相関というものは「2つの変数があり,一方が増加したときにもう一方が増加または減少の傾向があること」と理解しています。この場合1か0の値か ら分散や共分散をだして相関係数を出しているわけですよね。なんというか直感として1と0の数つまり,変数内でそのカテゴリーの占める割合,で相関係数ひ いてはVIFがでるのに違和感を感じたもので…。身長体重関係のようにカテゴリーAとBがわかりやすくないからでしょうか,「AとBの間に相関がある,こ れはこういう理由である」という言い回しがこのYield~Fertileの式ではどう言えるか,ちょっとわかりません…。

>連続変数の場合もそうですが,使う変数セットによって VIFは異なります

ですよね。上記の結果からAとOで基準点を変えたときにVIFの値も変わりました。もしVIFが10を超えていたのに,この基準点を変える作業によって10未満になったとしたら,それはその要因を加えてもいいことになるのでしょうか。

>tolerance(x1[3:8]) の VIF が大きいのは,S の1は1ケースしかない(変なデータ?)だからですね。

えっと…すいませんわかりません(汗)何故[3:8]なのにSが関係するのでしょうか…?一応青木先生のサイトでtoleranceについては理解していると思っていたのですが,解説をお願いします…。

No.05392 Re: カテゴリー変数とVIFについて  【青木繁伸】 2008/01/16(Wed) 09:12

> x <- c("m", "f")
> levels(factor(x)) # これでは辞書順
[1] "f" "m"
> levels(factor(x, levels=c("m", "f"))) # 定義順
[1] "m" "f"
> levels(factor(x, levels=c("m", "f"), labels=c("male", "female"))) # ラベルも付ける
[1] "male" "female"
lm, glm などでは一番目のfactorがベースラインになる。ベースラインは自分で決めるもの。であるから,levelsで自分で決めればよい。

>何故[3:8]なのにSが関係するのでしょうか

ちょいと間違えてしまいました。

No.05393 Re: カテゴリー変数とVIFについて  【青木繁伸】 2008/01/16(Wed) 09:28

> この場合1か0の値から分散や共分散をだして相関係数を出しているわけですよね

二変数間の相関は不変ですよね。
ただ,複数の変数から一つの変数を除いてできる相関係数行列は全部違いますね(含まれる変数自体が違うのだから当たり前)。
その相関係数行列から計算されるものが違っても,それも当たり前。
相関係数行列が違うのに同じ答えが出ると考える方が不自然。

注 意しておきたいのは,今回の例だとFertile のうち,ベースラインをどれにしても(どのカテゴリーを除いたとしても)できあがる重回帰式の見かけは異なる(偏回帰係数が違うように見える)が,本質的 には同一(予測値を計算してみれば分かる)ということ。これは,カテゴリー変数(ダミー変数)の階数はカテゴリー数−1であること。要するに,1つは不要 であるということ。

No.05395 Re: カテゴリー変数とVIFについて  【Sai】 2008/01/16(Wed) 14:34

>levelsで自分で決めればよい
なるほど,この式を使うと普通fが基準となるところをm基準で解析できるわけですね。よくわかりました,ありがとうございます。

>複数の変数から一つの変数を除いてできる相関係数行列は全部違いますね
確かに。それは理解しています。連続型であろうとカテゴリカル型であろうと,相関係数行列ができることはわかります。なんだかやりとりをしているうちにもっと根本的なところで躓いている気がしてきました(汗)以下でちょっと疑問を整理させてください。

私の疑問は二つでした。
1.カテゴリー変数内のカテゴリーは一つ一つを独立変数として扱っているのか
2.1に関わらず,同一変数内の各カテゴリーは独立ではないのか

まず1.から。
http://aoki2.si.gunma-u.ac.jp/lecture/Regression/mreg/mreg6.html
改めてこのページから引用させていただきます。「独立変数相互間に相関の高いものは含めないほうがよい」とあるので私の式の場合,Fertile"内"の相関は関係ないのかなぁ,と思ったのがきっかけです。
ただ,青木先生とやりとりをしているうちに,1つのカテゴリー変数Fertileがa,c,f,m,n,p,sの"7つの独立変数"になっている,という結論に至りましたので,1.は解決したつもりです。

次に2.です。
こ れも1.がわかれば,同一カテゴリー変数内でも相関があってはいけない,なぜなら各カテゴリーはそれぞれが別個の独立変数のように振舞うからだ,という結 論に至ることができそうです。というか,カテゴリー変数内でもそもそも独立ではないのですね。あるカテゴリーが1になった場合,他は0なわけですから,そ もそも独立と考えるほうがおかしかったことに気づきました。

個人的に以上のような理解をしましたが,間違っているでしょうか。

あと,最後に確認なのですが,

>連続変数の場合もそうですが,使う変数セットによって VIFは異なります
>要するに,1つは不要であるということ

ここから察するに,あるカテゴリーを基準にすることによりVIFが小さくなる(共線性が低くなる)のであれば,それはアリだということですよね?

No.05400 Re: カテゴリー変数とVIFについて  【青木繁伸】 2008/01/16(Wed) 16:46

> 1.カテゴリー変数内のカテゴリーは一つ一つを独立変数として扱っているのか

ひとつひとつを個別の独立変数として扱うのは間違っています
この問題が表れるのは変数選択をするときです
もしあるダミー変数のがモデルから捨てられる事になったら,そのダミー変数の元になっている変数から作られるダミー変数はセットで捨てなければなりません。採用されるときも同じです。

R はこのため,カテゴリー変数を factor というデータ型で扱います。factor 変数は自動的にダミー変数にされ,モデルに採用するのも棄却するのもfactor変数単位で行います。
自分でダミー変数を作って R の重回帰分析をやると,R はどのダミー変数がひとまとまりなのかわからないので,誤った変数選択をします。

> あるカテゴリーを基準にすることによりVIFが小さくなる(共線性が低くなる)のであれば,それはアリだということですよね?

見かけ上はそう言うことになると思います。しかし,実際に多重共線性が問題になるほどの問題は出ないのかも知れません。

No.05424 Re: カテゴリー変数とVIFについて  【Sai】 2008/01/17(Thu) 21:24

すいません,ネット環境と離れていたため返信が遅れました。

>そのダミー変数の元になっている変数から作られるダミー変数はセットで捨てなければなりません。

な るほど,それはそうですよね。Rで変数選択(Step等使用)をやると変数内のカテゴリーのうち,一つでも有意にきいていればその変数ごと残ります(例え 少しでもAICが低くするから?)。同一変数内のカテゴリー全てが有意である必要はないと思うので,AICを高めてしまわない限り有意じゃないカテゴリー を含む変数もモデルに組み入れています。
すいませんちょっと話がずれるのですけれども,

>自分でダミー変数を作って R の重回帰分析をやると,R はどのダミー変数がひとまとまりなのかわからないので,誤った変数選択をします。

以 前青木先生にお世話になったときに(No.4687),「カテゴリー変数の標準化偏回帰係数は自分でダミー変数を用意して計算させる」と教わったのです が,変数選択のときに支障がでますよね。ということは上記の引用文と合わせると,カテゴリー変数を含んだ変数選択をするときには最初はfactor型とし て(自分でダミーを用意しないで)計算させて,そのあと残った要因を自分でダミー変数に置き換えて標準化偏回帰係数に直せばよい,という解釈であっている のでしょうか。

>見かけ上はそう言うことになると思います。しかし,実際に多重共線性が問題になるほどの問題は出ないのかも知れません。

心強いお言葉です。ありがとうございます。

● 「統計学関連なんでもあり」の過去ログ--- 041 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る