Rを使用した多次元データの生成と視覚化

所定の相関関係を持つデータを生成する能力は、モデリングにとって非常に重要です。 Rは、多次元分布からデータを生成および視覚化するためのパッケージと関数-広範なツールのセットを期待しています。 mvtnormパッケージは、多次元正規分布とt分布の両方をシミュレートする機能も提供しますが、多次元正規分布データを生成するための基本関数はMASSパッケージのRのmvrnorm()



です。



以下のコードブロックは、平均(0、0)とコードで指定されたSigma共分散行列を持つ2次元正規分布から5000サンプルを生成します。 MASSパッケージのkde2d()



関数は、2次元の音響分布密度推定値を生成します。

 #    # https://stat.ethz.ch/pipermail/r-help/2003-September/038314.html #      library(MASS) #     mu <- c(0,0) #  Sigma <- matrix(c(1, .5, .5, 1), 2) #  
      
      





 # > Sigma # [,1] [,2] # [1,] 1.0 0.1 # [2,] 0.1 1.0
      
      





 #    N(mu, Sigma) bivn <- mvrnorm(5000, mu = mu, Sigma = Sigma ) #   MASS head(bivn) #      bivn.kde <- kde2d(bivn[,1], bivn[,2], n = 50) #   MASS
      
      





Rは、分布を視覚化するいくつかの方法を提供します。 次の2行のコードは、ポイントの密度を色のグラデーションにマッピングするヒートマップ上に等高線グラフを重ね合わせます。

 #     ,     image(bivn.kde) #     contour(bivn.kde, add = TRUE) #    
      
      





画像



グラフは、シミュレートされたデータの不規則な輪郭を示しています。 以下のコードは、 ellipseパッケージのellipse()



関数を使用して、多くのチュートリアルで見られる古典的な2次元正規分布グラフを生成します。

 #      library(ellipse) rho <- cor(bivn) y_on_x <- lm(bivn[,2] ~ bivn[,1]) #  Y ~ X x_on_y <- lm(bivn[,1] ~ bivn[,2]) #  X ~ Y plot_legend <- c("99%  ", "95%  ","90%  ", "Y  X ", "X  Y ") plot(bivn, xlab = "X", ylab = "Y", col = "dark blue", main = "     ") lines(ellipse(rho), col="red") # ellipse()   ellipse lines(ellipse(rho, level = .99), col="green") lines(ellipse(rho, level = .90), col="blue") abline(y_on_x) abline(x_on_y, col="brown") legend(3,1,legend=plot_legend,cex = .5, bty = "n")
      
      





次のコードは、いくつかの3次元表面グラフを生成します。 2番目はrglグラフで、画面上でさまざまな角度で直接回転および表示できます。

 #   #    persp(bivn.kde, phi = 45, theta = 30, shade = .1, border = NA) #     #   RGL library(rgl) col2 <- heat.colors(length(bivn.kde$z))[rank(bivn.kde$z)] persp3d(x=bivn.kde, col = col2)
      
      





次に、サウンド分布密度推定の表座標からx、y、およびzの値を取得するコードを作成しましょう。 threejs javascriptパッケージであるhtmlwidgetsの新しいscatterplot3js()関数を使用して、サーフェスを構築できます。 この視覚化では、rglプロットのような詳細レベルの表面は表示されません。 それにもかかわらず、それはpdfのいくつかの基本的な機能を示し、大きな利点があります-Webページに簡単に統合できます。 HTMLウィジェットのグラフィックスはよりシンプルで使いやすいと思います。

 # threejs Javascript- library(threejs) #      kde x <- bivn.kde$x; y <- bivn.kde$y; z <- bivn.kde$z #   x,y,z xx <- rep(x,times=length(y)) yy <- rep(y,each=length(x)) zz <- z; dim(zz) <- NULL #    ra <- ceiling(16 * zz/max(zz)) col <- rainbow(16, 2/3) #  3D-  scatterplot3js(x=xx,y=yy,z=zz,size=0.4,color = col[ra],bg="black")
      
      





以下のコードは、 tmvtnormパッケージのrtmvt()



関数を使用して、2次元のt分布を生成します。 rglグラフは、音響分布密度推定の表面を詳細に示します。

 #      t- library (tmvtnorm) Sigma <- matrix(c(1, .1, .1, 1), 2) #   X1 <- rtmvt(n=1000, mean=rep(0, 2), sigma = Sigma, df=2) #   tmvtnorm t.kde <- kde2d(X1[,1], X1[,2], n = 50) #   MASS col2 <- heat.colors(length(bivn.kde$z))[rank(bivn.kde$z)] persp3d(x=t.kde, col = col2)
      
      





画像

データサイエンスの観点から見た多次元分布関数の真価は、3つ以上の変数を持つデータセットをシミュレートすることです。 上記の機能はこの問題の解決に適していますが、いくつかの技術的な考慮事項があり、もちろん視覚化は利用できません。 以下のコードは、特定の共分散行列を持つ多次元正規分布から10個の変数を生成します。 clusterGenerationパッケージのgenPositiveDefmat()



関数が共分散行列の生成に使用されたことに注意してください。 これは、 mvrnorm()



関数がエラーをmvrnorm()



です。共分散行列が正定値でない場合、理論的には発生するはずであり、多次元行列の要素の組み合わせを選択して正定値にするには、幸運と計算に時間が必要です。



マトリックスを生成した後、 corrplotパッケージのcorrplot()



関数を使用して、色と形状によって決定されるペアワイズ相関の美しいグラフを導き出します。 corrplot()



は、変数の数の増加にcorrplot()



スケーリングし、40〜50個の変数に対して適切な結果を生成します。 (情報については、 ggcorrplotggplot2グラフに使用されるようになりました。)他のオプションを使用して、ペアワイズ散布図をプロットできます。Rは多くの選択肢を提供します。

 #  library(corrplot) library(clusterGeneration) mu <- rep(0,10) pdMat <- genPositiveDefMat(10,lambdaLow=10) Sigma <- pdMat$Sigma dim(Sigma) mvn <- mvrnorm(5000, mu = mu, Sigma = Sigma ) corrplot(cor(mvn), method="ellipse", tl.pos="n", title=" ")
      
      





最後に、正規分布とt分布以外の他の多次元分布についてはどうでしょうか? Rは、 compositionsパッケージのrlnorm()



など、 rlnorm()



対数正規分布からランダム変数を生成するいくつかの関数を提供します。 それらはmvrorm()



と同じmvrorm()



簡単に使用できますが、探す必要があります。 本当に確率分布で作業する必要がある場合、より実り多いアプローチは、 コピュラパッケージに精通することだと思います。



All Articles