Funktion für die Erstellung einer Korrelationsmatrix

Varianzanalyse, Diskriminanzanalyse, Kontingenzanalyse, Faktorenanalyse, Clusteranalyse, MDS, ....

Moderator: EDi

Antworten
synchiropus
Beiträge: 3
Registriert: Di Aug 20, 2019 10:39 am

Funktion für die Erstellung einer Korrelationsmatrix

Beitrag von synchiropus » Di Aug 20, 2019 11:21 am

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

jogo
Beiträge: 1458
Registriert: Fr Okt 07, 2016 8:25 am

Re: Funktion für die Erstellung einer Korrelationsmatrix

Beitrag von jogo » Di Aug 20, 2019 11:25 am

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

synchiropus
Beiträge: 3
Registriert: Di Aug 20, 2019 10:39 am

Re: Funktion für die Erstellung einer Korrelationsmatrix

Beitrag von synchiropus » Di Aug 20, 2019 11:43 am

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?

jogo
Beiträge: 1458
Registriert: Fr Okt 07, 2016 8:25 am

Re: Funktion für die Erstellung einer Korrelationsmatrix

Beitrag von jogo » Di Aug 20, 2019 11:50 am

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

synchiropus
Beiträge: 3
Registriert: Di Aug 20, 2019 10:39 am

Re: Funktion für die Erstellung einer Korrelationsmatrix

Beitrag von synchiropus » Di Aug 20, 2019 12:10 pm

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?

jogo
Beiträge: 1458
Registriert: Fr Okt 07, 2016 8:25 am

Re: Funktion für die Erstellung einer Korrelationsmatrix

Beitrag von jogo » Di Aug 20, 2019 1:18 pm

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)

Antworten