2

私はまだ R に不慣れで、通常のプロット関数を使用して R で簡単にプロットできるライブラリ vegan の使用方法を学ぼうとしています。ggplot でデータをプロットしたいときに問題が発生します。作成したリストから適切なデータを抽出する必要があることはわかっていますが、どのデータをどのように抽出するのでしょうか? 私が練習してきたデータセットは、ここからダウンロードできますhttps://drive.google.com/file/d/0B1PQGov60aoudVR3dVZBX1VKaHc/view?usp=sharing データを変換するために使用したコードは次のとおりです。

library(vegan)
library(dplyr)
library(ggplot2)
library(grid)
data <- read.csv(file = "People.csv", header = T, sep = ",", dec = ".", check.names = F, na.strings=c("NA", "-", "?"))
data2 <- data[,-1]
rownames(data2) <- data[,1]
data2 <- scale(data2, center = T, scale = apply(data2, 2, sd))
data2.pca <- rda(data2)

これにより、基本的な「プロット」および「バイプロット」関数を使用してプロットできるリストが得られますが、ggplot で PCA とバイプロットの両方をプロットする方法について途方に暮れています。また、性別などのグループごとにデータポイントを色付けしたいと思います。どんな助けでも素晴らしいでしょう。

4

3 に答える 3

6

これには、私のggveganパッケージを使用できます。rdaおよびを含むいくつかのクラスのオブジェクトで使用できますが、まだ開発中ですcca

サンプルデータと分析を仮定すると、次のことが簡単に実行できます。

autoplot(data2.pca, arrows = TRUE)

必要な種類のバイプロットを取得します。これにより、

ここに画像の説明を入力

経由でサイトのラベルを取得できます

autoplot(data2.pca, arrows = TRUE, geom = "text", legend = "none")

また、必要に応じて凡例を抑制する方法も示しています ( ggplot2legend.positionの同じテーマ要素に適した値を取ります)。

ここに画像の説明を入力

メソッドを使用したものの外観以​​外に大量の制御はできませんがautoplot()(まだ!)、ggplot2が必要とfortify()する方法でデータを取得し、他の回答のアイデアを使用するか、コードを研究することができます。詳細。ggvegan:::autoplot.rda

パッケージがまだ CRAN にないため、github からggveganをインストールする必要があります。

install.packages("devtools")
devtools::install_github("gavinsimpson/ggvegan")

これにより、バージョン 0.0-6 (またはそれ以降) が得られます。これには、以前のバージョンよりもきれいなプロットを生成するための微調整が含まれています。

于 2015-08-26T16:08:59.573 に答える
2

package にはggbiplot(...)関数がありggbiplotますが、クラス prcomp、princomp、PCA、または lda のオブジェクトでのみ機能します。

plot.rda(...)PC1 - PC2 スペースに各ケース (人) を配置するだけです。biplot.rda(...)元のデータセットの各変数の PC1 および PC2 負荷にベクトルを追加します。rda オブジェクト自体ではなく、rda オブジェクトを要約して生成されたデータplot.rda(...)を使用することがわかりました。biplot.rda(...)

smry <- summary(data2.pca)
df1  <- data.frame(smry$sites[,1:2])       # PC1 and PC2
df2  <- data.frame(smry$species[,1:2])     # loadings for PC1 and PC2
rda.plot <- ggplot(df1, aes(x=PC1, y=PC2)) + 
  geom_text(aes(label=rownames(df1)),size=4) +
  geom_hline(yintercept=0, linetype="dotted") +
  geom_vline(xintercept=0, linetype="dotted") +
  coord_fixed()
rda.plot

rda.biplot <- rda.plot +
  geom_segment(data=df2, aes(x=0, xend=PC1, y=0, yend=PC2), 
               color="red", arrow=arrow(length=unit(0.01,"npc"))) +
  geom_text(data=df2, 
            aes(x=PC1,y=PC2,label=rownames(df2),
                hjust=0.5*(1-sign(PC1)),vjust=0.5*(1-sign(PC2))), 
            color="red", size=4)
rda.biplot

これらの結果を比較すると、同じであることがわかるplot(data2.pca)biplot(data2.pca)思います。信じられないかもしれませんが、最も難しいのは、テキストを矢印に合わせて適切に配置することです。

于 2015-08-25T04:58:12.687 に答える
2

ggbiplot@jlhoward によると、同じ名前のパッケージから使用できます。rdaあとは、結果をprcompによって認識される結果にキャストするだけですggbiplot。これを行う関数は次のとおりです。

#' Cast vegan::rda Result to base::prcomp
#'
#' Function casts a result object of unconstrained
#' \code{\link[vegan]{rda}} to a \code{\link{prcomp}} result object.
#'
#' @param x An unconstrained \code{\link[vegan]{rda}} result object.
#'
#' @importFrom vegan scores
#' @export
`as.prcomp.rda` <-
    function(x)
{
    if (!is.null(x$CCA) || !is.null(x$pCCA))
        stop("works only with unconstrained rda")
    structure(
        list(sdev = sqrt(x$CA$eig),
             rotation = x$CA$v,
             center = attr(x$CA$Xbar, "scaled:center"),
             scale = if(!is.null(scl <- attr(x$CA$Xbar, "scaled:scale")))
                         scl
                     else
                         FALSE,
             x = scores(x, display = "sites", scaling = 1,
             choices = seq_len(x$CA$rank),
             const = sqrt(x$tot.chi * (nrow(x$CA$u)-1)))),
        class = "prcomp")
}
于 2015-08-26T10:17:18.900 に答える