Mukku John Blog

取り組んでいること を つらつら と

ggplot2を使って、散布図を作る-3

R グラフィックス クックブック 12回目

ggplot2パッケージを利用して、散布図を作成していきます。
この記事は、散布図に回帰モデルをプロットします。
回帰分析 - Wikipedia


このデータを主に使っていきます。

> head(heightweight, 3)
  sex ageYear ageMonth heightIn weightLb
1   f   11.92      143     56.3       85
2   f   12.92      155     62.3      105
3   f   12.75      153     63.3      108

> str(heightweight)
'data.frame':	236 obs. of  5 variables:
 $ sex     : Factor w/ 2 levels "f","m": 1 1 1 1 1 1 1 1 1 1 ...
 $ ageYear : num  11.9 12.9 12.8 13.4 15.9 ...
 $ ageMonth: int  143 155 153 161 191 171 185 142 160 140 ...
 $ heightIn: num  56.3 62.3 63.3 59 62.5 62.5 59 56.5 62 53.8 ...
 $ weightLb: num  85 105 108 92 112 ...


まずは、マッピングだけを、オブジェクトspとして作成しておきます。

sp <- ggplot(heightweight, aes(x=ageYear, y=heightIn))

線形回帰モデルの直線を追加する

線形回帰 - Wikipedia

線形回帰モデルを追加するには、stat_smooth()を追加します。
method引数は、lmを指定します。

sp + geom_point() + stat_smooth(method=lm)

f:id:MukkuJohn:20160830214126p:plain

デフォルトの指定方法ですと、95%の信頼区間がついてきます。
信頼区間を変更するためには、level引数を指定します。

sp + geom_point() + stat_smooth(method=lm, level=0.99)

f:id:MukkuJohn:20160830214411p:plain

信頼区間を無効にする場合は、se引数です。

sp + geom_point() + stat_smooth(method=lm, se=FALSE)

f:id:MukkuJohn:20160830214500p:plain

直線は、色や線のタイプ、太さを変更できます。

sp + geom_point(colour="grey60") +
  stat_smooth(method=lm, se=FALSE,
              colour="lightgreen",linetype="dashed",size=3)

f:id:MukkuJohn:20160830215006p:plain

線形回帰ですと、ageYearが小さい個所について
モデルが、データにフィットしているの?という思いがわいてきます。

そこで、違うモデルの線をプロットしてみます。

局所多項式

stat_smooth()のデフォルトmethod引数を指定しない場合)
近くのデータ点にフィットさせる多項式が適用されます。(loess曲線:局所加重多項式
曲線あてはめ - Wikipedia*1

#levelを指定していないので、95%信頼区間です。
sp + geom_point(colour="grey60") + stat_smooth()

f:id:MukkuJohn:20160830220022p:plain

線形回帰の直線よりも、こちらの方が納得感がありますね。

ロジスティック回帰

MASSライブラリに含まれるbiopsyデータセットを使います。
R: Biopsy Data on Breast Cancer Patients
乳がんの腫瘍の厚さや大きさなどと、良性か悪性かのデータセットになっています。

良性か悪性かがファクタになっていますので、数値型の列を追加します。

b <- biopsy
b$classn[b$class=="benign"] <- 0
b$classn[b$class=="malignant"] <- 1

V1列と数値型で追加したclassn列を使います。

> head(b[, c("V1","classn")],3)
  V1 classn
1  5      0
2  5      0
3  3      0

> str(b[, c("V1","classn")])
'data.frame':	699 obs. of  2 variables:
 $ V1    : int  5 5 3 6 4 8 1 2 2 4 ...
 $ classn: num  0 0 0 0 0 1 0 0 0 0 ...

プロットしてみます。

ggplot(b, aes(x=V1,y=classn)) +
  geom_point() +
  stat_smooth(method=glm,family=binomial)

f:id:MukkuJohn:20160830222340p:plain

点が同じ個所にプロットされ、オーバープロットが発生しています。
点に揺らぎを与えた上で、見やすい形でプロットします。

ggplot(b, aes(x=V1,y=classn)) +
  geom_point(position=position_jitter(width=0.3,height=0.06),
             alpha=.4,shape=21,size=1.5) +
  stat_smooth(method=glm,family=binomial)

f:id:MukkuJohn:20160830222540p:plain

x軸が腫瘍の厚さで、y軸が良性:0~悪性:1になっています。
腫瘍の厚さの0~2.5と、5~7.5の範囲を比較すると、一目瞭然ですね。

一定の厚さを超えると、ほぼ悪性であると言えそうです。

この例ですと、ファクタで定義されていたclass値を数値に変えましたが
ファクタごとに、グループ化されている散布図について確認してみます。

グループ化されたデータポイントへのモデル

データセットは、heightweightを使います。
ファクタでグループ化した散布図は、この記事で扱っています。
mukkujohn.hatenablog.com

対象のグラフがこちら。
f:id:MukkuJohn:20160830223513p:plain
上のグラフはこちらのコードです。

#プロットした内容を、オブジェクトspsとして作成しておきます
sps <- ggplot(heightweight, aes(x=ageYear,y=heightIn,colour=sex))+
  geom_point() + scale_colour_brewer(palette="Set1")

ファクタでグループ化済の散布図に、geom_smooth()を追加します

#method引数を指定していないので、loess曲線になります
sps + geom_smooth()

f:id:MukkuJohn:20160830223859p:plain
青い線で表現されているmaleと、赤い線で表現されているfemaleで、
x軸に対して、プロットされている範囲が異なります。

これは、判断材料にしているデータの範囲に限定しているためです。

上記に対して、最後まで、線をプロットしたい場合は、
外挿に対応しているモデルを使い、fullrange引数を指定します。
外挿 - Wikipedia

#線形回帰モデルは、外挿に対応しているモデルです
sps + geom_smooth(method=lm,fullrange=TRUE)

f:id:MukkuJohn:20160830224727p:plain

最後まで線をプロットしたい理由から、モデルを変更するのは駄目ですね。
年齢と身長は、線形に関係してないですし。それは、それで羨ましい。


今回は、データポイントに対して、モデルを適用しましたが、
次回は、モデルが既にあって、プロットしたい場合にどうするか?を扱います。

*1:良さげな記事が見つかりませんでした。