ggdendrogram: Wird nicht für jede Variable erstellt

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
Frautroll

ggdendrogram: Wird nicht für jede Variable erstellt

Beitrag von Frautroll »

Guten Tag,
ich arbeite aktuell an meiner Bachelorarbeit und bin aktuell noch dabei R zu lernen. Nun bin ich über ein Problem gestoßen, welches ich nicht alleine lösen kann und hoffe das mir hier geholfen werden kann.

Ich habe 128 Variablen, welche ich einzeln Clustern will. Für die Dokumentation möchte ich für jede ein Dendogramm und ein Screeplot erstellen. Zum großteil funktioniert das auch. Nur bei 12 Variablen wird das Dendogram nicht erstellt.
Meine erste Vermutung waren einfach Tippfehler. Deswegen habe ich den Code einer Variablen, die funktioniert, mit dem Code einer Variablen, die nicht funktioniert, verglichen und keine wesentlichen Unterschiede feststellen können.

Code der funktioniert:

Code: Alles auswählen

grp.dist <- dist(wetter.grp.dif$mean.V_N.dif, method = "euclidean")
grp.clust <- hclust(grp.dist, method = "average")
ggdendro::ggdendrogram(grp.clust) + ggtitle("Dendogram Tabelle: wetter.grp.dif, Spalte: mean.V_N.dif")
Code der nicht funktioniert:

Code: Alles auswählen

grp.dist <- dist(wetter.grp.dif$min.V_N.dif, method = "euclidean")
grp.clust <- hclust(grp.dist, method = "average")
ggdendro::ggdendrogram(grp.clust) + ggtitle("Dendogram Tabelle: wetter.grp.dif, Spalte: min.V_N.dif")
Ich arbeite mit R-Studio Version 1.1.447, R Version 3.4.3 und den Paketen "cluster", "ggdendro", "broom", "ggplot2" und "dplyr".
Hoffentlich hat jemand eine Idee woran das liegt und schonmal vielen Dank im Vorraus für die Hilfe :)

Grüße Frautroll
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: ggdendrogram: Wird nicht für jede Variable erstellt

Beitrag von jogo »

Hallo Frautroll,

willkommen im Forum!
Ich vermute, es liegt an den Daten. :shock: (wer hätte das gedacht)
Um das etwas genauer zu beurteilen, benötigen wir den Output von:

Code: Alles auswählen

str(wetter.grp.dif[, c("mean.V_N.dif", "min.V_N.dif")])
summary(wetter.grp.dif[, c("mean.V_N.dif", "min.V_N.dif")])
Gruß, Jörg
Frautroll

Re: ggdendrogram: Wird nicht für jede Variable erstellt

Beitrag von Frautroll »

Danke für das Willkommen und die schnelle Reaktion :)

Der gewünschte Output:

Code: Alles auswählen

> str(wetter.grp.dif[, c("mean.V_N.dif", "min.V_N.dif")])
'data.frame':	3939 obs. of  2 variables:
 $ mean.V_N.dif: num [1:3939, 1] 0.25 -0.75 1.81 -1.25 1.38 0.12 -2.62 1.94 0.25 -0.82 ...
 $ min.V_N.dif : num [1:3939, 1] 3 0 4 -4 4 0 -4 3 0 -2 ...

Code: Alles auswählen

> summary(wetter.grp.dif[, c("mean.V_N.dif", "min.V_N.dif")])
   mean.V_N.dif.V1     min.V_N.dif.V1   
 Min.   :-9.000000   Min.   :-9.000000  
 1st Qu.:-1.310000   1st Qu.:-2.000000  
 Median : 0.000000   Median : 0.000000  
 Mean   : 0.002224   Mean   :-0.000254  
 3rd Qu.: 1.310000   3rd Qu.: 2.000000  
 Max.   : 8.500000   Max.   : 9.000000  
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: ggdendrogram: Wird nicht für jede Variable erstellt

Beitrag von jogo »

Hallo Frautroll,

ich hatte gehofft, dass man in den Ergebnissen einen Unterschied in der Struktur der beiden Variablen sehen könne.
Das ist jedoch nicht der Fall.
Das einzige, was mich wundert, ist (das trifft aber für beide Spalten zu): es sind Matrizen
... eventuell Zugriff auf die eine vorhandene Spalte per wetter.grp.dif$mean.V_N.dif[,1] (z.B.)
Im Gegensatz dazu vergleiche mit

Code: Alles auswählen

str(iris)
Ansonsten bleibt noch das übliche Rumgestochere:
1. Tritt der Effekt an der gleichen Variable/Spalte auf, wenn Du die beiden Codeabschnitte in der Reihenfolge vertauschst?
2. Tritt der Effekt auch auf nach dem restart der R-session.

Und es wäre auch noch die Frage zu klären, was bedeutet "Code der nicht funktioniert" ?

Gruß, Jörg
Frautroll

Re: ggdendrogram: Wird nicht für jede Variable erstellt

Beitrag von Frautroll »

Hmm... ja vielleicht etwas unglücklich formuliert.
Das Problem tritt auf, wenn die dritte Zeile ausgeführt wurde. Bei den "funktionierenden" Codes wird im Anschluss das Dendrogramm im Plot-Bereich angezeigt.
Bei den "nicht funktionierenden" Code erscheint nichts, auch keine Fehlermeldung.

Ein Neustart von der Session hat leider nichts gebracht.

Was ich noch getestet habe ist, das ich die ersten zwei Zeilen des funktionierenden Codes ausführen hab lassen und im Anschluss die dritte Zeile des nicht funktionierenden. Interessanterweise wird das Dendrogramm dann angezeigt.
Dann hab ich mir die Struktur von grp.dist und grp.clust, nach dem befüllen, angeschaut, da aber auch keinen Unterschied ausmachen können.

Nach dem befüllen mit mean.V_N.dif (funktioniert):

Code: Alles auswählen

> str(grp.dist)
Class 'dist'  atomic [1:7755891] 1 1.56 1.5 1.13 0.13 2.87 1.69 0 1.07 1.5 ...
  ..- attr(*, "Size")= int 3939
  ..- attr(*, "Diag")= logi FALSE
  ..- attr(*, "Upper")= logi FALSE
  ..- attr(*, "method")= chr "euclidean"
  ..- attr(*, "call")= language dist(x = wetter.grp.dif$mean.V_N.dif, method = "euclidean")
> summary(grp.dist)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00    1.00    2.21    2.72    3.96   17.50 
   
   > str(grp.clust)
List of 7
 $ merge      : int [1:3938, 1:2] -1 -56 -68 -199 -283 -289 -297 -406 -437 -443 ...
 $ height     : num [1:3938] 0 0 0 0 0 0 0 0 0 0 ...
 $ order      : int [1:3939] 148 3274 627 1955 3600 3638 156 856 3597 583 ...
 $ labels     : NULL
 $ method     : chr "average"
 $ call       : language hclust(d = grp.dist, method = "average")
 $ dist.method: chr "euclidean"
 - attr(*, "class")= chr "hclust"
> summary(grp.clust)
            Length Class  Mode     
merge       7876   -none- numeric  
height      3938   -none- numeric  
order       3939   -none- numeric  
labels         0   -none- NULL     
method         1   -none- character
call           3   -none- call     
dist.method    1   -none- character
   
Nach dem befüllen mit min.V_N.dif (funktioniert nicht):

Code: Alles auswählen

> str(grp.dist)
Class 'dist'  atomic [1:7755891] 3 1 7 1 3 7 0 3 5 1 ...
  ..- attr(*, "Size")= int 3939
  ..- attr(*, "Diag")= logi FALSE
  ..- attr(*, "Upper")= logi FALSE
  ..- attr(*, "method")= chr "euclidean"
  ..- attr(*, "call")= language dist(x = wetter.grp.dif$min.V_N.dif, method = "euclidean")
  
> summary(grp.dist)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   1.000   3.000   3.854   6.000  18.000 
  
> str(grp.clust)
List of 7
 $ merge      : int [1:3938, 1:2] -1 -67 -78 -88 -113 -182 -185 -224 -281 -369 ...
 $ height     : num [1:3938] 0 0 0 0 0 0 0 0 0 0 ...
 $ order      : int [1:3939] 3919 3911 3869 3859 3841 3815 3767 3757 3747 3743 ...
 $ labels     : NULL
 $ method     : chr "average"
 $ call       : language hclust(d = grp.dist, method = "average")
 $ dist.method: chr "euclidean"
 - attr(*, "class")= chr "hclust"
 
> summary(grp.clust)
            Length Class  Mode     
merge       7876   -none- numeric  
height      3938   -none- numeric  
order       3939   -none- numeric  
labels         0   -none- NULL     
method         1   -none- character
call           3   -none- call     
dist.method    1   -none- character
Und leider funktioniert es auch nicht mit vertauschter Reihenfolge.

Was mir nicht ganz klar ist, ist was du mit "... eventuell Zugriff auf die eine vorhandene Spalte per wetter.grp.dif$mean.V_N.dif[,1] (z.B.)" meinst.

Grundsätzlich ist vielleicht noch interessant, das alle Variablen auf die gleiche Weise erzeugt wurden. Und ich habe andere mean.-Variablen die funktionieren, aber auch min.-Variablen die nicht funktionieren.
Und während ich das schreibe fällt mir auf das Vektor vielleicht der stimmigere Begriff dafür ist?
Frautroll

Re: ggdendrogram: Wird nicht für jede Variable erstellt

Beitrag von Frautroll »

Das Problem ist mehr oder weniger gelöst.
Hab das komplette Script nochmal laufen lassen. Dabei haben wieder ein paar Grafiken gefehlt, allerdings konnte ich sie diesmal erzeugen, indem ich den entsprechenden Abschnitt nochmal laufen gelassen hab.
Warum das jetzt funktioniert hat? Keine Ahnung.

Auf jeden Fall vielen Dank für die Hilfe :)
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: ggdendrogram: Wird nicht für jede Variable erstellt

Beitrag von jogo »

Hallo Frautroll,
Frautroll hat geschrieben: Mi Jun 06, 2018 5:21 pm Was mir nicht ganz klar ist, ist was du mit "... eventuell Zugriff auf die eine vorhandene Spalte per wetter.grp.dif$mean.V_N.dif[,1] (z.B.)" meinst.
ich meinte damit folgendes:
Wie Du uns gezeigt hast, ist wetter.grp.dif$mean.V_N.dif eine Matrix mit 3939 Zeilen und einer Spalte; num [1:3939, 1]
Wenn man diese Spalte als Vektor haben möchte (ein Vektor ist ein eindimensionales Objekt), dann kann man dies durch die Konstruktion wetter.grp.dif$mean.V_N.dif[,1] erreichen. Vergleiche auch:

Code: Alles auswählen

str(wetter.grp.dif$mean.V_N.dif[,1])
Gruß, Jörg
p.s.: Es ist schön, dass das Problem mehr oder weniger gelöst ist.
Frautroll

Re: ggdendrogram: Wird nicht für jede Variable erstellt

Beitrag von Frautroll »

Danke jogo für die Erklärung :)
Hatte bisher das ",1" überlesen :oops: Ich schau mal noch ob herausfinde warum das als Matrix gespeichert ist, da ein Vektor in meinem Fall vollkommen ausreichend ist.
Antworten