準備として、作業ディレクトリを指定する。 作業ディレクトリの指定にはsetwd()
関数を利用する。 ディレクトリへのパス(引用符の中身)は、各自で設定する。
setwd("~/projects/Stata-R/")
この章で使うパッケージをあらかじめ読み込んでおく。
library("foreign")
library("dplyr")
##
## Attaching package: 'dplyr'
##
## The following object is masked from 'package:stats':
##
## filter
##
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library("ggplot2")
## Windows ユーザは次の行をコメントアウト
theme_set(theme_gray(base_size=12, base_family="HiraKakuProN-W3"))
まず、気温とビールの出荷量のデータセット(beer2010.dta)を読み込む。 データは、作業ディレクトリ内のdataというフォルダ(ディレクトリ)に保存されているとする。 Stata形式 (.dta) で保存されたデータを読むために、foreign パッケージを使う。 読み込んだデータセットはBeerと名付ける。
Beer <- read.dta("data/beer2010.dta")
データが適切に読み込めたかどうか確認する。
Beer ## データをすべて表示する
## month temp beer
## 1 1 7.0 59.415
## 2 2 6.5 81.349
## 3 3 9.1 109.654
## 4 4 12.4 123.673
## 5 5 19.0 109.576
## 6 6 23.6 156.601
## 7 7 28.0 160.500
## 8 8 29.6 148.631
## 9 9 25.1 115.968
## 10 10 18.9 105.968
## 11 11 13.5 120.190
## 12 12 9.9 185.316
month, temp, beer という3つの変数が含まれていることがわかる。 このデータセットは観測数が12しかないのでこの方法でかまわないが、観測数が大きいデータセットの場合、この方法ではデータ全体が表示されてしまうので、あまり嬉しくない。 データ全体を表示させたくないときは、
names(Beer) ## データセットに含まれる変数名を表示する
## [1] "month" "temp" "beer"
head(Beer) ## データセットの一部(最初の数行)を表示する
## month temp beer
## 1 1 7.0 59.415
## 2 2 6.5 81.349
## 3 3 9.1 109.654
## 4 4 12.4 123.673
## 5 5 19.0 109.576
## 6 6 23.6 156.601
dim(Beer) ## データセットに含まれる観測数と変数の数を確認する (dimはdimension)
## [1] 12 3
などが利用できる。
続いて、散布図を描く。 最も簡単な方法は、plot()
関数を使う方法である。
plot(beer ~ temp, data = Beer,
ylab = "ビール出荷量(1000kl)", xlab = "気温(℃)",
main="月別のビール出荷量と平均気温の散布図")
これで十分目的は果たしているが、より見やすい図を作りたいときはggplot2 を利用する。
scat.beer <- ggplot(Beer, aes(temp, beer)) +
geom_point(size = 4) +
labs(x = "気温(℃)", y = "ビールの出荷量 (1000kl)",
title = "月別のビール出荷量と平均気温の散布図")
scat.beer
次に、cor()
関数を使って相関係数を確かめる。
with(Beer, cor(beer, temp))
または
cor(Beer$beer, Beer$temp)
とする。その結果、beer とtemp の相関係数は0.4957856であることがわかる。
2変数間の直線的関係を散布図上に示すには、次のようにする。
scat.beer + geom_smooth(method = "lm", se = FALSE)
R で線形回帰分析を行うには、lm()
を使う。 使い方は、lm(応答変数 ~ 説明変数1 + 説明変数2 + ・・・, data = データの名前)
である(応答変数と説明変数の間はハイフンではなくチルダ)。 ビールの出荷量 (beer) を応答変数、気温 (temp) を説明変数とする単回帰を model1 と呼ぶことにすると、
model.1 <- lm(beer ~ temp, data = Beer)
というコマンドで、分析結果がmodel1に保存される。
分析結果の表示は、次のように行う。
summary(model.1)
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 87.5464 | 21.7352 | 4.03 | 0.0024 |
temp | 2.1041 | 1.1655 | 1.81 | 0.1012 |
結果の読み方はStataとほとんど同じである(p.184の表10.2を参照)。 この結果から、切片の推定値は87.5463973、傾きの推定値は2.1040682であることがわかる。
まず、分析用のデータ (hr96-09.dta) を読み込み、内容を確認する (第5章のRによる分析で作った hr96-09labeled.dat を使ってもよい。)。
HR <- read.dta("data/hr96-09.dta")
## hr96-09labeled.dat を使う場合は、
## load("data/hr96-09labeled.dat")
head(HR)
## year ku kun party name age status nocand wl rank
## 1 1996 aichi 1 NFP KAWAMURA, TAKASHI 47 incumbent 7 win 1
## 2 1996 aichi 1 LDP IMAEDA, NORIO 72 moto 7 lose 2
## 3 1996 aichi 1 DPJ SATO, TAISUKE 53 incumbent 7 lose 3
## 4 1996 aichi 1 JCP IWANAKA, MIHOKO 43 challenger 7 lose 4
## 5 1996 aichi 1 bunka ITO, MASAKO 51 challenger 7 lose 5
## 6 1996 aichi 1 NP YAMADA, HIROSHIB 51 challenger 7 lose 6
## previous vote voteshare eligible turnout exp
## 1 2 66876 40.0 346774 49.22 9828097
## 2 3 42969 25.7 346774 49.22 9311555
## 3 2 33503 20.1 346774 49.22 9231284
## 4 0 22209 13.3 346774 49.22 2177203
## 5 0 616 0.4 346774 49.22 NA
## 6 0 566 0.3 346774 49.22 NA
今回の分析で利用する2009年の自民党議員のデータのみ抜き出し、HR09LDPとして保存する。
HR09LDP <- filter(HR, year == 2009, party == "LDP")
データの準備ができたので、重回帰分析を行う。 ここでは、応答変数を得票率 (voteshare)、説明変数を選挙費用 (exp) と当選回数 (previous) とする重回帰分析を行う(model2と名付ける)。
model.2 <- lm(voteshare ~ exp + previous, data = HR09LDP)
分析結果は次の通りである。
summary(model.2)
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 34.3824 | 1.3094 | 26.26 | 0.0000 |
exp | 0.0000 | 0.0000 | 0.98 | 0.3271 |
previous | 1.3748 | 0.1595 | 8.62 | 0.0000 |
結果の読み方は、Stataの場合と同様である(p.187, 表10.3 を参照)。
選挙費用 (exp) の推定結果がほぼ0になっているが、これは選挙費用の測定単位(1円)が小さすぎるためである。 そこで、選挙費用の単位を100万円に変えて再分析してみる(model3と名付ける)。
model.3 <- lm(voteshare ~ I(exp / 1000000) + previous, data = HR09LDP)
Stataで同様の分析を行う場合、expを1,000,000で割ったexpmという変数を用意する必要があったが、RではI()
関数を使ってlm() の中で直接計算することができる。 分析用のフォーミュラ (formula) の中で通常の演算を行いたいときはこの I()
関数を利用する(これを使わないと、通常の演算と認識してくれない。例えば、model3 のlm()
の中には+
があるが、これは説明変数を並べるための記号であり、加算とは認識されていない)。
分析結果は次の通りである。
summary(model.3)
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 34.3824 | 1.3094 | 26.26 | 0.0000 |
I(exp/1e+06) | 0.1064 | 0.1084 | 0.98 | 0.3271 |
previous | 1.3748 | 0.1595 | 8.62 | 0.0000 |
この結果の読み方は、表10.4(p.188)の読み方と同様である。
Rで残差を求めるには、lm()
の返り値を residuals()
の引数として与えればよい。 たとえば、上で分析したmodel3 の残差を求めるには
res3 <- residuals(model.3)
とすればよい。