読者です 読者をやめる 読者になる 読者になる

Rを通じて統計学を学ぶ備忘録ブログ

SPSSからRに移行したい私のような人向けのR解説ブログ兼学習用備忘録。

ggplot2のGrammar of Graphics

グラフィックス

【ggplot2 Elegant graphics for data analysis備忘録】

何か調べたいことがあれば、ブラウザの「検索」機能を使って、「geom_xx」とか「コロプレスマップ」など入力して検索。 参照元ggplot2 Elegant graphics for data analysis. by Hadley Wickham こちらも

Getting started with ggplot2

ggplot2は、Rでデータを視覚化するための「文法」を提供してくれるグラフィックス系のパッケージ。そのため、ggplot2の「gg」は「Grammar of Graphics」に由来。 ちなみにggplot2と共に頻出するqplotの「q」は、「Quick plot」に由来。 ggplot2は「レイヤー構造」でグラフィックを構築していきます。つまり、層をどんどん積み重ねていくことで作図し、完成させる。 こうような文法構造を持っていることで、例えば、散布図→回帰分析→信頼区間のような分析の思考手順をそのままグラフィックに反映できる。

【ggplot2の言葉の説明】 ・データ(data):グラフィックを作成する元になるデータセットのこと。 ・幾何(学的)オブジェクト(geom):線や点、ポリゴンなど直接視認するもの。 ・エステテック(aesthetic):幾何オブジェクトの線の色、点の形、xとyの位置など。データの値からエステテックにマッピングされます。 ・スケール(scale):データ空間→エステテック空間へのマッピングのこと。カラーやサイズ、形状を制御すること。 ・座標(coord):データの座標を平面にマッピングすること。グリッドなどを書き、読み取りやすくする。 ・ファセット(facet):データを分割することで、データごとにグラフィックを構築することができます。

Mastering the Grammar

rplot 上記の散布図が作成されるまでのggplot2のグラマー。 【グラマー001】 2変数の位置関係、水平・垂直軸、値のカラー、サイズ、シェイプのことをひっくるめて「aesthetic attribution(審美的属性)」という。aesthetic attributionは「おのおのの変数」または、「一定の値」にマッピングできる。上の図では、「displを水平軸にマッピング」「hwyを垂直軸にマッピング」「cylをカラーにマッピング」している。Aestheticsは位置、色、大きさなどの、幾何学図形の集まりをマッピングする。以下は ggplot2 で使われる aesthetics のリストです。

adj, alpha, angle, bg, cex, col, color, colour, fg, fill, group, hjust, label, linetype, lower,
lty, lwd, max, middle, min, pch, radius, sample, shape, size, srt, upper, vjust, weight, width, x, xend, xmax, xmin, xintercept, y, yend, ymax, ymin, yintercept, z

x, y, color, fill, group, shape, sizeは頻繁に使うと思われる。 【グラマー002】 点、線、棒、ポリゴンなどすべて「幾何オブジェクト=geom」。つまりは、geomは幾何オブジェクトの「タイプ」を定める。上の図では、geom_pointとし、「点」を選んだにすぎない。グラフを作るためには、統計的な変換が必要。例えば、geom_point(stat = “identity”) は、統計処理を何もしないで幾何学図形として点を用いることを意味します。

【グラマー003】 データセットを「スケール化」することによって、データフレームの数値をグラフィックの形に変換することができる。スケール化する必要があるのは「x軸」「y軸」「カラー」の3つ。平面上において、xとyの位置関係を決定するのがcoordである座標が決定します。基本的にはデカルト平面。 これらの処理、つまり変数にマッピングされたaesthetic attribution、定数(カラー)にマッピングされたaesthetic attributionが確定することによって、グラフィックが構成される。

【グラマー004】 そして最終、グラフィックを完成させるためには、3種類のグラフィックオブジェクトを結合する。 ・geomとして表現されるdata ・軸、凡例などのscaleとcoord ・背景やタイトルなどのプロット装飾

次は、このような少し複雑なグラフィックでができるまでのグラマーへの追加理解。 rplot01 【グラマー005】 さらに3つの要素を追加しています。「facet」「multi layer」「stat」の3つ。facetでレイヤーを2次元グリッドに分割し、そこに重ねるmulti layerによって3次元に拡張する。平滑化された回帰曲線は、geomではなく、statによって表示される。データがマッピングされた後で、それをstatに渡すことで、統計的な処理を行う。 【グラマー006】 ・layerの果たす役割。 data and aesthetic mapping, statistical transformation(stat), geometric object (geom), position adjustmentの4つの過程を経て、layerは構成される。 ・scaleの果たす役割 データからエステティックマッピングの制御を行います。プロットされるすべてのaesthetic attributionに適用される。 ・coordの果たす役割 オブジェクトの位置を平面にマッピングする。coordはすべての位置に同時に影響する。 ・facetの果たす役割 facetは条件付きの集合を抽出し、複数のグラフィックを作成します。 ・データ構造とは data, aesthetic mapping, layers, coordinates, scales, facetによって構成される。

Build a plot layer by layer

ggplot()関数は、data, aesthetic mappingと2つの引数が必要。data, aesthetic mappingを後で設定するのであれば、省略可能。

ggplot(diamonds, aes(carat, price, col = cut)) + geom_point()
ggplot(diamonds, aes(carat, fill = cut)) +  geom_histogram(binwidth = .05)
ggplot(diamonds, aes(color, fill = cut)) + geom_bar()

rplot02 rplot rplot aes()関数は、データを視覚化する方法を指定するのが、aes()関数であり、aesthetic mapping。

aes(carat, price, colour = cut)

上記は、x=carat, y= price, colour=cutとマッピングしている。x軸にcarat、y軸にpriceをマッピングし、カテゴリーを持つcutで、色分けを行うというaesthetic mappingを実行している。もちろん、aes()関数で指定できるのは、データセットに含まれている必要がある。 ggplot()関数でデータだけ指定し、aes()関数でx-yにaesthetic mappingを行い、geom_point()関数内でカラーにaesthetic mappingというレイヤーを重ねている。

p <- ggplot(mtcars, aes(x = wt, y = hp))
p + geom_point(aes(colour = factor(cyl)))

rplot03

Setting vs. mapping

Setting: colour = “red” mapping: aes(colour = cyl) Settingでは、色を「赤」に設定しているだけで、Mappingでは「cylをもとに色分け」するという指示になる。aes(mpg, wt, colour = cyl)と設定した場合、colにcylをMappingしているので凡例が出現する。

p <- ggplot(mtcars, aes(x = mpg, y = wt))
p + geom_point(col = red)
p + geom_point(aes(colour = cyl))

%e5%90%8d%e7%a7%b0%e6%9c%aa%e8%a8%ad%e5%ae%9a-1-01

Grouping

ggplot2のgeomは「individual geom」と「collective geom」に分けることができる。 ・Individual geom:データの各行ごとに異なるグラフィックオブジェクトを指定可能。 ・Collective geom:統計処理を行った結果、ポリゴンなどのgeomを表示するのに必要。 geom_xx()内でGroupingをうまく設定することで、思い描くような図を描くことができる。

【Multiple groups, one aesthetic】 (複数グループに1つのエステティック) aes()関数で、「group = Subject」を設定することで、個別の観測値お時系列データを追えている。

data (Oxboys, package="nlme")
ggplot (Oxboys, aes(age, height, group =Subject, col = Subject)) + geom_line()

rplot04 【Different groups on different layers】 (異なるレイヤーで異なるグループ) 各水準ごとに個別に表示しつつ、次のレイヤーでは、全体の要約をするようにGroupingを行う。 以下のコードからわかるように、p1に代入する前は「group = Subject」だが、そのあとは「group = 1」と設定。

p1 <- ggplot (Oxboys, aes(age, height, group = Subject)) + geom_line()
p1 + geom_smooth (aes(group = 1), method = "lm", size = 2, se = F)

rplot05

【Overriding the default grouping】 (デフォルトグループ設定の上書き変更) geom_line(aes(group = Subject), colour = “#006E4F”)と指定することで、2枚目のレイヤーでは、個別の時系列変化を折れ線で表示することができている。

boysbox <- ggplot(Oxboys, aes(Occasion, height)) + geom_boxplot()
boysbox + geom_line(aes(group = Subject), colour = "#3366FF")

rplot06

geom and stat

geomはレイヤーをレンダリングすることでグラフィックを調整する。その際に、おのおの必要ような要素がある。statはデータ変換を行う。データッセット入力→stat_xx()→データセット出力以下の通り。

【geom_xxの一覧】
geom_abline 直線(切片と傾きで指定される)
geom_area エリア・プロット
geom_bar 棒グラフ(y軸の指定による棒や矩形)
geom_bin2d ヒートマップ
geom_blank ブランク(何も表示しない)
geom_boxplot 箱ひげ図
geom_contour 3次元表面等高線図を2次元表示
geom_crossbar 箱ひげ図の箱だけのようなプロット
geom_density 平滑化された密度曲線
geom_density2d 2次元密度推定
geom_errorbar エラー・バー
geom_freqpoly 頻度ポリゴン
geom_hex 六角形のヒートマップ( stat_binhex() を参照)
geom_histogram ヒストグラム
geom_hline 水平線
geom_jitter データをズラす(点等の重なりを緩和するため)
geom_line Xの値の順に線を描く
geom_linerange 箱ひげ図の箱を線で表したようなプロット
geom_map 地図にヒートマップを追記する
geom_path データフレームのデータの上から順に線で繋ぐ
geom_point 散布図
geom_pointrange 平均値±標準偏差のプロット
geom_polygon ポリゴンプロット
geom_quantile 箱ひげ図の連続変数版( stat_quantile() を参照)
geom_raster geom_tile のハイパフォーマンス版
geom_rect 矩形を描く
geom_ribbon 折れ線グラフにバンド幅を加えたプロット
geom_rug ラグプロット
geom_segment 線分を描く
geom_smooth 平滑線
geom_step 階段関数
geom_text テキストを追記
geom_tile 2 次元データの密度をタイルで表示
geom_violin バイオリンプロット
geom_vline 垂直線

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-12-22-22-39

【stat_xxの一覧】
stat_bin データのbinの幅(ヒストグラムの棒の横幅)
stat_bin2d 矩形(rectangle)の中のデータ数
stat_bindot ドットプロットのためのbinデータ
stat_binhex 六角形のヒートマップを描くためのデータ
stat_boxplot 箱ひげ図で出てくる要約統計量
stat_contour 等高線
stat_density 1次元の密度推定
stat_density2d 2次元の密度推定
stat_ecdf 経験累積分布関数
stat_identity 確率楕円
stat_function ユーザーが指定した関数(で計算する)
stat_identity データの変換をしない(データのまま)
stat_qq QQプロット
stat_quantile 分位点
stat_smooth 平滑化曲線
stat_spoke 極座標変換(xとyの範囲を用いる)
stat_sum 同じ値のデータを合計する
stat_summary データの要約統計量
stat_summary2Dヒートマップの各矩形のデータ数
stat_summary_hex ヒートマップの各六角形のデータ数
stat_unique データの重複を除去
stat_ydensity 密度推定値(バイオリンプロット用)

基本的には、geom_histogram()はカウント数をy軸にとって、ヒストグラムを構築していくが、「aes(y = ..density..」を指定すると、Densityでy軸を取ることができる。

ggplot(diamonds, aes(carat)) + geom_histogram(aes(y = ..density..), binwidth = 0.1)

rplot02

Position adjustments

基本的には離散値データに使う。 stackは、重なった部分を積み上げていく調整。 fillは、重なった部分を積み上げて全体を1に正規化。 dodgeは、重なった部分を横に分けていく位置調整。 identityは、調整しない。 jitterは、重なりを防ぐジッターを追加。

dplot <- ggplot(diamonds, aes(clarity, fill = cut))
dplot + geom_bar(position = "stack")
dplot + geom_bar(position = "fill")
dplot + geom_bar(position = "dodge")

%e5%90%8d%e7%a7%b0%e6%9c%aa%e8%a8%ad%e5%ae%9a-1

Varying aesthetics and data

ggplot2の良さはレイヤーにレイヤーを重ねていくことでグラフィックを構築できる点。

require(nlme, quiet = TRUE, warn.conflicts = FALSE)
##混合モデル( model with varying intercepts and slopes)
model <- lme(height ~ age, data = Oxboys, random = ~ 1 + age | Subject)
oplot <- ggplot(Oxboys, aes(age, height, group = Subject)) + geom_line()

観測値と予測値の違いを見るために、予測値用のグリッドを作成する。そして、新たなグリッドに予測値heightとして追加。つまり、レイヤー(Oxboys)にレイヤー(preds)を重ねる。

age_grid <- seq(-1, 1, length = 10)
subjects <- unique(Oxboys$Subject)
preds <- expand.grid(age = age_grid, Subject = subjects)
preds$height <- predict(model, preds)
oplot + geom_line(data = preds, colour = "#3366FF", size= 0.4)

rplot02 モデルが予測値から残差を引き、データを更新する。残差はランダムではないので、2次の項を追加する。

Oxboys$fitted <- predict(model)
Oxboys$resid <- with(Oxboys, fitted - height)
oplot %+% Oxboys + aes(y = resid) + geom_smooth(aes(group=1))

rplot03

model2 <- update(model, height ~ age + I(age ^ 2))
Oxboys$fitted2 <- predict(model2)
Oxboys$resid2 <- with(Oxboys, fitted2 - height)
oplot %+% Oxboys + aes(y = resid2) + geom_smooth(aes(group=1))

rplot04

Oxboys modelの簡略化

require(nlme, quiet = TRUE, warn.conflicts = FALSE)
model <- lme(height ~ age, data = dat, random = ~ 1 + age | Subject)
##lmerだと以下と同じ
lmer(height ~ age + (1 | Subject)+(0 + age | Subject), dat)
oplot <- ggplot(dat, aes(age, height, group = Subject)) + geom_line()
age_grid <- seq(-1, 1, length = 10)
subjects <- unique(dat$Subject)
preds <- expand.grid(age = age_grid, Subject = subjects)
preds$height <- predict(model, preds)
oplot + geom_line(data = preds, colour = "#3366FF", size= 0.4)

rplot

dat$fitted <- predict(model)
dat$resid <- with(dat, fitted - height)
oplot %+% dat + aes(y = resid) + geom_smooth(aes(group=1))

rplot02

model2 <- update(model, height ~ age + I(age ^ 2))
dat$fitted2 <- predict(model2)
dat$resid2 <- with(dat, fitted2 - height)
oplot %+% dat + aes(y = resid2) + geom_smooth(aes(group=1))

rplot03

#

(1)Subjectごとに回帰させるモデル lmer(height ~ age + (x | Subject), dat ) (2)Subjectごとに切片だけランダム効果にし,傾きは固定させるモデル lmer(height ~ age + (1 | Subject) , dat) (3)Subjectごとに傾きだけランダム効果にし,切片は固定させるモデル lmer(height ~ age +(0 + age | Subject) , dat) (4)Subjectごとに傾きと切片がランダム効果のモデル lmer(height ~ age + (1 | Subject)+(0 + age | Subject), dat)

#

Toolbox

Basic plot types

geom_point:散布図を返す。 geom_bar:棒グラフ。stat = “identity"を指定しないstatが頻度を返す。 geom_line:ラインプロットを返す。 geom_are:y軸の値までを塗りつぶしたラインプロットを返す。 geom_path:データの出現順に線を結ぶ。 geom_text:文字列を返す散布図。 geom_tile:平面を規則的にモザイク化する。 geom_polygon:点を結び、内側を塗りつぶす。

df <- data.frame(x = c(3, 1, 5), y = c(2, 4, 6), label = c("a","b","c"))
p <- ggplot(df, aes(x, y, label = label)) + xlab(NULL) + ylab(NULL)
p + geom_point() + labs(title="geom_point")
p + geom_bar(stat="identity") + labs(title="geom_bar(stat=\"identity\")")
p + geom_line() + labs(title="geom_line")
p + geom_area() + labs(title="geom_area")
p + geom_path() + labs(title="geom_paths")
p + geom_text() + labs(title="geom_text")
p + geom_tile() + labs(title="geom_title")
p + geom_polygon() + labs(title="geom_polygon")  

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-13-11-56-07

Displaying distributions

分布を表示するには、分布の次元、連続か離散か、条件付きか結合分布かなど、目的に応じて使う関数が異なる。分布に関連するgeomは「geom + stat」を組み合わせることで、構成されている。

depth_dist <- ggplot(diamonds, aes(depth)) + xlim(58L, 68L)
depth_dist + geom_histogram(aes(y = ..density..), binwidth = 0.1) + facet_grid(cut ~ .)
depth_dist + geom_histogram(aes(fill = cut), binwidth = 0.1, position = "fill")
depth_dist + geom_freqpoly(aes(y = ..density.., colour = cut), binwidth = 0.1) 

%e5%90%8d%e7%a7%b0%e6%9c%aa%e8%a8%ad%e5%ae%9a-1

Dealing with overplotting

サンプルサイズが大きくなると、点が重なって見えなくなるので、点のサイズ、不透明、ジッターなどで工夫する。重なっている部分が少ないのであれば、点を小さくすることで対処。重なっている部分が多いのであれば、点に対してアルファブレンドで対処。

df <- data.frame(x = rnorm(2000), y = rnorm(2000))
norm <- ggplot(df, aes(x, y))
norm + geom_point()
norm + geom_point(shape = 1)
norm + geom_point(shape = ".") 
norm + geom_point(alpha = 1/3, color = "black")
norm + geom_point(alpha = 1/5, color = "black")
norm + geom_point(alpha = 1/10, color = "black")

%e5%90%8d%e7%a7%b0%e6%9c%aa%e8%a8%ad%e5%ae%9a-1 離散データなら、ジッターでずらすことで、視認しやすくする。

td <- ggplot(diamonds, aes(table, depth)) + xlim(50, 70) + ylim(50, 70)
td + geom_point()
td + geom_jitter()
jit <- position_jitter(width = 0.5)
td + geom_jitter(position = jit)
td + geom_jitter(position = jit, alpha = 1/10, color = "black")
td + geom_jitter(position = jit, alpha = 1/50, color = "black")
td + geom_jitter(position = jit, alpha = 1/200, color = "black")

%e5%90%8d%e7%a7%b0%e6%9c%aa%e8%a8%ad%e5%ae%9a-1 データ点をビンに分けることで、各ビンの数を計測することで、頻度を形にする。六角形ビンを使うのであれば、hexbinをインストする必要がある。

install.packages("hexbin")
library(hexbin)
d <- ggplot(diamonds, aes(carat, price)) + xlim(1,3) + theme(legend.position = "none")
d + stat_bin2d()
d + stat_bin2d(bins = 10)
d + stat_bin2d(binwidth=c(0.02, 200))
d + stat_binhex()
d + stat_binhex(bins = 10)
d + stat_binhex(binwidth = c(0.02, 200))

%e5%90%8d%e7%a7%b0%e6%9c%aa%e8%a8%ad%e5%ae%9a-1 stat_density2d()またはgeom_denstiy2dを使って、2次元密度を推定。

d <- ggplot(diamonds, aes(carat, price)) + xlim(1,3) + theme(legend.position = "none")
d + geom_point() + geom_density2d()
d + stat_density2d(geom = "point", aes(size = ..density..), contour = F) + scale_size_area(c(0.2, 1.5))
d + stat_density2d(geom = "tile", aes(fill = ..density..), contour = F)
last_plot() + scale_fill_gradient(limits = c(1e-5,8e-4))

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-13-12-56-31

Annotating a plot

ラベルを追加する方法は2つ。細々と追加していくか、一回で全部追加するのか。テキストラベルだけではなく、座布団のように膜をかけることもできる。 geom_vline:垂直線を返す。 geom_hline:水平線を返す。 geom_text:説明テキストの追加。外れ値などにはテキストをつけるとわかりやすい。 geom_rect:矩形領域をハイライトする。xmin, xmax, ymin, ymaxを設定する。 geom_line:geom_segment, geom_pathと同じで線を返す。arrowを指定すると矢印にもなる。

unemp <- ggplot(economics, aes(date, unemploy)) + geom_line() + xlab("years") + ylab("No. unemployed (1000s)")
presidential <- presidential[]

rplot

##x−y軸の範囲を設定する。
yrng <- range(economics$unemploy)
xrng <- range(economics$date)
unemp + geom_vline(aes(xintercept = as.numeric(start)), data = presidential)
unemp + geom_rect(aes(NULL, NULL, xmin = start, xmax = end, fill = party), ymin = yrng[1], ymax = yrng[2], alpha = 0.2, data = presidential) + scale_fill_manual(values = c("blue","red"))
last_plot() + geom_text(aes(x = start, y = yrng[1], label = name), data = presidential, size = 3, hjust = 0, vjust = 0)

rplot02

caption <- paste(strwrap("Unemployment rates in the US have varied a lot over the years", 40), collapse="\n")
unemp + geom_text(aes(x, y, label = caption), data = data.frame(x = xrng[2], y = yrng[2]), hjust = 1, vjust = 1, size = 4)
highest <- subset(economics, unemploy == max(unemploy))
unemp + geom_point(data = highest, size = 3, color = "red", alpha = 0.5)

rplot02

x <- c(1:5)
y <- c(11:15)
c <- c("a", "a", "b", "b", "b")
d <- data.frame(x, y, c)
ggplot(d, aes(x, y)) + geom_point() +
  geom_vline(xintercept = c(0, 1, 2), linetype = "dotted") +
  geom_hline(yintercept = c(11, 12, 13), linetype = "dotted")

rplot

Scale, Axes and Legends

スケールは、スケールドメインからエステティック空間レンジへの関数。スケール化の処理は3段階に分かれる。「transformation」「training」「mapping」。スケールのその他の役割として「ガイド」の機能がある。エステティック空間からデータ空間へのmappingであり、逆方向。ドメインは連続か離散量なので、個々の値か実数の区間となり、つまり[a, b, c]か[0.5〜10]のような感じ。レンジも同様。

【Transformation】 対数や平方根変換。変換されると、各レイヤーの統計量が変換データのもと計算される。 【Training】 複数レイヤー、複数データを重ねる際に、数値が異なるので、上書き調整など。 【Mapping】 スケールを行う関数でmappingする。

##これは離散値ctyが表現されない。
qplot(cty, hwy, data = mpg) 
##離散値を表現するために調整。
qplot(cty, hwy, data = mpg) + aes(x = drv) + scale_x_discrete()
ggplot(mpg, aes(drv, hwy)) + geom_point()

rplot rplot01

ggplot(msleep, aes(sleep_total, sleep_cycle, colour = vore)) + geom_point() +
    scale_colour_hue("What does \ nit eat?", 
                   breaks = c("herbi", "carni", "omni", NA), 
                   labels = c("plants", "meat", "both", "don't know"))

rplot02 【位置スケール】 連続量、離散量、日付、時間などをマッピングする。 【カラースケール】 連続量、離散量の変数をカラーにマッピング。 【マニュアルスケール】 離散量のサイズ、線種、シェイプ、カラーにマッピングし、対応する凡例を作成。 【アイデンティティースケール】 変数の値をエステティックに対応させる。

p <- ggplot(mpg, aes(cty, hwy, col = displ)) + geom_point()
p
p + scale_x_continuous("City mpg")
p + xlab("City mpg") + ylab("Highway mpg")
p + labs(x = "City mpg", y = "Highway", colour = "Displacement")
p + xlab(expression(frac(miles, gallon)))

rplot03 rplot04 rplot05 rplot06 rplot07 lmiit:「軸と凡例に影響する」 スケールのドメインを固定する。連続量は2つの数値ベクトルを指定。離散は文字ベクターを指定。表示したくない量などは、limitで削除できる。 breaks & labels:「全体に影響する」 breaksは軸や凡例を調整する。軸目盛りや連続量の分割方法など。

p <- ggplot(mtcars, aes(cyl, wt, colour = cyl)) + geom_point()
p
p + scale_x_continuous(breaks = c(5.5, 6.5))
p + scale_x_continuous(limits = c(5.5, 6.5))
p + scale_colour_gradient(breaks = c(5.5, 6.5))
p + scale_colour_gradient(limits = c(5.5, 6.5))

rplot rplot01 rplot02 rplot03 rplot04

・位置スケール(6.4.2) プロットにはx軸とy軸が必要。連続量、離散量、日付のスケールを扱うことができる。 xlim(10, 20):連続量 xlim(“a”, “b”, “c”): 離散量 xlim(as.Date(c(“2008-05-01”, “2008-08-01”))):日付

p <- ggplot(economics, aes(date, psavert)) + geom_line() +  ylab("Personal savings rate")
p
p + scale_x_date(limits = as.Date(c("2004-01-01", "2005-01-01")),labels = date_format("%Y-%m-%d"))

rplot022 rplot02 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-21-23-30-26 ・カラー(6.4.3) 連続的カラー scale_colour_gradient() and scale_fill_gradient(): lowとhighを両端のカラーに設定する。 scale_colour_gradient2() and scale_fill_gradient2(): 3つのカラーで高中低を指定する。lowとhighとmidで指定。 scale_colour_gradientn() and scale_fill_gradientn(): coloursにカラーのベクトルを指定する。

f2d <- with(faithful, MASS::kde2d(eruptions, waiting, h = c(1, 10), n = 50))
df <- with(f2d, cbind(expand.grid(x, y), as.vector(z)))
names(df) <- c("eruptions", "waiting", "density")
erupt <- ggplot(df, aes(waiting, eruptions, fill = density)) + geom_tile() + scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0))
erupt + scale_fill_gradient(limits = c(0, 0.04))
erupt + scale_fill_gradient(limits = c(0, 0.04), low = "white", high = "black")
erupt + scale_fill_gradient2(limits = c(-0.04, 0.04), midpoint = mean(df$density)) 

rplot03 rplot01 rplot カラーセットから選択する場合。

point <- ggplot(data = msleep, aes(log(brainwt), log(bodywt), colour = vore)) + geom_point()
area <- ggplot(data = msleep, aes(log(brainwt), fill = vore)) + geom_histogram(binwidth = 0)

point + scale_colour_brewer(palette = "Set1")
point + scale_colour_brewer(palette = "Set2")
point + scale_colour_brewer(palette = "Pastel1")
area + scale_fill_brewer(palette = "Set1")
area + scale_fill_brewer(palette = "Set2")
area + scale_fill_brewer(palette = "Pastel1")

rplot04 rplot05 rplot06 rplot07 rplot rplot01 ・マニュアル離散量スケール scale_linetype(), scale_shape() and scale sizediscreteはオプション指定はない。調整したい場合はscale_shape_manual(), scale_linetype_manual(),scale_colour_manual()を利用する。

ggplot(data = msleep, aes(log(brainwt), log(bodywt))) + geom_point() + aes(colour = vore) + scale_colour_manual(values = c("red", "orange", "yellow", "green", "blue"))
colours <- c(carni = "red", "NA" = "orange", insecti = "yellow", herbi = "green", omni = "blue")
plot + aes(colour = vore) + scale_colour_manual(values = colours)
plot + aes(shape = vore) + scale_shape_manual(values = c(1, 2, 6, 0, 23))

rplot02 rplot01 rplot

huron <- data.frame(year = 1875:1972, level = LakeHuron)
ggplot(huron, aes(year)) + geom_line(aes(y = level - 5, colour = "below")) + geom_line(aes(y = level + 5, colour = "above")) + scale_colour_manual("Direction", values = c("below" = "blue", "above" = "red"))

rplot03 6.5 凡例と軸 軸と凡例のことを「ガイド」という。これは、プロットから値をマッピングする。スケールの逆関数みたいなもの。 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-22-0-07-30

Positioning

凡例を操作する関数。

ggplot(d, aes(x, y)) + geom_point(aes(colour = c)) + labs(colour = "Change the label")
ggplot(d, aes(x, y)) + geom_point(aes(colour = c, shape = c)) +
  scale_colour_hue("scale_colour_hue") +
  scale_shape_discrete("scale_shape_discrete")

rplot02 rplot

7.2 ファセット ファセットは部分集合を取り出し、小さなプロットを複数作成する。イメージは以下の通り。 facet_grid(): 行と列で表す変数で定義されるパネルの二次元グリット。 facet_wrap(): パネルの一次元リボンを作成し二次元ラップする。 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-23-11-29-00 7.2.1 ファセットのグリッド

. ~ .

デフォルトのファセット。何もファセットされない。~の左で行、右側で列を指定し、分割方向を設定する。

. ~ a

1行に複数列。つまり、変数aの因子で分割する。y軸の高さ比較が容易になる。

b ~ .

1列に複数の行。つまり、変数bの因子で分割する。x軸の比較が容易になる。

b ~ a

複数の行と列で分割。つまり、変数a,bの因子で分割する。

. ~ a + b

あまり使う機会はない。 ・周辺パネル 周辺合計を表示するにはmargins = TRUEを設定すれば表示される。ファセットには"ALL"として表示される。

##data"mpg"のcylの"5"は削除し、drvの"4", "f"のみ抽出
mpg2 <- subset(mpg, cyl != 5 & drv %in% c("4", "f"))
head(mpg2)
ggplot(mpg2, aes(cty, hwy)) + geom_point() + facet_grid(. ~ cyl)
ggplot(mpg2, aes(cty, hwy)) + geom_point() + facet_grid(drv ~ cyl)
ggplot(mpg2, aes(cty, hwy)) + geom_point() + geom_smooth(method = "lm", se = F) + facet_grid(cyl ~ drv) 
ggplot(mpg2, aes(cty, hwy)) + geom_point() + geom_smooth(method = "lm", se = F) + facet_grid(cyl ~ drv, margins = T)
ggplot(mpg2, aes(cty, hwy)) + geom_point() + geom_smooth(aes(colour = drv), method = "lm", se = F) + facet_grid(cyl ~ drv, margins = T)
ggplot(mpg2, aes(cty, hwy)) + geom_point() + geom_smooth(method = "lm", se = F) + facet_grid(. ~ cyl + drv)

rplot02 rplot03 rplot04 rplot05 rplot06 rplot02 7.2.2 ファセットのラップ グリッドではなく、ラップリボンを使う。幅のあるリボンを作成し、変数の水準が多い時にはこれで比較する。

install.packages("reshape")
install.packages("reshape2")
library(reshape)
library(reshape2)

theURL <- "http://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/movies.csv";
movies <- read.table(file = theURL, header = TRUE, sep = ",");

##round_any(x, accuracy, f = round)なので、yearを二桁単位で処理。floorだと1935=1930, ceilingだと1940。
movies$decade <- round_any(movies$year, 10, floor)
m2 <- subset(movies, decade > 1890)
ggplot(m2, aes(rating)) + geom_histogram(aes(y = ..density..), binwidth = 0.5) + facet_wrap(~ decade, ncol = 6)
ggplot(m2, aes(rating)) + geom_histogram(aes(y = ..density..), binwidth = 0.5) + facet_wrap(~ decade, ncol = 11)

rplot q

7.2.3 スケールの調整 パネル共通の数値を設定する"fixed"、パネル独自の数値を設定する"free"をすることで、自由に軸の数値を調整できる。時系列では、有効に役立つ。 ・scales = “fixed”: x and y scales are fixed across all panels. ・scales = “free”: x and y scales vary across panels. ・scales = “free_x”: the x scale is free, and the y scale is fixed. ・scales = “free_y”: the y scale is free, and the x scale is fixed.

p <- ggplot(data = mpg, aes(cty, hwy)) + geom_point()
p + facet_wrap(~ cyl, scales = "free")
p + facet_wrap(~ cyl, scales = "fixed")
p + facet_wrap(~ cyl, scales = "free_x")
p + facet_wrap(~ cyl, scales = "free_y")

rplot rplot01 rplot02 rplot03 facet_grid()には、"Space"という引数を設定できる。"free" or “fixed"のどちらかを設定する。 "free"の場合、各行(列)の幅は、列(行)に比例する。

mpg2 <- within(mpg, {
  model <- reorder(model, cty)
  manufacturer <- reorder(manufacturer, -cty)
})
ggplot(mpg2, aes(cty, model)) + geom_point()
ggplot(mpg2, aes(cty, model)) + geom_point() + facet_grid(manufacturer ~ ., scales = "free", space = "free") + theme (strip.text.y = element_text())

rplot01 rplot rplot01

7.2.5 グループ化とファセット化 ファセット化は、各グループが分離され、グループ間の重なりがなくなります。エステティックでグループ化する場合は、微妙な違いが分離されることでわからなくなる。

d2 <- subset(diamonds, color %in% c("D","E","G","J"))
p <- ggplot(d2, aes(carat, price, colour = color))
p + geom_point() + scale_colour_hue() + facet_grid(. ~ color) 
## scale_colour_hue(limits = levels(d2$color))とすれば、すべての水準が表示される
## + theme (legend.position = "none")を設定すれば凡例を消すことができる。
p + geom_smooth(method = lm, se = F, fullrange = T)
p + geom_smooth(method = lm, se = F, fullrange = T) + facet_grid(. ~ color)
p + geom_point() + geom_smooth(method = lm, se = F, fullrange = T)+ scale_colour_hue() + facet_grid(. ~ color) 

rplot rplot01 rplot02 rplot03

7.2.6 ドッジ化とファセット化

グラフィック的には似たようなものが出来上がるが、「ラベル」の部分で異なる。ネストしているようなデータの場合は「ファセット」が有効に機能する。理由は、分割をローカルに行え(scales=“free_x”, space=“free")、グローバルにできる(scales = "fixed")。「ドッジ」の場合、棒を分割するだけでラベルもつかない。

ggplot(diamonds, aes(color, fill = cut)) + geom_bar(position="dodge")
ggplot(diamonds, aes(cut, fill = cut)) + geom_bar(position="dodge") + facet_grid(. ~ color) + theme (axis.text.x = element_text(angle = 90, hjust = 1, size = 8, colour = "grey50"))

rplot rplot01 以下は、製造元と車種でネスとしているデータをファセット化した例。 ・完全にクロスしている場合は、基本的には似たようなグラフィックが出来上がる。 ・ほぼクロスしている場合、ファセットはスケール共有で、欠損が表示される。 ・ネストしている場合は、scales=“free_x”, space=“free"で、スペースの割り当てができる。

mpg4 <- subset(mpg, manufacturer %in% c("audi", "volkswagen", "jeep"))
mpg4$manufacturer <- as.character(mpg4$manufacturer)
mpg4$model <- as.character(mpg4$model)

base <- ggplot(mpg4, aes(fill = model)) + geom_bar(position = "dodge") + theme(legend.position = "none")
base + aes(x = model) + facet_grid(. ~ manufacturer)
last_plot() + facet_grid(. ~ manufacturer, scales = "free_x", space = "free")
base + aes(x = manufacturer)

rplot01 rplot rplot02 7.2.7 連続量変数 区切りでカテゴリ変数を作成し、ファセット化する例。 cut_interval():長さを1のビンにする=length=1と設定。 cut_interval():長さの等しい6のビンにする場合はn=6と設定。 cut_number():データの個数が等しいビンにする。n個のビンにする。

mpg2 <- subset(mpg, cyl != 5 & drv %in% c("4", "f"))
head(mpg2)
mpg2$disp_ww <- cut_interval(mpg2$displ, length = 1)
mpg2$disp_wn <- cut_interval(mpg2$displ, n = 6)
mpg2$disp_nn <- cut_number(mpg2$displ, n = 6)

p <- ggplot(mpg2, aes(cty, hwy)) + labs(x = NULL, y = NULL) + geom_point()
p + facet_wrap(~ disp_ww, nrow = 1)
p + facet_wrap(~ disp_wn, nrow = 1)
p + facet_wrap(~ disp_nn, nrow = 1)

rplot rplot01 rplot02

7.3 座標Transformation

rect <- data.frame(x = 50, y = 50)
line <- data.frame(x = c(1, 200), y = c(100, 1))
base <- ggplot(mapping = aes(x, y)) + geom_tile(data = rect, aes(width = 50, height = 50)) + geom_line(data = line)
base

base + coord_polar("x")
base + coord_polar("y")
base + coord_flip()
base + coord_trans(y = "log10")
base + coord_equal()

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-13-35-14

r_grid <- seq(0, 1, length = 15)
theta_grid <- seq(0, 3 / 2 * pi, length = 15)
extents <- data.frame(r = range(r_grid), theta = range(theta_grid))
base <- ggplot(extents, aes(r, theta)) + theme(aspect.ratio = 1) + scale_y_continuous(expression(theta))

base + geom_point(colour = "red", size = 4) + geom_line()
pts <- data.frame(r = r_grid, theta = theta_grid)
base + geom_line() + geom_point(data = pts)
base + geom_point(data = pts)

xlab <- scale_x_continuous(expression(x == r * sin(theta)))
ylab <- scale_y_continuous(expression(x == r * cos(theta)))
polar <- base %+% pts + aes(x = r * sin(theta), y = r * cos(theta)) + xlab + ylab
polar + geom_point()
polar + geom_point() + geom_path()
polar + geom_point(data=extents, colour = "red", size = 4) + geom_path() 

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-13-47-51

7.3 Cartesian coordinate systems デカルト座標系の関数はcoord_cartesian, coord_equal, coord_flip and coord_transの4つがあります。coord_cartesian関数は、xlim, ylimがある。スケールの範囲を設定すると、範囲外のデータは切り捨てられる。座標系の範囲だと領域を狭めるだけで、全データを使用することになります。

p <- qplot(disp, wt, data=mtcars) + geom_smooth()
p
p + scale_x_continuous(limits = c(325, 500))
p + coord_cartesian(xlim = c(325, 500))

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-13-57-14 scale_x_continuous(limits = c(325, 500))では、スケールの範囲を指定した中のデータのみを使って、geom_smooth()が計算される。coord_cartesian(xlim = c(325, 500))では、全データからの計算となる。

・Transformations geomはxの条件付きのyを調べることが前提。反対に、yの条件付きのxを調べることに関心がある場合、coord_flipでx−y軸を交換できる。

ggplot(data = mpg, aes(displ, cty)) + geom_point() + geom_smooth()
ggplot(data = mpg, aes(cty, displ)) + geom_point() + geom_smooth()
ggplot(data = mpg, aes(cty, displ)) + geom_point() + geom_smooth() + geom_smooth() + coord_flip()

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-14-05-35

Polishing your plots for publication

8.1 テーマ データに関係ない要素の外観は「テーマシステム」で調整できます。具体的には以下の部分が変更可能。 the title, axis labels, axis tick labels, strips, legend labels and legend key labels; and the colour of ticks, grid lines and backgrounds (panel,plot, strip and legend)。このデータとテーマを分けている点はlatticeと異なる部分です。 組み込みテーマは2つある。デフォルトは、theme_gray()が設定されている。背景がグレーで、グリッド線は白。theme_bw()は、背景が白で、グリッド線はグレー。

ggplot(data = movies, aes(rating)) + geom_histogram(binwidth = 1) + theme_gray()
(hgram <- ggplot(data = movies, aes(rating)) + geom_histogram(binwidth = 1) + theme_bw())

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-14-33-11

ggplot(d, aes(x, y)) + geom_point() + xlab("kakikukeko") + ylab("aiueo") + ggtitle("sasisuseso")
ggplot(d, aes(x, y)) + geom_point() + labs(title = "sasisuseso", x = "kakikukeko", y = "aiueo")

rplot01

8.1.2 Theme elements and element functions 複数の要素からテーマは構成され、axis.text, axis.title and strip.textはXとYに個別で設定できる。 %e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-14-56-16 theme_text()関数は、ラベル、ヘッダを書く。font family,face, colour, size, hjust, vjust, angle and lineheightなどを調整できる。

hgramt <- hgram + ggtitle("This is a histogram")
hgramt  
hgramt +  theme (title = element_text(size = 20))
hgramt + theme (title = element_text(color = "red"))
hgramt +  theme (title = element_text(size = 20, hjust = 0))
hgramt +  theme (title = element_text(size = 20, face = "bold" ))
hgramt +  theme (title = element_text(size = 20, angle = 180 ))

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-15-25-12 theme_line()関数とtheme_segment()関数はグリッド線や枠線を調整できる。colour, size and linetypeを調整できる。

hgram <- ggplot(data = movies, aes(rating)) + geom_histogram(binwidth = 1)
hgram +  theme (panel.grid.major = element_line(colour = "red"))
hgram +  theme (panel.grid.major = element_line(size = 2))
hgram +  theme (panel.grid.major = element_line(linetype = "dotted"))
hgram +  theme (panel.grid.major = element_line(linetype = 5))
hgram +  theme (axis.line = element_line())
hgram +  theme (axis.line = element_line(colour = "red"))
hgram +  theme (axis.line = element_line(size = 0.5, linetype = "dashed"))

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-15-25-25 theme_rect()関数は矩形を描写する。塗りつぶしのfill、枠のカラーのcolor、サイズのsizeと線の種類のlinetypeを調整できる。

hgram +  theme (plot.background = element_rect(fill = "grey80", colour = NA))
hgram +  theme (plot.background = element_rect(size = 2))
hgram +  theme (plot.background = element_rect(colour = "red"))
hgram +  theme (plot.background = element_rect())
hgram +  theme (plot.background = element_rect(colour = NA))
hgram +  theme (plot.background = element_rect(linetype = "dotted"))

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-15-25-36 theme_brank()関数は描写したくないものがあると、それを削除するために使用する。

hgram
last_plot() + theme (panel.grid.minor = element_blank())
last_plot() + theme (panel.grid.major = element_blank())
last_plot() + theme (panel.background = element_blank())
last_plot() + theme (axis.title.x = element_blank(), axis.title.y = element_blank())
last_plot() + theme (axis.line = element_line())

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-26-15-25-46

Manipulating data

9.1 An introduction to plyr plyrはデータフレームの操作を行うためのパッケージ。基本的なシンタックスは下記の通り。

ddply(.data, .variables, .fun, ...)

.data: 操作対象のデータフレーム .variables: 操作の基準となるグループ化変数 .fun: 利用したい関数を設定

library(plyr)
# Select the smallest diamond in each colour
# colourを基準にcaratの小さい物を抽出し、補集合を作る。数値は重複していても抜き出される。
ddply(diamonds, .(color), subset, carat == min(carat))

# Select the two smallest diamonds
# colourを基準にcaratの小さい物を「2つ」抽出し、補集合を作る。
ddply(diamonds, .(color), subset, order(carat) <= 10)

# Select the 1% largest diamonds in each group
# colourを基準にcaratの大き物順に1%までのデータを抽出し、補集合を作る。
ddply(diamonds, .(color), subset, carat > quantile(carat, 0.99))

# Select all diamonds bigger than the group average
# colourを基準にcaratの平均よりも大き物をを抽出し、補集合を作る。
ddply(diamonds, .(color), subset, price > mean(price))

# Within each colour, scale price to mean 0 and variance 1
# colourを基準に価格を平均0で分散1で標準化。
ddply(diamonds, .(color), transform, price = scale(price))

  carat       cut color clarity depth table price   x   y   z
1  0.23 Very Good     D     VS2    60    61 -0.84 4.0 4.0 2.4
2  0.23 Very Good     D     VS1    62    58 -0.82 3.9 4.0 2.4
3  0.26 Very Good     D     VS2    61    59 -0.82 4.1 4.2 2.5
4  0.26      Good     D     VS2    65    56 -0.82 4.0 4.0 2.6
5  0.26      Good     D     VS1    58    63 -0.82 4.2 4.2 2.5
6  0.22   Premium     D     VS2    59    62 -0.82 3.9 3.9 2.3

# Subtract off group mean
# colourを基準に価格を平均からひき、中心化。
ddply(diamonds, .(color), transform,  price = price - mean(price))

  carat       cut color clarity depth table price   x   y   z
1  0.23 Very Good     D     VS2    60    61 -2813 4.0 4.0 2.4
2  0.23 Very Good     D     VS1    62    58 -2768 3.9 4.0 2.4
3  0.26 Very Good     D     VS2    61    59 -2767 4.1 4.2 2.5
4  0.26      Good     D     VS2    65    56 -2767 4.0 4.0 2.6
5  0.26      Good     D     VS1    58    63 -2767 4.2 4.2 2.5
6  0.22   Premium     D     VS2    59    62 -2766 3.9 3.9 2.3

9.2 longフォーマットからwideフォーマット data.frameの複数の変数を、カテゴリ変数1列の組に変換。変換する列数の分だけdata.frameが縦長(long-format)に変換される。

melt(data,
   id.vars,
   measure.vars,
     variable.name="variable", 
   value.name="value",
     na.rm=FALSE, factorsAsStrings=TRUE, ...)

data:data.frame
id.vars:列として維持したい変数名を文字列で指定。指定なければmeasure.vars以外のすべてが選択される。
measure.vars:列名をvariableに、値をvalueに分解したい列名を文字列で指定。指定なければid.vars以外のすべて。
variable.name="variable":新しい列の名前。
value.name="value":新しい列の名前。
na.rm=FALSE:NAが含まれる行を取り除くかどうか。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-27-11-51-05

ggplot(economics, aes(as.Date(date), uempmed)) + geom_path() 
ggplot(economics, aes(as.Date(date), unemploy)) + geom_path() 
ggplot(economics, aes(unemploy, uempmed)) + geom_point() + geom_smooth() 

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-27-11-51-44 上記のような時系列データを同時に表示したい場合。

write.csv(economics, "data.csv")
dat <- read.csv("dat.csv", header = TRUE)
eco <- melt(data = dat, 
            id.vars = "date", 
            measure.vars = c("unemploy", "uempmed"),
            variable.name="variable",
            value.name="value",
            na.rm=FALSE)

ggplot(economics, aes(date)) + 
  geom_line(aes(y = unemploy, colour = "unemploy")) + 
  geom_line(aes(y = uempmed, colour = "uempmed")) + 
  scale_colour_hue("variable")
ggplot(eco, aes(as.Date(date), value, col = variable, group =variable)) + geom_path() 

rplot02 これは同時にプロットできるがuempmedは数値が小ささすぎて線として役に立たない。

range01 <- function(x) {
  rng <- range(x, na.rm = TRUE)
  (x - rng[1]) / diff(rng)
}
eco2 <- ddply(eco, .(variable), transform, value = range01(value))
qplot(date, value, data = eco2, geom = "line", 
      colour = variable, linetype = variable)

ggplot(eco, aes(as.Date(date), value, group =variable)) + geom_path() + facet_grid(variable ~ ., scales = "free_y")

rplot03

9.3.1 Linear models

qplot(displ, cty, data = mpg) + geom_smooth(method = "lm")
mpgmod <- lm(cty ~ displ, data = mpg)
par(mfrow=c(2,2))
plot(mpgmod)

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-27-13-01-28

・残差とフィット値のプロット(左上) x軸が予測値、y軸が残差。残差の全体像を概観するために使用する。

・残差の正規Q-Qプロット(右上) 正規性を確認するためのもの。データが正規分布に従っている場合は、直線上に並ぶ。

・残差の平方根プロット(左下) 残差の変動状況を考察するために使用する。標準化した残差の絶対値の平方根をy軸にし、予測値をx軸にした散布図。

・残差と影響力プロット(梃子値とクック距離)(右下) 1つのデータがモデルの当てはまりへの影響力を測るために使用する。 クックの距離が0.5を超えると影響力あり、1を超えると特異に大きい。

横軸は梃子値で、縦軸は標準化した残差。点線でクックの距離0.5を示している。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-27-13-01-38

> head(fortify(mpgmod))
  cty displ        .hat   .sigma      .cooksd  .fitted     .resid  .stdresid
1  18   1.8 0.011459924 2.563948 9.433924e-03 21.25660 -3.2566002 -1.2757555
2  21   1.8 0.011459924 2.572933 5.857032e-05 21.25660 -0.2566002 -0.1005218
3  20   2.0 0.009843324 2.572535 4.063959e-04 20.73050 -0.7305039 -0.2859372
4  21   2.0 0.009843324 2.572927 5.531071e-05 20.73050  0.2694961  0.1054874
5  16   2.8 0.005433937 2.567149 2.873732e-03 18.62612 -2.6261185 -1.0256464
6  18   2.8 0.005433937 2.572657 1.633543e-04 18.62612 -0.6261185 -0.2445343

mod <- lm(cty ~ displ, data = mpg)
basic <- ggplot(mod, aes(.fitted, .resid)) +
  geom_hline(yintercept = 0, colour = "grey50", size = 0.5) + 
  geom_point() + 
  geom_smooth(size = 0.5, se = F)

basic
basic + aes(y = .stdresid)
basic + aes(size = .cooksd) + scale_area("Cook's distance")

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-27-13-01-49

full <- basic %+% fortify(mod, mpg)
full + aes(colour = factor(cyl))
full + aes(displ, colour = factor(cyl))

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-0028-11-27-13-01-55

広告を非表示にする