Seite 1 von 1

Funktion für die Erstellung einer Korrelationsmatrix

Verfasst: Di Aug 20, 2019 11:21 am
von synchiropus
Hallo,

ich hoffe ich poste hier an der richtigen Stelle.
Mein Problem ist Folgendes: Ich möchte eine Funktion erstellen, die für die als Parameter angegebene Matrix die Variablen paarweise den Korrelationskoeffizienten nach Pearson berechnet.
Genauer: Die Form der Matrix die ich als Parameter angebe entspricht vom Aufbau her dem eines dataframes, dh in der ersten Zeile befinden sich die Spaltennamen, in den darauf folgenden Zeilen die Beobachtungen. Der Output soll eine Matrix sein, die im Endeffekt wie ein corrplot ist, dh die erste Variable soll mit allen anderen auf Korrelation überprüft werden und das Ergebnis soll jeweils in ein "Feld", der Matrix.

Hier mein bisheriger Versuch:

Code: Alles auswählen

 cor.test.matrix<- function(mat)
{ p <- dim(mat)[2]
 korr.matrix <- matrix(nrow = p, ncol = p, data = 0)
 for(i in 1:p)
 {for(j in 1:p)
 {korr.matrix <- korr.matrix[i,j]+cor.test(formula = ~i+j, data = mat, method = "pearson")$statistics}}
  return(korr.matrix)}
Wenn ich dann aber meine funktion mit einer Matrix laufen lassen will bekomme ich folgende Fehlermeldung

Code: Alles auswählen

Error in cor.test.default(x = 1L, y = 1L, method = "pearson") : 
  not enough finite observations
Hier einmal die Struktur der Matrix, die ich mit der Funktion analysieren will

Code: Alles auswählen

> str(X)
 num [1:548, 1:6] 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:548] "1" "2" "4" "5" ...
  ..$ : chr [1:6] "(Intercept)" "age" "duration" "residence_since" ...
 - attr(*, "assign")= int [1:6] 0 1 2 3 4 5
und der Anfang

Code: Alles auswählen

head(X)
   (Intercept) age duration residence_since num_dependents
1            1  67        6               4              1
2            1  22       48               2              1
4            1  45       42               4              2
5            1  53       24               4              2
8            1  35       36               2              1
10           1  28       30               2              1
   installment_commitment
1                       4
2                       2
4                       2
5                       3
8                       2
10                      4
Die Funktion benötige ich für meine Matrix X, sie soll aber auch mit anderen Matrizen entsprechender Form funktionieren.
Danke schonmal für eure Zeit, ich hoffe jemand kann mir helfen. Falls

Re: Funktion für die Erstellung einer Korrelationsmatrix

Verfasst: Di Aug 20, 2019 11:25 am
von jogo
Hallo synchiropus,

willkommen im Forum!
Hm, die Funktion cor() kann auch mit Matrizen umgehen und liefert dann paarweise Korrelationskoeffizienten:

Code: Alles auswählen

I <- iris[-5]
cor(I)
Wahrscheinlich kannst Du einfach

Code: Alles auswählen

cor(X)
schreiben.

Gruß, Jörg

Re: Funktion für die Erstellung einer Korrelationsmatrix

Verfasst: Di Aug 20, 2019 11:43 am
von synchiropus
Hallo jogo,

vielen lieben Dank für den Tipp mit cor() (funktioniert auch), ich möchte das ganze aber mit cor.test() und schleifen lösen, um mehr Verständnis aufzubauen, bin ich da auf dem Richtigen weg mit meinem Code?

Re: Funktion für die Erstellung einer Korrelationsmatrix

Verfasst: Di Aug 20, 2019 11:50 am
von jogo
Deine Zeile:

Code: Alles auswählen

korr.matrix <- korr.matrix[i,j]+ ...
ist schon an dieser Stelle falsch, denn Du willst doch nicht die ganze Matrix korr.matrix überschreiben. Auch Dein Einsatz von cor.test.formula() ist falsch: i und j taugen dort nicht als Variablennamen in der Formel. Bitte lies nochmal die Dokumentation.

eher möchtest Du sowas:

Code: Alles auswählen

I <- as.matrix(iris[-5])
cor(I)

cor.test.matrix<- function(mat) { 
  p <- dim(mat)[2]
  korr.matrix <- matrix(nrow = p, ncol = p, data = 0)
  for(i in 1:p) {
    for(j in 1:p) {
      korr.matrix[i,j] <- cor.test(mat[, i], mat[, j])$statistic
    }
  }
  return(korr.matrix)
}

cor.test.matrix(I)
Gruß, Jörg

Re: Funktion für die Erstellung einer Korrelationsmatrix

Verfasst: Di Aug 20, 2019 12:10 pm
von synchiropus
Die Dokumentation hab ich mir schon angeschaut, scheine aber nicht alles richtig verstanden zu haben. Hab meinen code jetzt entsprechend deines Tipps wie folgt abgewandelt:

Code: Alles auswählen

cor.test.matrix <- function(mat)
{ p <- dim(mat)[2]
 korr.matrix <- matrix(nrow = p, ncol = p, data = 0)
 for(i in 1:p)
 {for(j in 1:p)
 {korr.matrix <- cor.test(formula = ~mat[,i]+mat[,j], data = mat, method = "pearson")$estimate
  }}
  return(korr.matrix)}
jedoch liefert

Code: Alles auswählen

cor.test.matrix(X)
folgenden output

Code: Alles auswählen

Standardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullStandardabweichung ist NullNULL
Was ist da denn jetzt schief gegangen? So weit ich verstehe sollte mein cor.test jetzt für die erste spalte mit der ersten spalte den Korrelationskoeffizienten an Stelle [1,1] in der Matrix speichern, dann für die erste Spalte mit der 2. Spalte den Koeffizienten an Stelle [1,2] usw. ist der Fehler in meiner Logik oder "nur" in der Syntax?

Re: Funktion für die Erstellung einer Korrelationsmatrix

Verfasst: Di Aug 20, 2019 1:18 pm
von jogo
auch mat[,i] und mat[,j] taugen nicht als Variablennamen für das Formel-Interface. Bitte schau Dir das letzte der Beispiele an:

Code: Alles auswählen

example(cor.test)
für ein Beispiel, wie das Formel-Interface einzusetzen ist.

Gruß, Jörg
p.s.: ... und Du hast den großen Fehler, auf den ich Dich hingewiesen habe, nicht korrigiert.
Bei mir sieht es aktuell so aus:

Code: Alles auswählen

I <- as.matrix(iris[-5])
cor(I)

cor.test.matrix<- function(mat) { 
  p <- dim(mat)[2]
  korr.matrix <- matrix(0, p, p)
  for(i in 1:p) for(j in 1:p) korr.matrix[i,j] <- cor.test(mat[, i], mat[, j])$estimate
  return(korr.matrix)
}

cor.test.matrix(I)