ダミー変数     Last modified: Jun 14, 2005

名義尺度変数や順序尺度変数を含む重回帰分析をするとき,lm 関数を使えば,自分でダミー変数に変換する必要もない。

使用するデータ

以下のような,2001 年 8 月の山形県天童市における最高気温(kion)と天気(tenki; 雨:ame,曇り:kumori,晴れ:hare)のデータが,ファイルに保存されている。
kion,tenki
2001/8/1,29.2,kumori
2001/8/2,24.6,kumori
2001/8/3,31.4,kumori
2001/8/4,30.5,kumori
2001/8/5,28.1,hare
2001/8/6,27.4,hare
2001/8/7,23.9,kumori
2001/8/8,27.6,hare
2001/8/9,25.5,kumori
2001/8/10,25.5,kumori
2001/8/11,29.3,kumori
2001/8/12,22.6,kumori
2001/8/13,27.9,hare
2001/8/14,32.5,hare
2001/8/15,32.7,hare
2001/8/16,33.0,hare
2001/8/17,33.0,hare
2001/8/18,26.7,hare
2001/8/19,28.1,hare
2001/8/20,30.4,hare
2001/8/21,29.8,kumori
2001/8/22,27.9,ame
2001/8/23,30.0,hare
2001/8/24,30.3,hare
2001/8/25,32.0,hare
2001/8/26,29.6,kumori
2001/8/27,26.4,kumori
2001/8/28,29.7,hare
2001/8/29,29.3,hare
2001/8/30,25.5,ame
2001/8/31,22.4,kumori

このデータを,
x <- read.csv("weather.csv")
で入力すると,次のようになる。

          kion  tenki
2001/8/1  29.2 kumori
2001/8/2  24.6 kumori
2001/8/3  31.4 kumori
2001/8/4  30.5 kumori
2001/8/5  28.1   hare
2001/8/6  27.4   hare
2001/8/7  23.9 kumori
2001/8/8  27.6   hare
2001/8/9  25.5 kumori
2001/8/10 25.5 kumori
2001/8/11 29.3 kumori
2001/8/12 22.6 kumori
2001/8/13 27.9   hare
2001/8/14 32.5   hare
2001/8/15 32.7   hare
2001/8/16 33.0   hare
2001/8/17 33.0   hare
2001/8/18 26.7   hare
2001/8/19 28.1   hare
2001/8/20 30.4   hare
2001/8/21 29.8 kumori
2001/8/22 27.9    ame
2001/8/23 30.0   hare
2001/8/24 30.3   hare
2001/8/25 32.0   hare
2001/8/26 29.6 kumori
2001/8/27 26.4 kumori
2001/8/28 29.7   hare
2001/8/29 29.3   hare
2001/8/30 25.5    ame
2001/8/31 22.4 kumori
日付は行の名前になり,天気は文字(character)ではなく因子(factor)になる。しかし,因子にされるときに,アルファベット順にされるので, ame が 1,hare が 2,kumori が 3という数値を与えられる因子になっている。
> x$tenki
 [1] kumori kumori kumori kumori hare   hare   kumori hare   kumori kumori
[11] kumori kumori hare   hare   hare   hare   hare   hare   hare   hare  
[21] kumori ame    hare   hare   hare   kumori kumori hare   hare   ame   
[31] kumori
Levels: ame hare kumori
> levels(x$tenki)
[1] "ame"    "hare"   "kumori"
> as.integer(x$tenki)
 [1] 3 3 3 3 2 2 3 2 3 3 3 3 2 2 2 2 2 2 2 2 3 1 2 2 2 3 3 2 2 1 3
気温との相関を考えると,ame, kumori, hare の順に 1, 2, 3 が割り当てられる因子にしたい。そこで,
> x$tenki <- factor(x$tenki, levels=c("ame", "kumori", "hare"))
と,levels パラメータを与えて再因子化する(levels に割り付けたい順序で因子を指定する)。
> x$tenki
 [1] kumori kumori kumori kumori hare   hare   kumori hare   kumori kumori
[11] kumori kumori hare   hare   hare   hare   hare   hare   hare   hare  
[21] kumori ame    hare   hare   hare   kumori kumori hare   hare   ame   
[31] kumori
Levels: ame kumori hare
> levels(x$tenki)
[1] "ame"    "kumori" "hare"  
> as.integer(x$tenki)
 [1] 2 2 2 2 3 3 2 3 2 2 2 2 3 3 3 3 3 3 3 3 2 1 3 3 3 2 2 3 3 1 2

factor を使った lm

> ans <- lm(kion ~ tenki, x)
> summary(ans)

Call:
lm(formula = kion ~ tenki, data = x)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.5769 -1.9188 -0.2188  2.4522  4.4231 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  26.7000     1.8481  14.447 1.66e-14 ***
tenkikumori   0.2769     1.9852   0.139    0.890    
tenkihare     3.2188     1.9602   1.642    0.112    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.614 on 28 degrees of freedom
Multiple R-Squared: 0.2646,	Adjusted R-squared: 0.2121 
F-statistic: 5.038 on 2 and 28 DF,  p-value: 0.01353

ダミー変数を作ってから lm

 kumori <- x$tenki=="kumori"
> hare <- x$tenki=="hare"
> x$tenki
 [1] kumori kumori kumori kumori hare   hare   kumori hare   kumori
[10] kumori kumori kumori hare   hare   hare   hare   hare   hare  
[19] hare   hare   kumori ame    hare   hare   hare   kumori kumori
[28] hare   hare   ame    kumori
Levels: ame kumori hare
> kumori
 [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
[12]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
[23] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE
> hare
 [1] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE
[12] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
[23]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE
> ans2 <- lm(x$kion ~ kumori+hare)
> summary(ans2)

Call:
lm(formula = x$kion ~ kumori + hare)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.5769 -1.9188 -0.2188  2.4522  4.4231 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  26.7000     1.8481  14.447 1.66e-14 ***
kumoriTRUE    0.2769     1.9852   0.139    0.890    
hareTRUE      3.2188     1.9602   1.642    0.112    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.614 on 28 degrees of freedom
Multiple R-Squared: 0.2646,	Adjusted R-squared: 0.2121 
F-statistic: 5.038 on 2 and 28 DF,  p-value: 0.01353
TRUE/FALSE は,1/0 として利用されるが,変数名の作られ方を見るとちょっと余計な操作が入っているようだ。実際には以下のようにした方がよさそう。
> kumori <- as.integer(x$tenki=="kumori")
> hare <- as.integer(x$tenki=="hare")
> x$tenki
 [1] kumori kumori kumori kumori hare   hare   kumori hare   kumori
[10] kumori kumori kumori hare   hare   hare   hare   hare   hare  
[19] hare   hare   kumori ame    hare   hare   hare   kumori kumori
[28] hare   hare   ame    kumori
Levels: ame kumori hare
> kumori
 [1] 1 1 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1
> hare
 [1] 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0
> ans3 <- lm(x$kion ~ kumori+hare)
> summary(ans3)

Call:
lm(formula = x$kion ~ kumori + hare)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.5769 -1.9188 -0.2188  2.4522  4.4231 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  26.7000     1.8481  14.447 1.66e-14 ***
kumori        0.2769     1.9852   0.139    0.890    
hare          3.2188     1.9602   1.642    0.112    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.614 on 28 degrees of freedom
Multiple R-Squared: 0.2646,	Adjusted R-squared: 0.2121 
F-statistic: 5.038 on 2 and 28 DF,  p-value: 0.01353 

蛇足

> m <- by(x$kion, x$tenki, mean) # 天気別に最高気温の平均値を求める
> m["ame"] # 添え字は factor
 ame 
26.7 
> m["kumori"]-m["ame"]
   kumori # 曇りのときの平均値から雨のときの平均値を引いたものが,
0.2769231 # 曇りのときの偏回帰係数になっている
> m["hare"]-m["ame"]
   hare   # 晴れのときの平均値から雨のときの平均値を引いたものが,
3.21875   # 晴れのときの偏回帰係数になっている


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh