4 Relitest für Inhaltsanalysen (TF D)
Dazu gibt es auch ein Video:
Hier finden Sie den im Video erwähnten gezippten Ordner mit der Relitest.Rmd. Den Ordner müssen Sie entpacken und an eine gute Stelle in ihrem System tun. In dem Ordner wo sich diese Datei “Relitest.Rmd” befindet, muss es einen Unterordner mit der Bezeichnung “Daten” geben, wo die Excel-Dateien “RelidatenCoder1.xlsx” usw. liegen. s ## Relidaten Zusammenbinden
Sie werden die Inhaltsanalyse in Excel kodieren. Die Exceldateien müssen dann in R importiert werden. Das geht zB mit read_xlsx des Pakets read.xl. Wie Sie sehen werden die Exceldateien der Coder (im Beispiel 1 bis 3) jeweils in R-Dateien eingelesen (RelitestCoder1 <- …) und dann mit dem Befehl rbind (steht für Rows aneinander binden) zu einer Datei zusammengefügt, die dann angeschaut oder für Relitests weiterverarbeitet werden kann.
# Lade alle Relitestdateien aus dem Ordner "Daten" (den es geben muss mit allen Relidateien):
<- readxl::read_excel("Daten/RelidatenCoder1.xlsx")
RelitestCoder1 <- readxl::read_excel("Daten/RelidatenCoder2.xlsx")
RelitestCoder2 <- readxl::read_excel("Daten/Klausis erster Relitest.xlsx")
RelitestCoder3
# Binde die Relidatensätze der Coder:innen zu einem Datenobjekt "RelitestGesamt zusammen:
<- rbind(RelitestCoder1, RelitestCoder2, RelitestCoder3)
Relitest_Gesamt
|>
Relitest_Gesamt select(CODER, CU) |>
mutate(Fehler = ifelse(is.na(CODER) | is.na(CU), "FEHLER! Muss in der RelitestGesamt.xlsx repariert und als Relitest_bearbeitet.xlsx gespeichert werden oder der:die Coder:in muss es überarbeiten", "alles gut")) |>
count(Fehler)
## # A tibble: 2 × 2
## Fehler n
## <chr> <int>
## 1 alles gut 15
## 2 FEHLER! Muss in der RelitestGesamt.xlsx repariert und als Relitest_bear… 7
# hier schreibe ich die Daten mal aus R raus in Excel, damit ich sie in Excel besser angucken kann und dort easy bereinige. Kann so gemacht werden oder alles in R, was schicker ist, aber nicht so praktisch.
::write_xlsx(Relitest_Gesamt, "Daten/Relitest_Gesamt.xlsx") writexl
4.1 Relitest
Den Relitest selbst kann man mit test_icr des Pakets tidycomm machen. Dazu werden zunächst die Daten geladen (im Beispiel “RelitestDaten”) und dann mit der Pipe (neu statt %>% der Pipoperator |> ) der Befehl test_icr ausgeführt. An erster Stelle steht die Variable für die Coding Unit (CU), die im Datensatz RelitestBeispiele einfach “CU” heisst. Als nächstes folgt die Variable für den Coder (im Beispiel einfach “CODER”). In den Variablen CU und CODER dürfen nur Zahlen stehen! Also muss jeder Kodierer eine Nummer eingeben und auch die Artikel im Relimaterial nummeriert sein. Dann können Sie einzelne Variablennamen anfügen, für die die Reliwerte ausgewertet werden sollen oooooder Sie lassen das weg und es werden für alle Variablen Reliwerte berechnet. Wenn Sie fehlende Werte im Datensatz haben, dann sollten Sie am Ende “na.omit = TRUE” stehen haben, sonst meckert R, dass Fehlende Werte gefunden wurden.
# hier lade ich die Relidaten aus Excel wieder rein in R
<- readxl::read_xlsx("Daten/Relitest_bearbeitet.xlsx")
RelitestDaten
# Sie können mit dem folgenden Befehl Variablen umkodieren und gleich in eckigen Klammern labeln
<- RelitestDaten |>
RelitestDaten mutate(Worte_gr = sjmisc::rec(Worte, rec =
"min:100 = 1 [Kurzmeldung];
101:150 = 2 [kurzer Artikel];
151:300 = 3 [länger];
301:500 = 4 [lang];
501:max = 5 [Langtext]")) |>
relocate(Worte_gr, .after = Worte) # hier sortiere ich die neue Variable direkt hinter die alte
|>
RelitestDaten ::frq(Worte_gr) # machen wir mal ne Häufigkeitsauszählung für "Worte_gr" sjmisc
## Worte_gr <numeric>
## # total N=190 valid N=190 mean=3.61 sd=1.20
##
## Value | Label | N | Raw % | Valid % | Cum. %
## ------------------------------------------------------
## 1 | Kurzmeldung | 19 | 10.00 | 10.00 | 10.00
## 2 | kurzer Artikel | 19 | 10.00 | 10.00 | 20.00
## 3 | länger | 18 | 9.47 | 9.47 | 29.47
## 4 | lang | 96 | 50.53 | 50.53 | 80.00
## 5 | Langtext | 38 | 20.00 | 20.00 | 100.00
## <NA> | <NA> | 0 | 0.00 | <NA> | <NA>
<- RelitestDaten |>
RelitestDaten ::mutate(Voyer_r = sjmisc::rec(Voyeur, rec = "0 = 0 [kommt nicht vor]; 1:3 = 1 [kommt vor]; else = copy")) |>
dplyr::relocate(Voyer_r, .after = Voyeur)
dplyr
|>
RelitestDaten ::frq(Voyer_r) sjmisc
## Voyer_r <numeric>
## # total N=190 valid N=190 mean=0.44 sd=0.50
##
## Value | Label | N | Raw % | Valid % | Cum. %
## --------------------------------------------------------
## 0 | kommt nicht vor | 106 | 55.79 | 55.79 | 55.79
## 1 | kommt vor | 84 | 44.21 | 44.21 | 100.00
## <NA> | <NA> | 0 | 0.00 | <NA> | <NA>
# hier kommt dann der eigentliche Relitest. in test_icr muss ganz vorne der Variblenname der Kodiereinheit (CU) stehen und danach für die CODER.
<- RelitestDaten |>
RelitestOutput ::test_icr(unit_var = CU, coder_var = CODER, Medium:Kurios, kripp_alpha = TRUE, lotus = TRUE, s_lotus = TRUE, na.omit = TRUE)
tidycomm
# hier den Output des Relitest mal schnell in R angucken RelitestOutput
## # A tibble: 39 × 10
## Variable n_Units n_Cod…¹ n_Cat…² Level Agree…³ Holst…⁴ Kripp…⁵ Lotus S_Lotus
## <chr> <int> <int> <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Medium 10 19 5 nomi… 1 1 1 1 1
## 2 ThemSchw… 10 19 6 nomi… 0.5 0.9 0.8 0.9 0.9
## 3 Titel 10 19 36 nomi… 0.1 0.7 0.6 0.8 0.8
## 4 Worte 10 19 42 nomi… 0 0.4 0.3 0.6 0.6
## 5 Worte_gr 10 19 5 nomi… 0.2 0.9 0.8 0.9 0.9
## 6 ArtLang 10 19 2 nomi… 0.7 1. 0.9 1. 1.
## 7 Datum 10 19 4 nomi… 0.1 0.9 0.7 0.9 0.9
## 8 Format 10 19 4 nomi… 0.4 0.9 0.9 1. 1.
## 9 Bilder 10 19 13 nomi… 0.5 0.8 0.7 0.9 0.8
## 10 Nutzen_ig 10 19 4 nomi… 0.4 0.7 0.4 0.8 0.8
## # … with 29 more rows, and abbreviated variable names ¹n_Coders, ²n_Categories,
## # ³Agreement, ⁴Holstis_CR, ⁵Krippendorffs_Alpha
# Das ist im Prinzip das Gleiche wie oben, aber für Worte wird das Skalenniveau "interval" angegeben und für Artikellänge "ordinal"
<- RelitestDaten |>
RelitestOutput ::test_icr(unit_var = CU, coder_var = CODER, Medium:Kurios, #
tidycommlevels = c(Worte = "interval", ArtLang = "ordinal"), # hier die Skalnenniveaus; nominal ist Standard
kripp_alpha = TRUE, lotus = TRUE, s_lotus = TRUE, agreement = FALSE, holsti = FALSE, na.omit = TRUE) |>
::mutate_if(is.numeric, round, digits = 2) |> # hiermit noch auf zwei Stellen runden - reicht jas
dplyr::mutate(S_Lotus = ifelse(is.na(S_Lotus), 1, S_Lotus)) # Wenn alle Coder:innen nur eine und dieselbe Kategorie gewählt haben, ist S_Lotus nicht definiert, aber 1
dplyr
|>
RelitestOutput ::kbl() |> # und hier noch hübsch und dann bunt mit kbl
kableExtra::kable_material() |>
kableExtra::column_spec(6, color = ifelse(RelitestOutput$Krippendorffs_Alpha > 0.3 & RelitestOutput$Krippendorffs_Alpha < 0.75, "black", "white"),
kableExtrabackground = kableExtra::spec_color(RelitestOutput$Krippendorffs_Alpha[0:100], begin = 0, end = 1, option = "turbo", direction = -1)) |>
::column_spec(7, color = ifelse(RelitestOutput$Lotus > 0.6 & RelitestOutput$Lotus < 0.9, "black", "white"),
kableExtrabackground = kableExtra::spec_color(RelitestOutput$Lotus[0:100], begin = 0, end = 1, option = "turbo", direction = -1)) |>
::column_spec(8, color = ifelse(RelitestOutput$S_Lotus > 0.6 & RelitestOutput$S_Lotus < 0.9, "black", "white"),
kableExtrabackground = kableExtra::spec_color(RelitestOutput$S_Lotus[0:100], begin = 0, end = 1, option = "turbo", direction = -1))
Variable | n_Units | n_Coders | n_Categories | Level | Krippendorffs_Alpha | Lotus | S_Lotus |
---|---|---|---|---|---|---|---|
Medium | 10 | 19 | 5 | nominal | 1.00 | 1.00 | 1.00 |
ThemSchwer | 10 | 19 | 6 | nominal | 0.79 | 0.91 | 0.89 |
Titel | 10 | 19 | 36 | nominal | 0.64 | 0.79 | 0.79 |
Worte | 10 | 19 | 42 | interval | 0.72 | 0.59 | 0.58 |
Worte_gr | 10 | 19 | 5 | nominal | 0.78 | 0.92 | 0.90 |
ArtLang | 10 | 19 | 2 | ordinal | 0.92 | 0.98 | 0.96 |
Datum | 10 | 19 | 4 | nominal | 0.67 | 0.92 | 0.89 |
Format | 10 | 19 | 4 | nominal | 0.85 | 0.96 | 0.95 |
Bilder | 10 | 19 | 13 | nominal | 0.75 | 0.85 | 0.84 |
Nutzen_ig | 10 | 19 | 4 | nominal | 0.37 | 0.83 | 0.78 |
Alltagswelt | 10 | 19 | 3 | nominal | 0.05 | 0.79 | 0.69 |
Nah_Welt | 10 | 19 | 2 | nominal | 0.40 | 0.88 | 0.77 |
Nah_EU | 10 | 19 | 2 | nominal | 0.65 | 0.93 | 0.86 |
Nah_CH | 10 | 19 | 2 | nominal | 0.42 | 0.84 | 0.68 |
Nah_Kant | 10 | 19 | 2 | nominal | 0.38 | 0.88 | 0.76 |
Nah_Stadt | 10 | 19 | 2 | nominal | 0.44 | 0.86 | 0.73 |
Nah_Gem | 10 | 19 | 2 | nominal | 0.32 | 0.93 | 0.85 |
Nah_nix | 10 | 19 | 2 | nominal | 0.07 | 0.97 | 0.95 |
Naehe | 10 | 19 | 16 | nominal | 0.40 | 0.66 | 0.64 |
Voyeur | 10 | 19 | 4 | nominal | 0.30 | 0.69 | 0.59 |
Voyer_r | 10 | 19 | 2 | nominal | 0.31 | 0.78 | 0.56 |
Sex | 10 | 19 | 1 | nominal | 1.00 | 1.00 | 1.00 |
Schicksal | 10 | 19 | 2 | nominal | 0.36 | 0.83 | 0.66 |
Risiko | 10 | 19 | 4 | nominal | 0.20 | 0.59 | 0.46 |
Serviceinfos | 9 | 19 | 2 | nominal | 0.15 | 0.83 | 0.66 |
Person | 10 | 19 | 5 | nominal | 0.28 | 0.63 | 0.53 |
Promis | 10 | 19 | 4 | nominal | 0.43 | 0.73 | 0.64 |
Emo | 10 | 19 | 4 | nominal | 0.15 | 0.68 | 0.57 |
Einfluss | 10 | 19 | 4 | nominal | 0.54 | 0.81 | 0.75 |
Kontroverse | 10 | 19 | 4 | nominal | 0.40 | 0.79 | 0.72 |
Konflikt | 10 | 19 | 2 | nominal | 0.10 | 0.91 | 0.82 |
Normbruch | 10 | 19 | 4 | nominal | 0.68 | 0.87 | 0.82 |
Katastrophe | 10 | 19 | 4 | nominal | 0.39 | 0.81 | 0.74 |
Aktual | 10 | 19 | 4 | nominal | 0.07 | 0.56 | 0.42 |
Kontinuität | 10 | 19 | 2 | nominal | 0.49 | 0.82 | 0.64 |
Ueberrasch | 10 | 19 | 3 | nominal | 0.01 | 0.74 | 0.61 |
Sensation | 9 | 19 | 2 | nominal | 0.24 | 0.74 | 0.47 |
Superlative | 10 | 19 | 2 | nominal | 0.01 | 0.95 | 0.91 |
Kurios | 10 | 19 | 2 | nominal | 0.21 | 0.79 | 0.59 |
::write_xlsx(RelitestOutput, "RelitestOutput.xlsx") writexl