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?

Swapnil 'Tux' Takle
quelle
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)
Manuel Ramón
quelle
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

Jot eN
quelle
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

Marc in der Box
quelle
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

epo3
quelle
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')
TSeymour
quelle