名義尺度変数や順序尺度変数を含む重回帰分析をするとき,lm 関数を使えば,自分でダミー変数に変換する必要もない。
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
> 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
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.01353TRUE/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 # 晴れのときの偏回帰係数になっている