web-dev-qa-db-ja.com

R-PCAバイプロットを読みやすくする方法

23の変数を持つ観測値のセットがあります。

Prcompとbiplotを使用して結果をプロットすると、いくつかの問題が発生します。

  1. 実際のプロットはフレームの半分(x <0)しか占有しませんが、プロットは0を中心とするため、スペースの半分が無駄になります

  2. 2つの変数が結果を明確に支配しているため、他のすべての矢印がまとまり、物事を読み取ることができない

ad 1. xlimやylimを設定しようとしましたが、プロットがすべて混乱しているため、明らかに何かが間違っています。

ad 2.どういうわけか、矢印のラベルをもっと離れて配置して、読み取れるようにできますか?または、2つの最も長い矢印なしで矢印をプロットすることもできます(ズームインのようなもの)?

My PCA plot

補遺:バイプロットに矢印とは異なる色でラベルを描画させることは可能ですか?

また、x軸とy軸が比例していない場合、問題がありますか(これらのグラフは、xとyで異なる長さの間隔を示しています)。私はこれが矢印の間に天使をゆがめると思います、そしてそのようなサイズ変更は相似変換ではありません。バイプロットが1:1のアスペクト比を維持するように強制すること、またはプロットを正方形ではなく長方形として描画することは可能ですか?

12
Jakub Bochenski

xlimylimを使用できると思います。また、?biplotexpand引数を確認してください。残念ながら、データを提供しなかったので、サンプルデータをいくつか取りましょう。

a <- princomp(USArrests)

biplotを呼び出した結果の下:

biplot(a)

enter image description here

そして、xlimylimを使用して "Murder"と "Rape"をさらに詳しく調べ、?biplotのスケーリング引数expandを使用することができます。

biplot(a, expand=10, xlim=c(-0.30, 0.0), ylim=c(-0.1, 0.1))

enter image description here

expand係数により、上軸と右軸のスケーリングが異なることに注意してください。

これはあなたの陰謀を可読にするのに役立ちますか?

[〜#〜]編集[〜#〜]

また、ラベルと矢印の色を変えることができるかどうかも尋ねました。 biplotはこれをサポートしていません。stats:::biplot.defaultのコードをコピーし、必要に応じて変更することができます(colplotaxisを使用する場合は、text引数を変更してください)。

または、バイプロットにggplotを使用することもできます。投稿 here では、単純なバイプロット関数が実装されています。次のようにコードを変更できます。

PCbiplot <- function(PC, x="PC1", y="PC2", colors=c('black', 'black', 'red', 'red')) {
    # PC being a prcomp object
    data <- data.frame(obsnames=row.names(PC$x), PC$x)
    plot <- ggplot(data, aes_string(x=x, y=y)) + geom_text(alpha=.4, size=3, aes(label=obsnames), color=colors[1])
    plot <- plot + geom_hline(aes(0), size=.2) + geom_vline(aes(0), size=.2, color=colors[2])
    datapc <- data.frame(varnames=rownames(PC$rotation), PC$rotation)
    mult <- min(
        (max(data[,y]) - min(data[,y])/(max(datapc[,y])-min(datapc[,y]))),
        (max(data[,x]) - min(data[,x])/(max(datapc[,x])-min(datapc[,x])))
        )
    datapc <- transform(datapc,
            v1 = .7 * mult * (get(x)),
            v2 = .7 * mult * (get(y))
            )
    plot <- plot + coord_equal() + geom_text(data=datapc, aes(x=v1, y=v2, label=varnames), size = 5, vjust=1, color=colors[3])
    plot <- plot + geom_segment(data=datapc, aes(x=0, y=0, xend=v1, yend=v2), arrow=arrow(length=unit(0.2,"cm")), alpha=0.75, color=colors[4])
    plot
}

次のようにプロットします。

fit <- prcomp(USArrests, scale=T)
PCbiplot(fit, colors=c("black", "black", "red", "yellow"))

enter image description here

この関数を少し試してみると、xlimylimの値などを設定する方法がわかると思います。

23
user1981275