# Datenaufbereitung

In dem Ordner, in dem diese Datei liegt, muss auch eine "_common.R" liegen, damit das Ganze funktioniert. Die haben Sie aber sicher schon und da auch angepasst. Darum nehmen Sie am besten die oder fragen Sie andernfalls im Forum nochmal nach. 

```{r}
#| include: false
#| echo: false
#| warning: false

source('_common.R')
```

Erstmal ein paar Daten laden. Damit das funktioniert, muss in einem Ordner mit der Bezeichnung "data" im aktuellen Verzeichnis die DATEN_BEF.RDS liegen. Sie können Ihre Datensätze oder die Bezeichnung hier in den R-Codes ändern. Wenn Sie den Dateinamen Ihrer Datei umbenennen, ist die Chance grösser, dass auch der Code weiter hinten ganz gut funktioniert. 

```{r}
#| label: Daten laden
#| echo: true

# Es werden Daten geladen, die im Unterordner "data" liegen. RDS-ist ein gutes R-Daten-Format
DATEN_BF <- readRDS("data/DATEN_BEF.RDS")
saveRDS(DATEN_BF, file = "data/DATEN_BEF.RDS") # speichern immer nach Laden, weil sonst schnell Fehler entstehen

DATEN_IA <- readRDS("data/IAuBEF.RDS") 
saveRDS(DATEN_IA, file = "data/IAuBEF.RDS")
```

## Leere Fälle löschen (TF E)

Hier gehe ich davon aus, dass ein Interview erfolgreich beendet wurde, wenn der:die Interviewer:in am Ende etwas zum Verständnis des Interviews eingegeben hat. 

```{r}
#| label: Leere_raus
#| echo: true

# Nehmen Sie eine Variable, die eigentlich für jede befragte Person erfasst sein sollte, wie die BEGRUESS, wo eigentlich nur abgehakt wird, dass das Interview geführt werden kann
DATEN_BF <- DATEN_BF |> 
  filter(!is.na(BEGRUESS))

## Hier löschen wir ein paar Variablen, die nur technisch sind und nicht gebraucht werden. 
DATEN_BF <- DATEN_BF |> 
  select(-any_of(c('SERIAL', 'REF', 'QUESTNNR', 'MODE'))) # -any_of() sorgt dafür, dass er keinen Fehler produziert, wenn die Dateien schon gelöscht sind.
```

## Variablen umbenennen und löschen

Wenn Sie den einfachen Befehl "select" nehmen, dann werden die Variablen behalten, die Sie aufführen. Wenn Sie ein Minus davor schreiben, werden die Variablen gelöscht, die Sie aufführen. Häufig führt das später zu Fehlermeldungen, weil bei mehrfacher Ausführung gelöschte Variablen natürlich nicht mehr im Datensatz gefunden werden. Um diesen Fehlermeldungen aus dem Weg zu gehen, können Sie "any_of" verwenden. Dann prüft R, ob eine der aufgeführten Variablen im Datensatz sind und löscht diese. Wenn die Variablen nicht im Datensatz sind, dann macht R nichts weiter (meldet auch keinen Fehler und stoppt Ihren Durchlauf nicht.). Seien Sie damit also mir Vorsicht. Beim Befehl "rename" können Sie das auch machen. Mit "any_of" werden nur die Variablen umbenannt, die auch wirklich da sind. Manchmal kommt das bei jedem Durchlauf vor, weil zB bei join-Befehlen immer nochmal ein Datensatz gematcht wird und wie im Beispiel vorhandene Variablen wie "Nenn1" umbenannt werden in "Nenn1.x" und Nenn1.y" Wenn Sie jetzt die mit ".y" löschen und die mit ".x" umbenennen, dann haben Sie das Problem auch glöst, wenn Ihnen nicht ganz klar ist, warum die immerwieder auftauchen. Für's Erste ist das also auch eine Lösung eines Problems. ;-)

```{r}
#| label: Variablenhandling
#| eval: true
#| echo: true

# Manchmal macht es Sinn, von einer Variable eine Kopie mit besser lesbarem Namen anzulegen, wie hier:

DATEN_BF <- DATEN_BF |> 
  mutate(Alter = ALTER, 
        Geschlecht = GESCHL)

## verschiebe (relocat) die Variable GESCHL hinter die SD02. 
DATEN_BF <- DATEN_BF |> 
  relocate(Geschlecht, .after = GESCHL)

# So können Sie Variablen löschen. Durch das -any_of gibt es keine Fehler, wenn R die Variablen nicht findet
DATEN_BF <- DATEN_BF |> 
  select(-any_of(c("Nenn1.y", "Nenn2.y", "Nann3.y")))

# So nenne Sie Variablen um, wenn es sie gibt (vorne die neue Bezeichnung).
DATEN_BF <- DATEN_BF |> 
  rename(any_of(c("Nenn1" = "Nenn1.x", "Nenn2" = "Nenn2.x", "Nenn3" = "Nenn3.x"))) 
```


## Label für Variablen und Ausprägungen (teils TF E)

Wenn Sie messen, dann stehen am Ende Zahlen für das was Sie gemessen, also zB erfragt haben. Zum Beispiel steht dann eine 1 für "trifft nicht zu" und 5 für "trifft vollkommen zu". In Ihren Auswertungen müssen Sie aber wieder die verbalen Entsprechungen nutze, statt nur Tabellen oder Grafiken zu haben, wo nur Zahlen ausgewiesen werden (Sie können das noch verbinden, aber Ihre Leser:innen nicht). In anderen Programmen (wie SPSS) ist es daher üblich, dass die gemessenen Zahlen mit verbalen Labeln versehen werden. In Base-R geht das nicht so toll. Da müssen Sie mit "factors" arbeiten, wo also statt der Zahlen die verbalen Entsprechungen verwendet werden. Mühsam an den Faktoren ist, dass man mit ihnen wieder nicht mehr rechnen kann, also z.B. weder einen Mittelwert ausgeben noch eine Korrelation. Da hilft das Paket sjmisc weiter. Mit dem können Sie den Zahlenwerten Ihrer Variablen ihre Merkmalsausprägungen als Label zuordnen. Das geht mit set_label(labels = c("tzrifft nicht zu" = 1, "trifft voll zu" = 5)):

```{r}
#| label: Labelei
#| echo: true

# So können Label vergeben werden

DATEN_BF |> sjmisc::frq(GESCHL)

# Hier wird das Variablenlabel vergeben

DATEN_BF <- DATEN_BF |> 
  sjlabelled::var_labels(GESCHL = "Geschlecht") 

# Hier werden für die einzelnen Ausprägungen die Label vergeben
DATEN_BF <- DATEN_BF |> 
  sjlabelled::set_labels(GESCHL, labels = c("mänlich" = 1, "weiblich" = 2, "divers" = 3, "k.A." = NA))

# Mit dem Befehl für Häufigkeitstabellen (frq für frequencies) kann die Labelei schnell angesehen werden:

DATEN_BF |> 
  sjmisc::frq(GESCHL)

## Hier werden für einige Variablen Label vergeben, die zusammengehören und später als Auswertung für Mehrfrachantworten verarbeitet werden

# Ersteinmal die Variablen angucken. Die Variablen gehen von NACHRICHT_TITEL1 in einer Reihe bis M112_23 (wurde nicht umbenannt in SosciSurvey)
DATEN_BF |> 
  select(NACHRICHT_TITEL1:M112_23) |> # Nur die interessierenden Variablen selektieren
  ufs::multiResponse() |> # Mehrfachantworten ansehen
  arrange(desc(Frequency)) |> # Sortieren nach Häufigkeit
  kableExtra::kable() |> # besser lesbare Tabelle daraus machen
  kableExtra::kable_styling() # Styling


# Mit set_variable_labels werden hier die Variablenlabel vergeben
DATEN_BF <- DATEN_BF |>
  sjlabelled::var_labels(NACHRICHT_TITEL1 = "NZZ", 
                      NACHRICHT_TITEL2 = "TA", 
                      NACHRICHT_TITEL3 = "20 Minuten",
                      NACHRICHT_TITEL4 = "Blick", 
                      NACHRICHT_TITEL5 = "Watson",
                      NACHRICHT_TITEL6 = "SRF News", 
                      M112_20 = "Social Media",
                      M112_21 = "Google News",
                      M112_23 = "anderes"
                      )

# Hier mal für den Nachrichtenfaktor "Kontroverse" aus der Inhaltsanalyse

DATEN_IA <- DATEN_IA |> 
 sjlabelled::var_labels(KNTR = "Kontroverse") |> 
 sjlabelled::set_labels(KNTR, labels = c("keine" = 0, "gering" = 1, "stark" = 2, "k.A." = NA))
```

## Befragungstag aus dem Datum

Mit diesem Befehl kann der Befragungstag aus der Datumsvariable erzeugt werden, die von SosciSurvey automatisch erzeugt wird. Wenn Sie den Tag schon als solchen haben, brauchen Sie das natürlich nicht. 

```{r}
#| label: Befragungstag aus Datum
#| eval: true
#| echo: true

DATEN_BF <- DATEN_BF |> 
  mutate(Befrag_Tag = day(STARTED)) |> # mit day wird aus der Datumsvariable der Tag rausgezogen
  relocate(Befrag_Tag, .after = STARTED) # Hiermit wird die Variable für den Befragungsstart an den Anfang gepackt

DATEN_BF |> sjmisc::frq(Befrag_Tag)
```

## Umkodieren

### Werte wechseln

Umkodieren bedeutet, dass Ausprägungen (also Werte) in einer Variablen verändert werden oder zu anderen Werten in einer neuen Variable werden. Typische Umkodierungen sind Veränderungen der Codes (also zB wenn man eine Skala umdrehen möchte von 1 bis 5 auf 5 bis 1) und Zusammenfassungen von Codes, also zB 1 und 2 werden neu in 1 zusammengefasst 3 wird die neue 2 und 4 sowie 5 werden als neue 3 kodiert. Dann hat man jeweils zwei Abstufungen in den Ausprägungen zu jeweils einer zusammengefasst. 

```{r}
#| label: Variable umkodieren
#| echo: TRUE

DATEN_BF <- DATEN_BF  |> 
 mutate(Bildung = BILDUNG) 

## Hier machen wir aus den beiden tieferen Bildungsgruppen eine einzelne Gruppe. In den Klammern kann man die Value Label gleich mit vergeben:

DATEN_BF  |> 
 sjmisc::frq(Bildung) # erstmal angucken

# Erstelle mit mutate eine neue Variable Bildung_gr, die eine rekodierte Bildung (zB 1 und 2 werden)
DATEN_BF <- DATEN_BF |> 
 mutate(Bildung_gr = sjmisc::rec(Bildung, rec = "1:2 = 1; 3 = 2; 4 = 3; 5 = 4"))  # die offenen müssen noch kodiert werden

DATEN_BF <- DATEN_BF |> 
  sjlabelled::set_labels(Bildung_gr, labels = c("tief" = 1, "mittel" = 2, "hoch" = 3, "noch kodieren" = 4), force.labels = TRUE) |> 
  sjlabelled::var_labels(Bildung_gr = "Bildung (gruppiert)")  # hier das Variablenlabel

DATEN_BF |> 
    sjmisc::frq(Bildung_gr)
```

### Mehrere auf einmal umkodieren 

Das geht super mit `across`! Der Befehl macht zwar alle ein bisschen komplizierter, aber er spart sehr viele Zeilen Code. Das bringt vor allem viel, wenn Sie dann doch mal etwas ändern wollen und dann nicht 23 Zeilen für 23 Variablen neu machen müssen, sondern nur eine. Das Grundschema ist immer `across(Variablenliste, ~ funktion(.x))`, wobei die Tilde (~) immer andeuten, dass gleich eine Funktion kommt, und das .x immer da steht, wo man im einfacheren Fall die eine Variable reingeschrieben hätte. Die Variablenliste können tatsächlich Listen von Variablen sein mit einem Doppelpunkte dazwischen wie zB `V1:V7`, wobei dann derselbe Befehl für alle Variablen von V1 bis V7 in der Reihenfolge des Datensatzes ausgeführt wird. Im Folgenden ist das für die Funktion `~ sjmisc::rec(.x)` angewendet worden. Schauen Sie doch mal, wie schön das ist! 😃
 
```{r}
#| label: Mehrere umkodieren
#| echo: true

DATEN_BF |> 
  sjmisc::frq(HAUFIGKEIT_01:HAUFIGKEIT_05)

# mutiere über (across) die ganze Liste der Variablen von:bis, als Funktion (~) rec(.x) wobei .x für die Variablen der Liste steht
DATEN_BF <- DATEN_BF |> 
  mutate(across(HAUFIGKEIT_01:HAUFIGKEIT_05, 
                ~ sjmisc::rec(.x, rec = "1 = -2 [viel zu wenig]; 2 = -1 [zu wenig]; 3 = 0 [richtig]; 4 = 1  [zu viel]; 5 = 2 [viel zu viel]; else = NA"), 
                       .names = "{.col}_um0")) |> # HIer werden an die Variablennamen Suffixe "_um0" angehängt
  sjlabelled::var_labels(HAUFIGKEIT_01_um0 = "Corona", # Hier noch Label für die Variablen
             HAUFIGKEIT_02_um0 = "Abstimmungen", 
             HAUFIGKEIT_03_um0 = "Finanz", 
             HAUFIGKEIT_04_um0 = "Klima", 
             HAUFIGKEIT_05_um0 = "Geflüchtete")

DATEN_BF |> 
  sjmisc::frq(HAUFIGKEIT_01_um0:HAUFIGKEIT_05_um0)
```

### NA durch 0 ersetzen

Die Grundstruktur von `across`-Befehlen ist an erster Stelle, zum Beispiel in `mutate` der Aufruf `across` gefolgt von der Liste der Variablen, für die dieselbe Mutationsfunktion durchgeführt werden soll. Im folgenden Beispiel ist es `across(Nenn1:Nenn5)`. Dann folgt die Funktion, was durch `~`angezeigt beziehungsweise gemacht wird. Immer da, wo man die Variablen einsetzen würde (also zB, wenn man die Funktion nur für Nenn1 schreiben würde, wo man die Nenn1 hinsetzt), wird `.x` geschrieben. Also wie oben, aber eine andere Funktion, nämlich `if_else()`, die so augebaut ist, dass in der Klammer als erstes die Bedingung kommt (im Fall `is.na(.x)`, was so viel bedeutet wie: is die Variable im Fall na?). Nach dem darauffolgenden Komma kommt das, was R tun soll, wenn die Bedingung mit "wahr" (true) beantwortet werden kann (im Beispiel steht noch == TRUE, was eigentlich nicht nötig wäre, weil `is.na()` sowieso schon einen logischen Wert zurückgibt, also FALSE oder TRUE). Stimmt im Beispiel also bei einem Fall die Bedingung, dass in einer den Variablen `Nenn1:Nenn5` ein "NA" steh, dann wird dafür jeweils eine 0 in die Daten geschrieben und sonst das .x, also die sonstigen gültigen Werte der Variablen. 

```{r}
#| label: NAist0
#| eval: true
#| echo: true

DATEN_IA <- DATEN_IA |> 
  mutate(across(Nenn1:Nenn5, ~if_else(is.na(.x) == TRUE, 0, .x)))
```


### Ausprägungen zusammenfassen 

Mit dem sehr stark kombinierbaren Befehl `case_when` können Sie eine neue Variable erstellen (zB `ALTER_GR`) in der Klammer von `case_when()` die Bedingungen folgen (zB ALTER < 0) und dann das Funktionszeichen `~`und dann der Wert, der an der Stelle, wo die Bedingung stimmt, hingeschrieben werden soll, also zum Beispiel die 1, wenn `ALTER <= 25, dann (~) 1. 

```{r}
#| label: Zusammenfassen
#| eval: true
#| echo: true

# Das Alter in Gruppen zusammenfassen
DATEN_BF <- DATEN_BF |> 
  mutate(ALTER_gr = case_when(
    ALTER < 0 ~ NA_real_,
    ALTER <= 25 ~ 1,
    ALTER <= 45 ~ 2,
    ALTER <= 65 ~ 3,
    ALTER <= 85 ~ 4,
    ALTER > 85 ~ 5
  ))  |> 
  sjlabelled::set_labels(ALTER_gr, labels = c("bis 25"  = 1, "26-45" = 2, "46-65" = 3, "66-85" = 4, "85+" = 5)) |> 
  sjlabelled::var_labels(ALTER_gr = "Alter gruppiert")

DATEN_BF |> sjmisc::frq(ALTER_gr)

# Hier werden für die Inhaltsanalyse die Anzahl Worte (Term Count) in Gruppen zusammengefasst. Das geschieht mit dem Paket `sjmisc`, was den Vorteil hat, dass man bei jeder Ausprägung auch gleich noch das Label dazuschreiben kann.

DATEN_IA <- DATEN_IA |> 
  mutate(WORTE_gr = sjmisc::rec(TC, 
                        rec = "0: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 = TC) 


### Rekodierung der Anzahl Nennungen in wenige Gruppen
DATEN_IA <- DATEN_IA |> 
  mutate(Nenn_Gr = sjmisc::rec(Nenn_Gesamt, rec = "1:3 = 1; 4:16 = 2; 17:100 = 3")) |> 
  sjlabelled::set_labels(Nenn_Gr, labels = (c("selten" = 1, "mittel" = 2, "häufig" = 3)))

```

### Medium umkodieren

Mit den folgenden Befehlen könnten Sie eine Mediumsvariable in eine neue Variable umkodieren, die zwischen "Qualitätszeitungen" und "Boulevardzeitungen" unterscheidet (auch wenn ich die Unterscheidung immer ein bisschen bildungsbürgerlich ideologisch finde -- egal, is ja erstmal nur ein Beispiel).

```{r}
#| label: Medium-umkodieren
#| echo: true

# 1	SRF
# 2	20min
# 3	Watson
# 4	NZZ
# 5	Tagesanzeiger
# 6	Blick

DATEN_IA <- DATEN_IA |> 
  mutate(Medium_Q = sjmisc::rec(MEDIUM, 
                    rec = "1,4,5 = 1 [Qualität]; 2,3,6 = 2 [Boulevard]")) 

DATEN_IA |> sjmisc::frq(Medium_Q)
```

### Bedingt umkodieren

Bedingt umkodieren heisst, dass Sie nur bestimmte Fälle umkodieren und andere so lassen, wie sie sind. Die Fälle suchen Sie mit der Bedingung des bedingten Umkodierens aus.

```{r}
#| label: "bedingt umkodieren"
#| echo: true

DATEN_BF |> 
  sjmisc::frq(ALTER, Bildung_gr)

DATEN_BF <- DATEN_BF |> 
  mutate(Alt_Bild1 = if_else(ALTER < 35 & Bildung_gr == 3, 1, 2)) 

DATEN_BF |>  sjmisc::frq(Alt_Bild1)

# Hier erstmal umkodieren und anschauen

DATEN_BF |> 
  mutate(Alt_Bild2 = case_when(
    ALTER < 35 & Bildung_gr == 3 ~ 1, 
    ALTER > 75 & Bildung_gr == 3 ~ 2,
  )) |> 
  sjlabelled::var_labels(Alt_Bild2 = "Alter und Bildung") |> 
  sjlabelled::set_labels(Alt_Bild2, labels = c("Junggebildet" = 1, "Altgebildet" = 2)) |> 
  sjmisc::frq(Alt_Bild2) # erstmal nur eine Frequencies als Ergebnis und nicht gleich den Daten hinzufügen

# Dann dem Datensatz hinzufügen
DATEN_BF <- DATEN_BF |> # diese Zeile sorgt dafür, dass die DATEN_BF mit der Mutation in die DATEN_BF geschrieben werden
  mutate(Alt_Bild2 = case_when(
    ALTER < 35 & Bildung_gr == 3 ~ 1, 
    ALTER > 75 & Bildung_gr == 3 ~ 2,
  )) |> 
  sjlabelled::var_labels(Alt_Bild2 = "Alter und Bildung") |> 
  sjlabelled::set_labels(Alt_Bild2, labels = c("Junggebildet" = 1, "Altgebildet" = 2))
```

## Variablen zu Indizes zusammenfassen

Indizes können Mittelwertindizes sein, Summenindizes oder sogar Faktoren aus einer Faktorenanalyse (PCA).

```{r}
#| label: Index-Mediennutzung
#| echo: true

# Ein Summenindex für 10 Variablen zur Nachrichtennutzung Es wird zeilenweise die Summe für die Dummys (0/1-Variablen) berechnet

# wichtig ist hier rowSum, damit die Summe nicht über die Fälle, sondern die Variablen gebildet wird

DATEN_BF <- DATEN_BF |> 
  mutate(MEDIEN_sum = rowSums(across(NACHRICHT_TITEL1:NACHRICHT_TITEL10), na.rm = TRUE)) 

DATEN_BF |> 
  sjmisc::frq(MEDIEN_sum)

# Hier noch der Durchschnittswert als Index, was bei Dummys der Anteil der 1-er ist, also wenn 68 von knapp 200 Leuten 2 Medien nannten, dann gibt es 68 mal die 0.2 

DATEN_BF <- DATEN_BF |> 
  mutate(MEDIEN_mean = rowMeans(across(NACHRICHT_TITEL1:NACHRICHT_TITEL10), na.rm = TRUE))

DATEN_BF |> 
  sjmisc::frq(MEDIEN_mean)
```

### NW-Index als Summe der NF

Im ersten Schritt werden die Nachrichtenfaktoren auf 0 gesetzt, wenn sie einen fehlenden Wert haben (also NA sind oder -9). Dann wird zweilenweise (rowwise) die Summe (Additivität) der NF gebildet. Das Resultat ist eine neue Variable im Datensatz, die NW_Sum_INDX heisst. 

```{r}
#| label: NW-Index
#| echo: true

DATEN_IA <- DATEN_IA |> 
  mutate(across(c(PERS:KNTR, KAT:NAEHE), ~replace(.x, is.na(.x),0))) |> 
  mutate(across(c(PERS:KNTR, KAT:NAEHE), ~replace(.x, .x == -9,0))) |> 
  rowwise() |> 
  mutate(NW_Sum_IND = sum(c(PERS:KNTR, KAT:NAEHE)))

DATEN_IA |> sjmisc::frq(NW_Sum_IND)
```

### Beachtungsindex 

Im Folgenden wird die Platzierung `PLATZ` und die Wortzahl `TC` zu einem Summenindex zusammengerechnet. Das Problem ist dabei, dass die beiden Variablen nicht annähernd die gleiche Skalierung haben (die Wortzahl geht im Beispiel von 1000 bis 9400 und die Platzierung von 1 bis 13, wobei eine kleinere Platzierung auf eine bessere Platzierung, also eine höhere Beachtung hinweisst). Damit wir die beidne Variablen ersteinmal angleichen, standardisieren wir sie beide mit `scale` auf z-transformierte Variablen und drehen dabei gleich die Variable um (darum das - vor PLATZ), so dass grössere Werte, stärkere Beachtung bedeuten. Dann bauen wir wieder einen Index, was bedeutet, dass wir den Mittelwert der beiden Beachtungsindikatoren zeilenweise berechnen (darum `rowwise()`). In der Mittelwertfunktion `mean()`steht hinter der z-Transformierten `PLATZ_z` noch `* 2`. Das sorgt dafür, dass die Platzierung mit dem doppelten Gewicht in die Berechnung des Beachtungsindexes eingeht, weil die Grundannahme ist, dass die Platzierung mehr über die journalistische Beachtung sagt, als der Umfang der Meldungen (online spielt der Platz ja nicht sooo eine Rolle wie bei Zeitungen oder Nachrichtensendungen im TV (früher)). 

```{r}
#| label: Beachtungs-Index
#| echo: true

# erstmal die beiden Beachtungsindikatoren angucken
# DATEN_IA |> sjmisc::frq(PLATZ, TC) # nur auskommentiert, damit es im Output nicht elendig lang wird

DATEN_IA <- DATEN_IA |> 
  mutate(PLATZ_z = scale(-PLATZ), # PLATZ_z ist die z-Transformierte und umgekehrte Version von PLATZ (je grösser der Wert, desto grösser die Beachtung)
         TC_z = scale(TC)) |> # die z-Transformierte der Wortzahl TC
  rowwise() |> 
  mutate(Beachtung = mean(c(PLATZ_z * 2, TC_z), na.rm = TRUE)) |> # Mittelwert aus den z-Transformierten Variablen, wobei die Platzerierung mit doppeltem Gewicht (*2) eingeht
  ungroup() # die Gruppierung von rowwise wieder zurücksetzen

# DATEN_IA |> sjmisc::frq(Beachtung) # angucken
```

### NW-Index aus dem Nachrichtenwertmodell

Ok, das wird jetzt recht heftig. Wer Regressionen in Statistik Aufbau nicht cool fand oder noch garnicht hatte, muss sich das Folgende nicht antun. Die Idee ist, dass wir einen Nachrichtenwertindex (NW) bauen, der sich aus den vorhergesagten Werten der Beachtung ergibt, wenn wir die Nachrichtenfaktoren (NF) in einem additiven Modell die Beachtungsindikatoren vorhersagen lassen. Im Vergleich zu dem `NW_Sum_INDX` von oben, gehen in diesen `NW_Modell_INDX` nicht alle NF mit demselben Gewicht ein, sondern mit den Gewichten, die die journalistische Beachtung vorhersagen. Sie können diesen Index nehmen und durch Datenfusion an den Datensatz der Befragung anhängen. Dann können Sie schauen, wer stärker und wer weniger auf die gewichteten NF reagiert. Wer also sehr typisch oder sehr untypisch Nachrichten rezipiert. 

```{r}
#| label: Index-NW-Modell
#| echo: true

AV_und_UV <- DATEN_IA |> # wichtig hier, dass ein neues Datenobjekt AV_und_UV angelegt wird, weil Sie sich sonst alle andere Variablen aus ihrem Datensatz löschen
  select(Beachtung, PERS:KNTR, KAT:NAEHE) # Es werden alle UVs und die AV ausgewählt

NW_Modell <- lm(Beachtung ~ ., data = AV_und_UV) # der Punkte steht für alle Variablen (also die oben ausgewählten); So braucht man nicht jeden NF mit + hintereinander in das Modell tun.

# summary(NW_Modell) # hiermit mal die Auswertung anschauen.

DATEN_IA <- DATEN_IA  |> 
  select(-any_of("NW_INDX")) |> # löschen, wenn die Variable schon da ist, damit es keine Konflikte gibt
  modelr::add_predictions(NW_Modell) |> 
  rename(NW_INDX = pred) # hier ist rename mal gut, weil bei jedem Durchlauf die "pred" neu erzeugt wird und dann umbenannt werden kann

# DATEN_IA |> sjmisc::frq(NW_INDX) # Sehr viele detaillierte Werte
```

### Umfangreiche Umkodierungstabellen (TF E)

Zum Beispiel für Ländereigenschaften über die Ländercodes. 

```{r}
#| label: "Ländervariable"
#| echo: true

# Aus der Länderliste mit den Kodierungen kommen die Variablen für eine Laenderliste:
Laenderliste <- readxl::read_xlsx("data/Laender_Liste_Kodierung.xlsx", sheet = "Länderliste")

# Die Codes für die Länder kommen aus einer anderen Untertabelle der Excel, darum steht hinten bei sheets etwas anderes:
Ländercodes <- readxl::read_xlsx("data/Laender_Liste_Kodierung.xlsx", sheet = "Ländercodes")

# Dann gibt es noch lauter weitere Codes, die wir jetzt anmatchen können, die können wir später gut gebrauchen, weil verschiedene Datensätze aus dem Internetz verschiedene Ländercodes verwenden

Land_AlphaISO <- readxl::read_xlsx("data/Laender_Liste_Kodierung.xlsx", sheet = "AlphaISO") |> 
  select(name, "alpha2", "alpha3", "CountryCode")

# Hier binden wir die zusammen, erst die Ländercodes an die Laenderliste und dann noch die Land_AlphaISO hinten dran
Laender <- left_join(Laenderliste, Ländercodes, by = "Land") |>
  left_join(Land_AlphaISO, by = "alpha2")

# oh, und hier noch ein paar Handelsdaten, falls das jemanden interessiert
WorldTrade <- economiccomplexity::world_gdp_avg_1998_to_2000

# So, die kleben wir jetzt auch noch hinten an unsere Laendervariable
Laender <- left_join(Laender, WorldTrade, by = c("alpha3" = "country"))

# Schreibe die Laender-Daten raus in die Exceldatei "Laender_codes.xlsx"
writexl::write_xlsx(Laender, "data/Laender_codes.xlsx")

# Hier die Laender-Daten wieder aus der (eventuell ergänzten Laender-Excel) in R laden:
Laender <- readxl::read_xlsx("data/Laender_codes.xlsx")

# Jetzt kommt die Magie. Wie matchen die Laendervariable an die Inhaltsanalysedaten:

# Hier lade ich die Inhaltanalysedaten aus meiner Excel. Vermutlich heisst die Excel bei Ihnen anders und liegt vielleicht auch nicht im Unterordner "Daten".
IA <- readxl::read_excel("data/IA_Gesamt.xlsx")

# Hier werden alle Variablen aus der Laendertabelle hinten an die Inhaltsanalyse geklebt
IA <- left_join(IA, Laender, by = c("LAND" = "Code"))

```

