Rで相関行列を作成するにはどうすればよいですか?


86

同じタイプのデータが92セットあります。

任意の2つの組み合わせの相関行列を可能にしたい。

つまり、92x92の行列が必要です。

要素(ci、cj)がciとcjの間の相関関係になるようにします。

それ、どうやったら出来るの?


5
顔をしているcor機能、またはにrcorr内の関数Hmisc、パッケージ
マヌエル・ラモン・

2つのパラメータ間の相関関係を見つけることができます。問題は、それらをマトリックスに配置する方法ですか?
Swapnil'Tux 'Takle 2012

6
いったいどうしてこれほど多くの賛成を得たのでしょうか。
モニカの訴訟に資金

回答:



72

'corrplot'パッケージを使用できます。

d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
M <- cor(d) # get correlations

library('corrplot') #package corrplot
corrplot(M, method = "circle") #plot matrix

ここに画像の説明を入力してください

詳細はこちら:http//cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html


これらのグラフcran.r-project.org/web/packages/corrplot/vignettes/…に類似したグラフ、または単純な行列を取得することは可能ですか?ただし、ピアソン、ケンダル、またはスピアマンの相関の代わりに決定係数を使用しますか?
FraNut 2015年

R2は、ピアソン相関係数の2乗に等しくなります。したがって、必要なのは、プロットを作成する前に、MをMで乗算する(相関行列自体を乗算する)ことだけです。
Jot eN 2015年

17

CORの機能は、相関の計算に行列の列を使用します。したがって、行数は行列xと行列yの間で同じでなければなりません。例:

set.seed(1)
x <- matrix(rnorm(20), nrow=5, ncol=4)
y <- matrix(rnorm(15), nrow=5, ncol=3)
COR <- cor(x,y)
COR
image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, xlab="x column", ylab="y column")
text(expand.grid(x=seq(dim(x)[2]), y=seq(dim(y)[2])), labels=round(c(COR),2))

ここに画像の説明を入力してください

編集:

単一の行列で計算された相関行列のカスタムの行と列のラベルの例を次に示します。

png("corplot.png", width=5, height=5, units="in", res=200)
op <- par(mar=c(6,6,1,1), ps=10)
COR <- cor(iris[,1:4])
image(x=seq(nrow(COR)), y=seq(ncol(COR)), z=cor(iris[,1:4]), axes=F, xlab="", ylab="")
text(expand.grid(x=seq(dim(COR)[1]), y=seq(dim(COR)[2])), labels=round(c(COR),2))
box()
axis(1, at=seq(nrow(COR)), labels = rownames(COR), las=2)
axis(2, at=seq(ncol(COR)), labels = colnames(COR), las=1)
par(op)
dev.off()

ここに画像の説明を入力してください


@ManuelRamónの例は、おそらくあなたのケース(単一の行列)に最適です-データセットを列として整理します。
ボックス内のマーク

上の画像では、どのようにして色を「反転」させることができますか?赤の相関は-1または1に近く、白は0に近い場合はどうなりますか?
tagoma 2012

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column")
ボックス内のマーク

@Marcinthebox(数値ではなく)x軸とy軸に変数ラベルをどのように追加しますか?おかげで
アグスティンIndaco

@AgustínIndaco-私はさらなる例で私の答えを更新しました。このimage関数は行と列の名前を自動的に取得しないため、これを追加する必要があります。
ボックス内のマーク

15

qtlchartsを見てください。これにより、インタラクティブな相関行列を作成できます。

library(qtlcharts)
data(iris)
iris$Species <- NULL
iplotCorr(iris, reorder=TRUE)

ここに画像の説明を入力してください

パッケージのビネットのように、より多くの変数を相関させると、より印象的です。 ここに画像の説明を入力してください


1

ここでこれを実現する方法は他にもあります:(相関行列をグラフにプロットする)が、ボックスに相関があるバージョンが好きです。これらのインデックス番号だけでなく、変数名をx列とy列に追加する方法はありますか?私にとって、それはこれを完璧な解決策にするでしょう。ありがとう!

編集:[ボックス内のマーク]による投稿にコメントしようとしましたが、自分が何をしているのかはっきりとわかりません。しかし、私はなんとかこの質問に自分で答えることができました。

dが行列(または元のデータフレーム)であり、列名が必要な場合、次のように機能します。

axis(1, 1:dim(d)[2], colnames(d), las=2)
axis(2, 1:dim(d)[2], colnames(d), las=2)

las = 0は名前を通常の位置に戻します。私の名前は長かったので、las = 2を使用して軸に垂直にしました。

edit2:グリッドに数値を出力するimage()関数を抑制する(そうでない場合は変数ラベルと重なる)には、xaxt = 'n'を追加します。例:

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column", xaxt='n')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.