4.2.4 平均への回帰

ゴルトンの平均への回帰

4.2.5 Rにおけるデータの結合

pres08 <- read.csv("pres08.csv")  # 2008年のデータを読み込む
pres12 <- read.csv("pres12.csv")  # 2012年のデータを読み込む
## 2つのデータセットをざっと見る
head(pres08)
##   state.name state Obama McCain EV
## 1    Alabama    AL    39     60  9
## 2     Alaska    AK    38     59  3
## 3    Arizona    AZ    45     54 10
## 4   Arkansas    AR    39     59  6
## 5 California    CA    61     37 55
## 6   Colorado    CO    54     45  9
head(pres12)
##   state Obama Romney EV
## 1    AL    38     61  9
## 2    AK    41     55  3
## 3    AZ    45     54 11
## 4    AR    37     61  6
## 5    CA    60     37 55
## 6    CO    51     46  9
## 2つのデータフレームを結合
pres <- merge(pres08, pres12, by = "state")

## 結合したデータフレームを要約
summary(pres)
##     state            state.name           Obama.x          McCain     
##  Length:51          Length:51          Min.   :33.00   Min.   : 7.00  
##  Class :character   Class :character   1st Qu.:43.00   1st Qu.:40.00  
##  Mode  :character   Mode  :character   Median :51.00   Median :47.00  
##                                        Mean   :51.37   Mean   :47.06  
##                                        3rd Qu.:57.50   3rd Qu.:56.00  
##                                        Max.   :92.00   Max.   :66.00  
##       EV.x          Obama.y          Romney           EV.y      
##  Min.   : 3.00   Min.   :25.00   Min.   : 7.00   Min.   : 3.00  
##  1st Qu.: 4.50   1st Qu.:40.50   1st Qu.:41.00   1st Qu.: 4.50  
##  Median : 8.00   Median :51.00   Median :48.00   Median : 8.00  
##  Mean   :10.55   Mean   :49.06   Mean   :49.04   Mean   :10.55  
##  3rd Qu.:11.50   3rd Qu.:56.00   3rd Qu.:58.00   3rd Qu.:11.50  
##  Max.   :55.00   Max.   :91.00   Max.   :73.00   Max.   :55.00
## 例示のため変数名を変更
names(pres12)[1] <- "state.abb"

## 異なる名前の変数を用いてデータセットを結合
pres <- merge(pres08, pres12, by.x = "state", by.y = "state.abb")
summary(pres)
##     state            state.name           Obama.x          McCain     
##  Length:51          Length:51          Min.   :33.00   Min.   : 7.00  
##  Class :character   Class :character   1st Qu.:43.00   1st Qu.:40.00  
##  Mode  :character   Mode  :character   Median :51.00   Median :47.00  
##                                        Mean   :51.37   Mean   :47.06  
##                                        3rd Qu.:57.50   3rd Qu.:56.00  
##                                        Max.   :92.00   Max.   :66.00  
##       EV.x          Obama.y          Romney           EV.y      
##  Min.   : 3.00   Min.   :25.00   Min.   : 7.00   Min.   : 3.00  
##  1st Qu.: 4.50   1st Qu.:40.50   1st Qu.:41.00   1st Qu.: 4.50  
##  Median : 8.00   Median :51.00   Median :48.00   Median : 8.00  
##  Mean   :10.55   Mean   :49.06   Mean   :49.04   Mean   :10.55  
##  3rd Qu.:11.50   3rd Qu.:56.00   3rd Qu.:58.00   3rd Qu.:11.50  
##  Max.   :55.00   Max.   :91.00   Max.   :73.00   Max.   :55.00
## 2つのデータフレームをcbindで結合
pres1 <- cbind(pres08, pres12)
## 以下から,すべての変数が保たれていることがわかる
summary(pres1)
##   state.name           state               Obama           McCain     
##  Length:51          Length:51          Min.   :33.00   Min.   : 7.00  
##  Class :character   Class :character   1st Qu.:43.00   1st Qu.:40.00  
##  Mode  :character   Mode  :character   Median :51.00   Median :47.00  
##                                        Mean   :51.37   Mean   :47.06  
##                                        3rd Qu.:57.50   3rd Qu.:56.00  
##                                        Max.   :92.00   Max.   :66.00  
##        EV         state.abb             Obama           Romney     
##  Min.   : 3.00   Length:51          Min.   :25.00   Min.   : 7.00  
##  1st Qu.: 4.50   Class :character   1st Qu.:40.50   1st Qu.:41.00  
##  Median : 8.00   Mode  :character   Median :51.00   Median :48.00  
##  Mean   :10.55                      Mean   :49.06   Mean   :49.04  
##  3rd Qu.:11.50                      3rd Qu.:56.00   3rd Qu.:58.00  
##  Max.   :55.00                      Max.   :91.00   Max.   :73.00  
##        EV       
##  Min.   : 3.00  
##  1st Qu.: 4.50  
##  Median : 8.00  
##  Mean   :10.55  
##  3rd Qu.:11.50  
##  Max.   :55.00
## この方法ではDCとDEが入れ替わっている
pres1[8:9, ]
##   state.name state Obama McCain EV state.abb Obama Romney EV
## 8       D.C.    DC    92      7  3        DE    59     40  3
## 9   Delaware    DE    62     37  3        DC    91      7  3
## merge()ではこの問題は起こらない
pres[8:9, ]
##   state state.name Obama.x McCain EV.x Obama.y Romney EV.y
## 8    DC       D.C.      92      7    3      91      7    3
## 9    DE   Delaware      62     37    3      59     40    3
pres$Obama2008.z <- scale(pres$Obama.x)
pres$Obama2012.z <- scale(pres$Obama.y)
## 切片は実質0と推定されている
fit1 <- lm(Obama2012.z ~ Obama2008.z, data = pres)
fit1
## 
## Call:
## lm(formula = Obama2012.z ~ Obama2008.z, data = pres)
## 
## Coefficients:
## (Intercept)  Obama2008.z  
##  -3.521e-17    9.834e-01
## 切片なしの回帰:傾きの推定値は同一である
fit1 <- lm(Obama2012.z ~ -1 + Obama2008.z, data = pres)
fit1
## 
## Call:
## lm(formula = Obama2012.z ~ -1 + Obama2008.z, data = pres)
## 
## Coefficients:
## Obama2008.z  
##      0.9834
par(family = "HiraginoSans-W3") # 日本語が文字化けしないようにおまじない
plot(pres$Obama2008.z, pres$Obama2012.z, xlim = c(-4, 4), ylim = c(-4, 4),
     xlab = "オバマの標準化得票率(2008年)",
     ylab = "オバマの標準化得票率(2012年)")
abline(fit1) # 回帰直線を描く

## 下位25パーセンタイル
mean((pres$Obama2012.z >
          pres$Obama2008.z)[pres$Obama2008.z
                            <= quantile(pres$Obama2008.z, 0.25)])
## [1] 0.5714286
## 上位25パーセンタイル
mean((pres$Obama2012.z >
          pres$Obama2008.z)[pres$Obama2008.z
                            >= quantile(pres$Obama2008.z, 0.75)])
## [1] 0.4615385

4.2.6 モデルの当てはまり

\[ R^2 \ = \ 1 - \frac{\textsf{SSR}}{\textsf{総平方和(total sum of squares:TSS)}} \ = \ 1 - \frac{\sum_{i=1}^n \hat\epsilon_i^2}{\sum_{i=1}^n (Y_i - \overline{Y})^2} \]

florida <- read.csv("florida.csv")
head(florida)
##     county Clinton96 Dole96 Perot96 Bush00 Gore00 Buchanan00
## 1  Alachua     40144  25303    8072  34124  47365        263
## 2    Baker      2273   3684     667   5610   2392         73
## 3      Bay     17020  28290    5922  38637  18850        248
## 4 Bradford      3356   4038     819   5414   3075         65
## 5  Brevard     80416  87980   25249 115185  97318        570
## 6  Broward    320736 142834   38964 177323 386561        788
## ブキャナンの2000年の得票数を1996年のペローの得票数で回帰する
fit2 <- lm(Buchanan00 ~ Perot96, data = florida)
fit2
## 
## Call:
## lm(formula = Buchanan00 ~ Perot96, data = florida)
## 
## Coefficients:
## (Intercept)      Perot96  
##     1.34575      0.03592
## TSS(総平方和)とSSR(残差平方和)を計算する
TSS2 <- sum((florida$Buchanan00 - mean(florida$Buchanan00))^2)
SSR2 <- sum(resid(fit2)^2)

## 決定係数
(TSS2 - SSR2) / TSS2
## [1] 0.5130333
R2 <- function(fit) {
    resid <- resid(fit) # 残差
    y <- fitted(fit) + resid # 結果変数
    TSS <- sum((y - mean(y))^2)
    SSR <- sum(resid^2)
    R2 <- (TSS - SSR) / TSS
    return(R2)
}
R2(fit2)
## [1] 0.5130333
## Rに内蔵された関数
fit2summary <- summary(fit2)
fit2summary$r.squared
## [1] 0.5130333
R2(fit1)
## [1] 0.9671579
par(family = "HiraginoSans-W3") # 日本語が文字化けしないようにおまじない
plot(fitted(fit2), resid(fit2), xlim = c(0, 1500), ylim = c(-750, 2500),
     xlab = "当てはめ値", ylab = "残差")
abline(h = 0)

florida$county[resid(fit2) == max(resid(fit2))]
## [1] "PalmBeach"

パームビーチ群のチョウ型投票用紙

## パームビーチ群を除くデータ
florida.pb <- subset(florida, subset = (county != "PalmBeach"))

fit3 <- lm(Buchanan00 ~ Perot96, data = florida.pb)
fit3
## 
## Call:
## lm(formula = Buchanan00 ~ Perot96, data = florida.pb)
## 
## Coefficients:
## (Intercept)      Perot96  
##    45.84193      0.02435
## 決定係数
R2(fit3)
## [1] 0.8511675
par(family = "HiraginoSans-W3") # 日本語が文字化けしないようにおまじない
## 残差プロット
plot(fitted(fit3), resid(fit3), xlim = c(0, 1500), ylim = c(-750, 2500),
     xlab = "当てはめ値", ylab = "残差",
     main = "パームビーチ群を除いた残差プロット")
abline(h = 0) # 0における水平線

par(family = "HiraginoSans-W3") # 日本語が文字化けしないようにおまじない
## 散布図と回帰直線
plot(florida$Perot96, florida$Buchanan00, xlab = "1996年のペローの得票数",
     ylab = "2000年のブキャナンの得票数") # 散布図
abline(fit2, lty = "dashed") # パームビーチ群を含んだ回帰直線
abline(fit3) # パームビーチ群を除いた回帰直線
text(30000, 3250, "パームビーチ群")
text(30000, 1500, "パームビーチ群を含んだ回帰直線")
text(30000, 400, "パームビーチ群を除いた回帰直線")