ランダムフォレストのMDS plotで誤分類されている標本だけ書式を変える

 Rでランダムフォレストの結果に基づく多次元尺度法の散布図(MDS plot)を作成し、他クラスに誤分類されている標本だけ書式を変えたい、という要望があったので、今回はそれに挑戦してみます。以下は、「とりあえずできた」という程度のコードなので、もっと良い書き方があるかも知れません。分析データは、irisデータセットです。

# パッケージの読み込み
library(randomForest)
# 乱数の種の固定
set.seed(1)
# ランダムフォレストの実行(近接性も計算)
rf.model <- randomForest(Species ~ ., data = iris, proximity = TRUE)
# ランダムフォレストの結果に基づく多次元尺度法の散布図を作成
MDSplot(rf.model, iris$Species)

 上記のスクリプトを実行すると、以下のような図が表示されます。

f:id:langstat:20170211191003p:plain

 では、この図を力技で加工します。

# 正解データと判別結果の照合
# (rf.model$yが正解データで、rf.model$predictedが判別結果)
TF <- rf.model$y == rf.model$predicted
# 正しく分類されているか否かの論理値(TRUE/FALSE)を数値(1/0)に変換
TF.n <- as.numeric(TF)
# MDS plotの結果を変数に代入
MDS.result <- MDSplot(rf.model, iris$Species)
# 誤分類されている標本だけ書式を変えて描画
# (MDS plotの座標データは、MDS.result$points)
# colの指定で、いくつの数値を足すかは好みの問題
# (ただ、何も足さないと、誤分類されている標本が表示されない)
plot(MDS.result$points, pch = as.numeric(iris$Species), col = TF.n + 2)

 上記のスクリプトを実行すると、以下のような図が表示されます。この図では、3種類のアヤメがそれぞれ○、△、+の記号で表示されています。また、正しいクラスに分類できたものが緑、誤ったクラスに分類されたものが赤で表されています。*1 引数colや引数pchなどは、お好みで変えてください。

f:id:langstat:20170211190436p:plain

 そして、誤分類されている標本に標本番号を振る場合は、以下のようにします(これも力技なので、もっと洗練された書き方があると思います)。

# 誤分類されている標本の番号を取得
n <- grep(FALSE, TF)
# 誤分類されている標本の番号を表示
# 座標にいくつの数値を足すかは職人芸(笑)
# (ただ、何も足さないと、記号の上に文字列が重なってしまう)
text(MDS.result$points[n, ] + 0.03, as.character(n), cex = 0.5)

 上記のスクリプトを実行すると、以下のような図が表示されます。

f:id:langstat:20170211192232p:plain

 「やさしい」赤ペン先生をゆるぼします(笑)

*1:plotで使用できる色については、こちらなどを参照。