Kapitel 6 Graphische Darstellung von ordinalen Daten

Das wichtigste beim Rechnen mit R sind zwei Bildschirme. Und viel Kaffee (um wach zu bleiben) und Kamillentee (zum Beruhigen).
6.1 Visualisierung ordinaler Daten
Zuerst erstellen wir ein paar unterschiedliche ordinale Datentypen:
6.1.1 Likert Item Daten
Likert type items sind Fragen mit bipolaren Antwortsoptionen. Die Antwortsoptionen gehen also zum Beispiel von Stimme völlig zu bis Stimme überhaupt nicht zu, oder von Sehr zufrieden bis Sehr unzufrieden. Dies im Gegensatz zu Rating Scales die unipolar sind und zum Beispiel von Nicht zufrieden bis sehr zufrieden gehen (was nicht das Gleiche ist wie beim Likert type item sehr unzufrieden bis sehr zufrieden).
set.seed(123)
<-sample(c(
Likert_Item_mit_neutraler_Mitte_1"5_Sehr zufrieden",
"4_Etwas zufrieden",
"3_Weder zufrieden noch unzufrieden",
"2_Etwas unzufrieden",
"1_Sehr unzufrieden"), size=200, replace=TRUE, prob=c(0.1,0.2,0.25,0.15,0.1))
Tabellarisch kann man dies unterschiedlich darstellen.
Variante Paket Summarytools
::freq(Likert_Item_mit_neutraler_Mitte_1) summarytools
## Frequencies
## Likert_Item_mit_neutraler_Mitte_1
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ---------------------------------------- ------ --------- -------------- --------- --------------
## 1_Sehr unzufrieden 20 10.00 10.00 10.00 10.00
## 2_Etwas unzufrieden 40 20.00 30.00 20.00 30.00
## 3_Weder zufrieden noch unzufrieden 58 29.00 59.00 29.00 59.00
## 4_Etwas zufrieden 55 27.50 86.50 27.50 86.50
## 5_Sehr zufrieden 27 13.50 100.00 13.50 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
::freq(Likert_Item_mit_neutraler_Mitte_1, order="freq") summarytools
## Frequencies
## Likert_Item_mit_neutraler_Mitte_1
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ---------------------------------------- ------ --------- -------------- --------- --------------
## 3_Weder zufrieden noch unzufrieden 58 29.00 29.00 29.00 29.00
## 4_Etwas zufrieden 55 27.50 56.50 27.50 56.50
## 2_Etwas unzufrieden 40 20.00 76.50 20.00 76.50
## 5_Sehr zufrieden 27 13.50 90.00 13.50 90.00
## 1_Sehr unzufrieden 20 10.00 100.00 10.00 100.00
## <NA> 0 0.00 100.00
## Total 200 100.00 100.00 100.00 100.00
Variante Paket epiDisplay Diese Variante erstellt eine Graphik und eine Tabelle.
::tab1(Likert_Item_mit_neutraler_Mitte_1, sort.group = "decreasing", cum.percent = TRUE) epiDisplay

Abbildung 6.1: Likert Plot mit EpiDisplay
## Likert_Item_mit_neutraler_Mitte_1 :
## Frequency Percent Cum. percent
## 3_Weder zufrieden noch unzufrieden 58 29.0 29.0
## 4_Etwas zufrieden 55 27.5 56.5
## 2_Etwas unzufrieden 40 20.0 76.5
## 5_Sehr zufrieden 27 13.5 90.0
## 1_Sehr unzufrieden 20 10.0 100.0
## Total 200 100.0 100.0
Wir können auch mit einer zweiten Variable Kreuztabellen erstellen:
<-sample(c("5_Stimme völlig zu",
Likert_Item_mit_neutraler_Mitte_2"4_Stimme zu",
"3_Stimme weder zu noch nicht zu",
"2_Stimme nicht zu",
"1_Stimme überhaupt nicht zu"),
size=200, replace=TRUE, prob=c(0.05,0.1, 0.15, 0.3, 0.2))
<-data.frame(Likert_Item_mit_neutraler_Mitte_1,Likert_Item_mit_neutraler_Mitte_2 )
df::kable(gmodels::CrossTable(df$Likert_Item_mit_neutraler_Mitte_1, df$Likert_Item_mit_neutraler_Mitte_2, prop.t=TRUE, prop.r=TRUE, prop.c=TRUE, format="SPSS")) knitr
##
## Cell Contents
## |-------------------------|
## | Count |
## | Chi-square contribution |
## | Row Percent |
## | Column Percent |
## | Total Percent |
## |-------------------------|
##
## Total Observations in Table: 200
##
## | df$Likert_Item_mit_neutraler_Mitte_2
## df$Likert_Item_mit_neutraler_Mitte_1 | 1_Stimme überhaupt nicht zu | 2_Stimme nicht zu | 3_Stimme weder zu noch nicht zu | 4_Stimme zu | 5_Stimme völlig zu | Row Total |
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
## 1_Sehr unzufrieden | 5 | 8 | 3 | 2 | 2 | 20 |
## | 0.035 | 0.001 | 0.132 | 0.000 | 0.100 | |
## | 25.000% | 40.000% | 15.000% | 10.000% | 10.000% | 10.000% |
## | 10.870% | 9.877% | 8.108% | 10.000% | 12.500% | |
## | 2.500% | 4.000% | 1.500% | 1.000% | 1.000% | |
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
## 2_Etwas unzufrieden | 11 | 13 | 6 | 6 | 4 | 40 |
## | 0.352 | 0.632 | 0.265 | 1.000 | 0.200 | |
## | 27.500% | 32.500% | 15.000% | 15.000% | 10.000% | 20.000% |
## | 23.913% | 16.049% | 16.216% | 30.000% | 25.000% | |
## | 5.500% | 6.500% | 3.000% | 3.000% | 2.000% | |
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
## 3_Weder zufrieden noch unzufrieden | 11 | 23 | 13 | 6 | 5 | 58 |
## | 0.410 | 0.010 | 0.480 | 0.007 | 0.028 | |
## | 18.966% | 39.655% | 22.414% | 10.345% | 8.621% | 29.000% |
## | 23.913% | 28.395% | 35.135% | 30.000% | 31.250% | |
## | 5.500% | 11.500% | 6.500% | 3.000% | 2.500% | |
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
## 4_Etwas zufrieden | 11 | 24 | 10 | 5 | 5 | 55 |
## | 0.215 | 0.134 | 0.003 | 0.045 | 0.082 | |
## | 20.000% | 43.636% | 18.182% | 9.091% | 9.091% | 27.500% |
## | 23.913% | 29.630% | 27.027% | 25.000% | 31.250% | |
## | 5.500% | 12.000% | 5.000% | 2.500% | 2.500% | |
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
## 5_Sehr zufrieden | 8 | 13 | 5 | 1 | 0 | 27 |
## | 0.516 | 0.390 | 0.000 | 1.070 | 2.160 | |
## | 29.630% | 48.148% | 18.519% | 3.704% | 0.000% | 13.500% |
## | 17.391% | 16.049% | 13.514% | 5.000% | 0.000% | |
## | 4.000% | 6.500% | 2.500% | 0.500% | 0.000% | |
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
## Column Total | 46 | 81 | 37 | 20 | 16 | 200 |
## | 23.000% | 40.500% | 18.500% | 10.000% | 8.000% | |
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
##
##
<-sample(c("5_Stimme völlig zu",
Likert_Item_ohne_neutraler_Mitte_1"4_Stimme zu",
"3_Stimme weder zu noch nicht zu",
"2_Stimme nicht zu",
"1_Stimme überhaupt nicht zu"),
size=200, replace=TRUE, prob=c(0.05,0.1, 0.15, 0.3, 0.2))
<-factor(Likert_Item_mit_neutraler_Mitte_2, labels=c(
Likert_Item_mit_neutraler_Mitte_2"Stimme völlig zu",
"Stimme zu",
"Stimme weder zu noch nicht zu",
"Stimme nicht zu",
"Stimme überhaupt nicht zu"))
<-sample(c("4_Stimme völlig zu",
Likert_Item_ohne_neutraler_Mitte_1"3_Stimme zu",
"2_Stimme nicht zu",
"1_Stimme überhaupt nicht zu"),
size=200, replace=TRUE, prob=c(0.20,0.25, 0.35, 0.2))
<-factor(Likert_Item_ohne_neutraler_Mitte_1, labels=c(
Likert_Item_ohne_neutraler_Mitte_1"Stimme völlig zu",
"Stimme zu",
"Stimme nicht zu",
"Stimme überhaupt nicht zu"))
<-data.frame(Likert_Item_mit_neutraler_Mitte_1,Likert_Item_mit_neutraler_Mitte_2, Likert_Item_ohne_neutraler_Mitte_1) df_likert
Stellen wir nun die Daten der Items graphisch dar
6.1.2 Likert Plot
library(likert)
<-likert::likert(data.frame(factor(Likert_Item_mit_neutraler_Mitte_1)))
zu_plottenplot(zu_plotten,
type="bar")

Abbildung 6.2: Likert Plot
Wir können das vom Befehl likert erstellte Objekt auch mit ggplot2 weiterbearbeiten:
<-likert::likert.bar.plot(zu_plotten)
p$labels$y<-"Prozente"
p$layers[[2]]$geom_params$width = 0.3
p$layers[[3]]$geom_params$width = 0.3
p<-p+theme_classic()
p p

Abbildung 6.3: Likert Bar Plot
<-likert::likert(data.frame(Likert_Item_ohne_neutraler_Mitte_1))
zu_plottenplot(zu_plotten,
type="bar")

Abbildung 6.4: Likert Bar Plot
Wenn wir alle Likert Items in einen Datensatz speichern, können wir alle Items auch zusammen graphisch darstellen. der likert Befehl wird die Items auch automatisch anordnen.
<-rio::import("df_likert_script.RData")
df_likert_script<-likert::likert(df_likert_script)
zu_plottenplot(zu_plotten,
type="bar")

Abbildung 6.5: Likert Bar Plot.
Übrigens: Wenn wir diesen Datensatz als .csv speichern und wieder laden, wird es nicht mehr funktionieren, da nicht bei allen Items alle Antwortsoptionen benutzt wurden.
::export(df_likert_script, "df_likert_script.csv")
rio<-rio::import("df_likert_script.csv")
df_likert_script<-likert::likert(df_likert_script) zu_plotten2
## Warning in likert::likert(df_likert_script): items parameter contains
## non-factors. Will convert to factors
## Error in likert::likert(df_likert_script): All items (columns) must have the same number of levels
plot(zu_plotten2,
type="bar")
## Error in plot(zu_plotten2, type = "bar"): object 'zu_plotten2' not found
Wir sehen, dass R die Daten in Faktor-Variablen umwandelt, aber nicht alle Items im Datensatz haben die gleiche Länge. Das Objekt zu_plotten2 wird somit nicht erstellt (weil der Befehl wegen eines Fehlers abgebrochen wurde). Dieses Problem können wir relativ einfach beheben, indem wir die Levels und Labels vorgeben - so haben alle Items im Hintergrund die gleichen Antwortsoptionen, auch wenn bei einigen Items nicht alle Antwortsoptionen benutzt wurden:
<-df_likert_script %>%
df_likert_scriptmutate_all(factor, levels=c("Totally disagree", "Disagree", "No opinion", "Agree", "Totally Agree"))
<-likert::likert(df_likert_script)
zu_plotten3plot(zu_plotten3,
type="bar")

Abbildung 6.6: Likert Bar Plot.
6.1.3 Rating Skalen
Rating Scales bei denen jede Antwortsoption eine Beschreibung hat, werden auch Adjectival scales (Streiner, David L.; Norman, Geoffrey R.; Cairney, John. Health Measurement Scales: A practical guide to their development and use (p. 43). OUP Oxford. Kindle Edition) oder auch Verbal Rating Scale (VRS), respektive verbale Rating Skalen genannt.
<-sample(c("4_Äusserst hilfreich",
Rating_Skala_1"3_Sehr hilfreich",
"2_Etwas hilfreich",
"1_Nur bedingt hilfreich",
"0_Überhaupt nicht hilfreich"),
size=200, replace=TRUE, prob=c(0.025,0.1, 0.35, 0.275,0.25))
<-as.factor(Rating_Skala_1)
Rating_Skala_1
<-sample(c("nie",
Rating_Skalen_Haeufigkeiten"kaum",
"selten",
"gering",
"mässig",
"mittel",
"deutlich",
"überwiegend",
"oft",
"grösstenteils",
"immer"),
size=200, replace=TRUE, prob=c(0.025,0.05, 0.025, 0.175,0.25, 0.175,0.1,0.1, 0.025, 0.05,0.025))
<-factor(Rating_Skalen_Haeufigkeiten, labels=c(
Rating_Skalen_Haeufigkeiten"nie",
"kaum",
"selten",
"gering",
"mässig",
"mittel",
"deutlich",
"überwiegend",
"oft",
"grösstenteils",
"immer"))
<-sample(c("unmöglich",
Rating_Skalen_Wahrscheinlichkeiten"höchst unwahrscheinlich",
"unwahrscheinlich",
"eher unwahrscheinlich",
"eventuell",
"vielleicht",
"möglich",
"eher wahrscheinlich",
"wahrscheinlich",
"höchst wahrscheinlich",
"sicher"),
size=200, replace=TRUE, prob=c(0.025,0.05, 0.025, 0.25,0.175, 0.175,0.1,0.1, 0.025, 0.05,0.025))
<-factor(Rating_Skalen_Wahrscheinlichkeiten, labels=c(
Rating_Skalen_Wahrscheinlichkeiten"unmöglich",
"höchst unwahrscheinlich",
"unwahrscheinlich",
"eher unwahrscheinlich",
"eventuell",
"vielleicht",
"möglich",
"eher wahrscheinlich",
"wahrscheinlich",
"höchst wahrscheinlich",
"sicher"))
<-sample(c("No chance, almost no chance",
Rating_Scale_Probabilities"Very slight possibility",
"Slight possibility",
"Some possibility",
"Fair possibility",
"Fairly good possibility",
"Good possibility",
"Probable",
"Very probably",
"Almost sure",
"Certain, practically certain"),
size=200, replace=TRUE, prob=c(0.025,0.05, 0.025, 0.25,0.175, 0.175,0.1,0.1, 0.025, 0.05,0.025))
# https://journals.sagepub.com/doi/abs/10.1177/147078539303500405?journalCode=mreb
<-factor(Rating_Scale_Probabilities, labels=c(
Rating_Scale_Probabilities"No chance, almost no chance",
"Very slight possibility",
"Slight possibility",
"Some possibility",
"Fair possibility",
"Fairly good possibility",
"Good possibility",
"Probable",
"Very probably",
"Almost sure",
"Certain, practically certain"))
<-sample(c("Überhaupt nicht", "An einzelnen Tagen", "An mehr als der Hälfte der Tage", "Beinahe jeden Tag"),
Rating_Skalen_phq9_1size=200, replace=TRUE, prob=c(0.1,0.35,0.4, 0.15))
<-factor(Rating_Skalen_phq9_1, labels=c(
Rating_Skalen_phq9_1"Überhaupt nicht", "An einzelnen Tagen", "An mehr als der Hälfte der Tage", "Beinahe jeden Tag"))
<-sample(c(
Rating_Skale_Schmerzintensität_6"Momentan habe ich keine Schmerzen. (0)",
"Ich habe im Moment sehr geringe Schmerzen. (1)",
"Ich habe im Moment mässige Schmerzen. (2)",
"Ich habe im Moment ziemlich starke Schmerzen. (3)",
"Ich habe im Moment sehr starke Schmerzen. (4)",
"Ich habe im Moment die stärksten Schmerzen, die ich mir vorstellen kann. (5)"),
size=200, replace=TRUE, prob=c(0.1,0.2,0.20,0.225,0.125,0.15))
<-factor(Rating_Skale_Schmerzintensität_6, labels=c(
Rating_Skale_Schmerzintensität_6"Momentan habe ich keine Schmerzen. (0)",
"Ich habe im Moment sehr geringe Schmerzen. (1)",
"Ich habe im Moment mässige Schmerzen. (2)",
"Ich habe im Moment ziemlich starke Schmerzen. (3)",
"Ich habe im Moment sehr starke Schmerzen. (4)",
"Ich habe im Moment die stärksten Schmerzen, die ich mir vorstellen kann. (5)"))
Beispiel englische Skala für Wahrscheinlichkeiten, auch Juster scale genannt. Beispiel aus: Streiner, David L.; Norman, Geoffrey R.; Cairney, John. Health Measurement Scales: A practical guide to their development and use (p. 43). OUP Oxford. Kindle Edition.
Beispiel Schmerzintensität 6 Optionen Neck Disability Index
6.1.4 Graphische Darstellung der Rating Skalen
Zuerst erstellen wir eine Graphik, von der eigentlich immer abgeraten wird: die Kuchengraphik (Pie-Chart, auf Deutsch oft auch Kreisdiagramm genannt).Warum wird von der Kuchengraphik abgeraten? Weil wir nicht gut sind, Flächen zu vergleichen. Wir können besser Distanzen vergleichen. Deswegen ist eine Balkengraphik oder noch besser eine Lollipop Graphik besser.
Wenn wir mit ggplot2 arbeiten, ist es oft hilfreich, die Daten zuerst in einem neuen Dataframe zusammenzufassen. Wir tun dies relativ einfach mit den group_by und summarise Befehlen aus dem dplyr Paket
library(dplyr)
= as.data.frame(Rating_Skala_1)
wieHilfreich <-wieHilfreich %>%
summary_wieHilfreichgroup_by(Rating_Skala_1) %>%
::summarise(absoluteFreq=n()) %>%
dplyrmutate(relativeFreq = round(absoluteFreq / sum(absoluteFreq)*100))
$label = paste(summary_wieHilfreich$Rating_Skala_1,": ", summary_wieHilfreich$absoluteFreq," (", summary_wieHilfreich$relativeFreq,"%)", sep = "")
summary_wieHilfreichpie(summary_wieHilfreich$absoluteFreq, labels = summary_wieHilfreich$label, col = colors()[340+summary_wieHilfreich$absoluteFreq])

Abbildung 6.7: Balkengraphik
pie(summary_wieHilfreich$absoluteFreq, labels = summary_wieHilfreich$label, col = rainbow(nrow(summary_wieHilfreich)))

Abbildung 6.8: Balkengraphik
Wer mehr über Alternativen für Kreisdiagramme lesen möchte findet hier ein gutes Tutorial.
Hier ein Video, das uns mehr über Pie-Charts lehrt:
Die nächste Variante wäre die Balkengraphik (der Barplot)
Wir erstellen zuerst noch eine Variable mit dem Text für die Beschriftung der Balken. Hier wollen wir die absolute Häufigkeiten (die Anzahl Nennungen) und die relative Häufigkeiten (Proportionen oder Prozente) anzeigen. wir benutzen dazu den paste Befehl.
$label_kurz = paste(summary_wieHilfreich$absoluteFreq," (", summary_wieHilfreich$relativeFreq,"%)", sep = "")
summary_wieHilfreich
ggplot(summary_wieHilfreich, aes(x=Rating_Skala_1, y=absoluteFreq,))+
geom_col()+
geom_text(aes(label = label_kurz), vjust = -0.5)+
theme_classic()

Abbildung 6.9: Balkengraphik
Jetzt sollten wir noch die Reihenfolge der Balken ändern (und wir können auch noch die Beschriftungen der Achsen ändern):
%>%
summary_wieHilfreich mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,))+
geom_col(width=0.5)+
geom_text(aes(label = label_kurz), vjust = -0.5)+
theme_classic()+
scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+
labs(y="Prozente", x="Item Rating Skala 1")+
theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 5, l = 0)))+
theme(axis.title.y = element_text(margin = margin(t = 0, r = 0, b = 0, l = 5)))

Abbildung 6.10: Balkengraphik
Noch besser ist die Graphik, wenn wir sie umdrehen. So sind die Labels der Balken besser zu lesen.
%>%
summary_wieHilfreich mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,))+
geom_col(width=0.5)+
geom_text(aes(label = label_kurz), hjust = -0.1)+
theme_classic()+
scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+
labs(y="Absolute Häufigkeit", x="Item Rating Skala 1")+
theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
coord_flip()

Abbildung 6.11: Balkengraphik
Oder wir geben einen Titel und lassen dafür die Beschriftung der horizontalen Achse weg. Natürlich können wir auch noch die Farben ändern.
%>%
summary_wieHilfreich mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,fill=absoluteFreq))+
geom_col(width=0.5)+
geom_text(aes(label = label_kurz), hjust = -0.1)+
theme_classic()+
scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
theme(legend.position="none")+
coord_flip()

Abbildung 6.12: Balkengraphik
6.1.5 Lollipop als alternative zum Balkendiagramm
Das Verhältnis Tinte zu Inhalt sollte möglichst klein sein (d.h. mehr Inhalt als Tinte). Balkendiagramme brauchen relativ viel Tinte, deshalt wird oft die Lollipop oder die Dot-Graphik empfohlen.
Lollipop Graphik:
%>%
summary_wieHilfreich mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,colour=absoluteFreq))+
geom_point(size=5) +
geom_segment(aes(x=Rating_Skala_1,
xend=Rating_Skala_1,
y=0,
yend=absoluteFreq), size=1.8) +
geom_text(aes(label = label_kurz), hjust = -0.3)+
theme_classic()+
scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
theme(legend.position="none")+
coord_flip()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.

Abbildung 6.13: Lollipop Graphik
Dot Plot:
%>%
summary_wieHilfreich mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,colour=absoluteFreq))+
geom_point(size=5) +
geom_segment(aes(x=Rating_Skala_1,
xend=Rating_Skala_1,
y=min(absoluteFreq),
yend=max(absoluteFreq)),
linetype="dashed",
size=0.7) +
geom_text(aes(label = label_kurz), vjust=-0.6,hjust = -0.2)+
theme_classic()+
scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
theme(legend.position="none")+
coord_flip()

Abbildung 6.14: Dot Plot
Die Antwortskategorien können auch in einem Balken gestapelst (stacked) werden.
Wir können dies entweder mit den Rohdaten tun, oder mit den zusammengefassten daten. Hier zuerst mit den Rohdaten:
<-ggplot(wieHilfreich, aes(x='', fill=Rating_Skala_1))+
pgeom_bar(position="fill")+
labs(x="Rating Skala 1", y="Relative Häufigkeiten")+
scale_fill_discrete(name = "Antwortsoptionen")
p

Abbildung 6.15: Gestapelte Balkengraphik
Mit Beschriftung der Häufigkeiten:
<-p+ stat_count(geom = "text",
paes(label = stat(count)),
position="fill", colour="#696969",vjust=0.5)
p
## Warning: `stat(count)` was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.

Abbildung 6.16: Gestapelte Balkengraphik
Hier mit den zusammgengefassten Daten
$label_kurz_2Zeilen = paste(summary_wieHilfreich$absoluteFreq,"\n", " (", summary_wieHilfreich$relativeFreq,"%)", sep = "")
summary_wieHilfreich
%>%
summary_wieHilfreich mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x='',y=relativeFreq, fill=Rating_Skala_1))+
geom_col(stat='identity')+
coord_flip()+
labs(x="Rating Skala 1", y="Relative Häufigkeiten")+
scale_fill_discrete(name = "Antwortsoptionen")+
geom_text(aes(label = label_kurz_2Zeilen),
position = position_stack(vjust = .5))+
theme_classic()+
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
coord_flip()
## Warning in geom_col(stat = "identity"): Ignoring unknown parameters: `stat`
## Coordinate system already present. Adding new coordinate system, which will
## replace the existing one.

Abbildung 6.17: Gestapelte Balkengraphik
Jetzt müssen wir noch die Beschriftung besser anordnen. Dies können wir tun, indem wir anstatt geom_text geom_text_repel vom Paket ggrepel benutzen.
library(ggrepel)
%>%
summary_wieHilfreich mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x='',y=relativeFreq, fill=Rating_Skala_1))+
geom_col(stat='identity')+
labs(x="Rating Skala 1", y="Relative Häufigkeiten")+
scale_fill_discrete(name = "Antwortsoptionen")+
geom_text_repel(aes(label = label_kurz_2Zeilen),
position = position_stack(vjust = 0.5))+
theme_classic()+
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
coord_flip()
## Warning in geom_col(stat = "identity"): Ignoring unknown parameters: `stat`

Abbildung 6.18: Gestapelte Balkengraphik
ggrepel positioniert hier die Zahlen etwas komisch. Ich fand jedoch dafür noch keine Lösung.
6.1.6 Rating Skalen bei denen nicht mehr jede Kategorie beschrieben ist
<-sample(c(
Rating_Skala_Anker_Mitte_FABQ"vollständig nichteinverstanden (0)",
"1",
"2",
"Ich weiss nicht (3)",
"4",
"5",
"vollständig einverstanden (6)"),
size=200, replace=TRUE, prob=c(0.1,0.2,0.10,0.125,0.125,0.2, 0.15))
6.1.7 Numeric Rating Scales
Bei den Numeric Rating Scales werden nur noch die Anker beschrieben. Diese Item-Typen werden oft schon wie intervallskalierte Daten analysiert.
<-rnorm(100, 5,2.2)
Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10<-ifelse(Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10<0,0,Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10)
Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10<-ifelse(Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10>10,10,Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10) Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10
Für mehr Beispiele zur Erfassung der Schmerzintensität, siehe diesen Artikel hier (klicken Sie hier).
6.1.8 Gruppieren, wenn eine Kategorie nicht benutzt wird
Stellen wir uns vor, wir hätten eine Variable mit vier Antwortskategorien. Eine Kategorie hat jedoch die Häufigkeit 0. Wenn wir nun nach dieser Variable gruppieren, wir die Kategorie mit der Häufigkeit 0 nicht benutzt und daher erscheint diese Kategorie nicht auf der Graphik.
Für dieses Beispiel benutzen wir die Clinical Frailty Scale, Sie finden einen Artikel dazu.
set.seed(12345)
<-sample(1:5,size=100, replace=TRUE, prob=c(0.8, 0.1, 0.05, 0.05, 0))
Clinical_Frailty_Scale <-sample(1:5, size=100, replace=TRUE, prob=c(0.8, 0.1, 0.05, 0.03, 0.02))
Anzahl_Stürze<-data.frame(Clinical_Frailty_Scale,Anzahl_Stürze ) %>%
datamutate(Clinical_Frailty_Scale=factor(Clinical_Frailty_Scale, levels=1:5, labels=c("Sehr fit", "Durschnittlich aktiv", "Gut zurechtkommend", "Vulnerabel", "Geringgradig frail")))
<-data %>%
summary_fallsgroup_by(Clinical_Frailty_Scale) %>%
summarise(n=n()) %>%
mutate(Prozente=n / sum(n))
ggplot(summary_falls, aes(x=Clinical_Frailty_Scale, y=n))+
geom_col(stat="identity", fill="#E187F0")+
theme_classic()+
coord_flip()
## Warning in geom_col(stat = "identity", fill = "#E187F0"): Ignoring unknown
## parameters: `stat`

Abbildung 6.19: Balkengraphik
Wenn wir die Kategorien mit der Antwortsfrequenz Null in der Graphik (d.h. auf der Achsenbeschreibung) behalten möchten, können wir beim group_by Befehl die Option .drop=FALSE anfügen.
Hier unten sehen wir nun, dass die fünfte Kategorie auf der Achse auch angegeben ist.
<-data %>%
summary_fallsgroup_by(Clinical_Frailty_Scale, .drop=FALSE) %>%
summarise(n=n()) %>%
mutate(Prozente=n / sum(n))
ggplot(summary_falls, aes(x=Clinical_Frailty_Scale, y=n))+
geom_col(stat="identity", fill="#E187F0")+
theme_classic()+
coord_flip()
## Warning in geom_col(stat = "identity", fill = "#E187F0"): Ignoring unknown
## parameters: `stat`

Abbildung 6.20: Balkengraphik
6.2 Mosaik-Plot
library(ggplot2)
library(ggmosaic)
<-data %>%
data2mutate(Anzahl_Stürze=round((1+as.numeric(Clinical_Frailty_Scale)/2)*Anzahl_Stürze)) %>%
mutate_all(., factor)
ggplot(data = data2) +
geom_mosaic(aes(x = product(Anzahl_Stürze, Clinical_Frailty_Scale), fill=Clinical_Frailty_Scale))
## Warning: `unite_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `unite()` instead.
## ℹ The deprecated feature was likely used in the ggmosaic package.
## Please report the issue at <]8;;https://github.com/haleyjeppson/ggmosaichttps://github.com/haleyjeppson/ggmosaic]8;;>.

Abbildung 6.21: Mosaikgraphik

Ende des Kapitels