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):

RelitestCoder1 <- readxl::read_excel("Daten/RelidatenCoder1.xlsx")
RelitestCoder2 <- readxl::read_excel("Daten/RelidatenCoder2.xlsx")
RelitestCoder3 <- readxl::read_excel("Daten/Klausis erster Relitest.xlsx")

# Binde die Relidatensätze der Coder:innen zu einem Datenobjekt "RelitestGesamt zusammen:
Relitest_Gesamt <- rbind(RelitestCoder1, RelitestCoder2, RelitestCoder3) 

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.

writexl::write_xlsx(Relitest_Gesamt, "Daten/Relitest_Gesamt.xlsx")

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
RelitestDaten <- readxl::read_xlsx("Daten/Relitest_bearbeitet.xlsx")

# 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 |> 
  sjmisc::frq(Worte_gr) # machen wir mal ne Häufigkeitsauszählung für "Worte_gr"
## 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 |> 
  dplyr::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)

RelitestDaten |> 
  sjmisc::frq(Voyer_r)
## 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. 

RelitestOutput <- RelitestDaten |> 
  tidycomm::test_icr(unit_var = CU, coder_var = CODER, Medium:Kurios, kripp_alpha = TRUE, lotus = TRUE, s_lotus = TRUE, na.omit = TRUE)

RelitestOutput # hier den Output des Relitest mal schnell in R angucken
## # 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"
RelitestOutput <- RelitestDaten |> 
tidycomm::test_icr(unit_var = CU, coder_var = CODER, Medium:Kurios, # 
           levels = 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) |> 
    dplyr::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


RelitestOutput |> 
  kableExtra::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"),
              background = kableExtra::spec_color(RelitestOutput$Krippendorffs_Alpha[0:100], begin = 0, end = 1, option = "turbo", direction = -1)) |> 
    kableExtra::column_spec(7, color = ifelse(RelitestOutput$Lotus > 0.6 & RelitestOutput$Lotus < 0.9, "black", "white"),
              background = kableExtra::spec_color(RelitestOutput$Lotus[0:100], begin = 0, end = 1, option = "turbo", direction = -1)) |> 
    kableExtra::column_spec(8, color = ifelse(RelitestOutput$S_Lotus > 0.6 & RelitestOutput$S_Lotus < 0.9, "black", "white"),
              background = 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
writexl::write_xlsx(RelitestOutput, "RelitestOutput.xlsx")