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))
線形回帰モデルの直線を追加する
線形回帰モデルを追加するには、stat_smooth()を追加します。
method引数は、lmを指定します。
sp + geom_point() + stat_smooth(method=lm)
デフォルトの指定方法ですと、95%の信頼区間がついてきます。
信頼区間を変更するためには、level引数を指定します。
sp + geom_point() + stat_smooth(method=lm, level=0.99)
信頼区間を無効にする場合は、se引数です。
sp + geom_point() + stat_smooth(method=lm, se=FALSE)
直線は、色や線のタイプ、太さを変更できます。
sp + geom_point(colour="grey60") + stat_smooth(method=lm, se=FALSE, colour="lightgreen",linetype="dashed",size=3)
線形回帰ですと、ageYearが小さい個所について
モデルが、データにフィットしているの?という思いがわいてきます。
そこで、違うモデルの線をプロットしてみます。
局所多項式
stat_smooth()のデフォルト(method引数を指定しない場合)は
近くのデータ点にフィットさせる多項式が適用されます。(loess曲線:局所加重多項式)
曲線あてはめ - Wikipedia*1
#levelを指定していないので、95%信頼区間です。 sp + geom_point(colour="grey60") + stat_smooth()
線形回帰の直線よりも、こちらの方が納得感がありますね。
ロジスティック回帰
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)
点が同じ個所にプロットされ、オーバープロットが発生しています。
点に揺らぎを与えた上で、見やすい形でプロットします。
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)
x軸が腫瘍の厚さで、y軸が良性:0~悪性:1になっています。
腫瘍の厚さの0~2.5と、5~7.5の範囲を比較すると、一目瞭然ですね。
一定の厚さを超えると、ほぼ悪性であると言えそうです。
この例ですと、ファクタで定義されていたclass値を数値に変えましたが
ファクタごとに、グループ化されている散布図について確認してみます。
グループ化されたデータポイントへのモデル
データセットは、heightweightを使います。
ファクタでグループ化した散布図は、この記事で扱っています。
mukkujohn.hatenablog.com
対象のグラフがこちら。
上のグラフはこちらのコードです。
#プロットした内容を、オブジェクト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()
青い線で表現されているmaleと、赤い線で表現されているfemaleで、
x軸に対して、プロットされている範囲が異なります。
これは、判断材料にしているデータの範囲に限定しているためです。
上記に対して、最後まで、線をプロットしたい場合は、
外挿に対応しているモデルを使い、fullrange引数を指定します。
外挿 - Wikipedia
#線形回帰モデルは、外挿に対応しているモデルです sps + geom_smooth(method=lm,fullrange=TRUE)
最後まで線をプロットしたい理由から、モデルを変更するのは駄目ですね。
年齢と身長は、線形に関係してないですし。それは、それで羨ましい。
今回は、データポイントに対して、モデルを適用しましたが、
次回は、モデルが既にあって、プロットしたい場合にどうするか?を扱います。
*1:良さげな記事が見つかりませんでした。