Wie kann ich eine Korrelationsmatrix in R erstellen?


85

Ich habe 92 Datensätze des gleichen Typs.

Ich möchte eine Korrelationsmatrix für zwei beliebige Kombinationen ermöglichen.

dh ich möchte eine Matrix von 92 x 92.

so dass das Element (ci, cj) die Korrelation zwischen ci und cj sein sollte.

Wie mache ich das?


5
Schauen Sie sich die corFunktion oder die rcorrFunktion im HmiscPaket an
— Manuel Ramón

Ich kann den Kern zwischen zwei Parametern finden. Die Sache ist, wie man sie in Matrix anordnet?
— Swapnil 'Tux' Takle

6
Wie um alles in der Welt hat das so viele positive Stimmen bekommen?
— Fund Monica Klage

Antworten:


104

Ein Beispiel,

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

72

Sie könnten das Corrplot-Paket verwenden.

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

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen finden Sie hier: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html


Ist es möglich, ein Diagramm zu erhalten, das diesen ähnlich ist: cran.r-project.org/web/packages/corrplot/vignettes/… oder eine einfache Matrix, jedoch mit dem R-Quadrat anstelle der Pearson-, Kendall- oder Spearman-Korrelation?
— FraNut

R2 entspricht dem Quadrat des Pearson-Korrelationskoeffizienten. Sie müssen also nur M mit M multiplizieren (Korrelationsmatrix mit sich selbst multiplizieren), bevor Sie den Plot erstellen.
— Jot eN

17

Die cor- Funktion verwendet die Spalten der Matrix bei der Berechnung der Korrelation. Die Anzahl der Zeilen muss also zwischen Ihrer Matrix x und der Matrix y gleich sein . Ex.:

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))

Geben Sie hier die Bildbeschreibung ein

Bearbeiten:

Hier ist ein Beispiel für benutzerdefinierte Zeilen- und Spaltenbeschriftungen in einer Korrelationsmatrix, die mit einer einzelnen Matrix berechnet wurde:

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()

Geben Sie hier die Bildbeschreibung ein


Das Beispiel von @Manuel Ramón ist wahrscheinlich am besten für Ihren Fall geeignet (eine einzelne Matrix) - organisieren Sie Ihre Datensätze als Spalten.
— Marc in der Box

Wie kann man im obigen Bild die Farben "invertieren"? Die Korrelation zwischen Rot und Rot liegt nahe bei -1 oder 1 und Weiß zwischen 0 und Weiß.
— Tagoma

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column")
— Marc in der Box

@Marcinthebox Wie würden Sie der x- und y-Achse variable Beschriftungen hinzufügen (anstelle von Zahlen)? Vielen Dank
— Agustín Indaco

@ AgustínIndaco - Ich habe meine Antwort mit einem weiteren Beispiel aktualisiert. Die imageFunktion übernimmt nicht automatisch die Zeilen- und Spaltennamen, daher muss dies hinzugefügt werden.
— Marc in der Box

15

Schauen Sie sich qtlcharts an . Sie können interaktive Korrelationsmatrizen erstellen :

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

Geben Sie hier die Bildbeschreibung ein

Es ist beeindruckender, wenn Sie mehr Variablen korrelieren, wie in der Vignette des Pakets: Geben Sie hier die Bildbeschreibung ein


1

Es gibt andere Möglichkeiten, dies hier zu erreichen: ( Zeichnen Sie die Korrelationsmatrix in ein Diagramm ), aber ich mag Ihre Version mit den Korrelationen in den Feldern. Gibt es eine Möglichkeit, die Variablennamen der x- und der y-Spalte anstelle nur dieser Indexnummern hinzuzufügen? Für mich wäre das eine perfekte Lösung. Vielen Dank!

edit: Ich habe versucht, den Beitrag von [Marc in the box] zu kommentieren, aber ich weiß eindeutig nicht, was ich tue. Es ist mir jedoch gelungen, diese Frage für mich selbst zu beantworten.

Wenn d die Matrix (oder der ursprüngliche Datenrahmen) ist und die Spaltennamen Ihren Wünschen entsprechen, funktioniert Folgendes:

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

las = 0 würde die Namen wieder in ihre normale Position bringen, meine waren lang, also habe ich las = 2 verwendet, um sie senkrecht zur Achse zu machen.

edit2: Um zu unterdrücken, dass die image () - Funktion Zahlen auf dem Raster druckt (andernfalls überlappen sie Ihre variablen Beschriftungen), fügen Sie xaxt = 'n' hinzu, z.

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')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.