Anova für mehrere subsets berechnen

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
flip_0207
Beiträge: 23
Registriert: Do Dez 06, 2018 7:46 pm

Anova für mehrere subsets berechnen

Beitrag von flip_0207 »

Hallo

Ich möchte gerne mit möglichst wenig Code eine große Anzahl an Anovas rechnen.

Einen möglichen Beispieldatensatz habe ich in den Anhang gepackt. Dieser Beispieldatensatz umfasst die Erträge (z.B. von Winterraps) in Abhängigkeit von 3 verschiedenen Treatments an 3 Standorten in insgesamt 4 Versuchsjahren. Ziel der Analyse ist es, Unterschiede zwischen den Treatments festzustellen - allerdings getrennt für jeden Standort und jedes Versuchsjahr. Ich käme somit für den Beispieldatensatz auf insgesamt 12 Anovas und Tukey-Tests, was grundsätzlich für den Beispieldatensatz kein Problem darstellt. Der eigentliche Datensatz ist allerdings deutlich größer, wodurch der Aufwand bei manueller Eingabe ziemlich groß ist.

Bisher konnte ich bei meiner Recherche keine zufriedenstellende Lösung und auch kein geeignetes Beispiel finden. Ich bin bei der Recherche sowohl auf Schleifen als auch auf die apply-Funktionen (lapply, sapply, mapply, vapply, tapply) gestoßen und habe auch ein Beispiel gefunden, wo sapply mit den Funktionen split und by kombiniert wird: https://stackoverflow.com/questions/239 ... bsets-in-r

Wirklich schlau bin ich daraus aber auch nicht geworden.

Gibt es eine elegante Möglichkeit mein Problem zu lösen, oder muss ich doch wieder manuell und mit viel Code arbeiten?

Viele Grüße!
Dateianhänge
Beispiel_ANOVA.csv
(4.8 KiB) 45-mal heruntergeladen
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Anova für mehrere subsets berechnen

Beitrag von EDi »

Das kann man durch funktionelles Programmieren lösen (ich nutze hier das purrr Paket, aber lapply geht genauso - ist IMO nur umständlicher):

Code: Alles auswählen


# Data --------------------------------------------------------------------
data <- read.table("http://forum.r-statistik.de/download/file.php?id=1832", sep = ";", header = TRUE, dec = ",")
head(data)
str(data)

# Pkgs --------------------------------------------------------------------
library("purrr")
library("dplyr")
library("tidyr")
library("emmeans")



# Code for all combinations --------------------------------------------------------------------

res <- data %>%
  # for each combination of
  dplyr::group_by(Standort, Versuchsjahr) %>%
  # make a data.frame
  tidyr::nest() %>%
  dplyr::mutate(
    # fit aov to each data
    aov = purrr::map(data, ~aov(Ertrag..dt.ha. ~ Treatment, data = .x)),
    # run pairwise comparisons with tukey correctios
    emm = purrr::map(aov, ~emmeans::contrast(
        emmeans::emmeans(.x, ~Treatment), 
        method = "pairwise"))
    )

# extract results into one big table
res %>%
  mutate(emm = map(emm, data.frame)) %>%
  unnest(emm)





Man könnte auch einfach Standort und Jahr ins Modell nehmen und dann die paarweisen vergleiche pro Gruppe machen;

Code: Alles auswählen

mod <- lm(Ertrag..dt.ha. ~ Treatment * Standort * factor(Versuchsjahr), data = data)
emm <- emmeans::emmeans(mod, ~ Treatment | Standort + Versuchsjahr)
emmeans::contrast(emm, method = "pairwise", adjust = "tukey")
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
flip_0207
Beiträge: 23
Registriert: Do Dez 06, 2018 7:46 pm

Re: Anova für mehrere subsets berechnen

Beitrag von flip_0207 »

EDi hat geschrieben: Fr Mär 17, 2023 12:43 am Das kann man durch funktionelles Programmieren lösen (ich nutze hier das purrr Paket, aber lapply geht genauso - ist IMO nur umständlicher):

Code: Alles auswählen


# Data --------------------------------------------------------------------
data <- read.table("http://forum.r-statistik.de/download/file.php?id=1832", sep = ";", header = TRUE, dec = ",")
head(data)
str(data)

# Pkgs --------------------------------------------------------------------
library("purrr")
library("dplyr")
library("tidyr")
library("emmeans")



# Code for all combinations --------------------------------------------------------------------

res <- data %>%
  # for each combination of
  dplyr::group_by(Standort, Versuchsjahr) %>%
  # make a data.frame
  tidyr::nest() %>%
  dplyr::mutate(
    # fit aov to each data
    aov = purrr::map(data, ~aov(Ertrag..dt.ha. ~ Treatment, data = .x)),
    # run pairwise comparisons with tukey correctios
    emm = purrr::map(aov, ~emmeans::contrast(
        emmeans::emmeans(.x, ~Treatment), 
        method = "pairwise"))
    )

# extract results into one big table
res %>%
  mutate(emm = map(emm, data.frame)) %>%
  unnest(emm)





Man könnte auch einfach Standort und Jahr ins Modell nehmen und dann die paarweisen vergleiche pro Gruppe machen;

Code: Alles auswählen

mod <- lm(Ertrag..dt.ha. ~ Treatment * Standort * factor(Versuchsjahr), data = data)
emm <- emmeans::emmeans(mod, ~ Treatment | Standort + Versuchsjahr)
emmeans::contrast(emm, method = "pairwise", adjust = "tukey")
Vielen Dank! Dann werde ich mich auch noch intensiver mit dem purrr Paket auseinandersetzen.
flip_0207
Beiträge: 23
Registriert: Do Dez 06, 2018 7:46 pm

Re: Anova für mehrere subsets berechnen

Beitrag von flip_0207 »

Gibt es denn ergänzend dazu auch die Möglichkeit, direkt die Gruppen aus dem Tukey-Test anzeigen bzw. in den data.frame schreiben zu lassen?
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Anova für mehrere subsets berechnen

Beitrag von EDi »

direkt die Gruppen aus dem Tukey-Test anzeigen bzw. in den data.frame schreiben zu lassen?
Verstehe ich nicht- macht doch der code...
Oder meinst du diese (unsäglichen) "signifikanzBuchstaben"? Das geht mit emmeans cld (compact letter display) - beachte aber Bitte den Hinweis unter note.
https://rdrr.io/cran/emmeans/man/CLD.emmGrid.html
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
flip_0207
Beiträge: 23
Registriert: Do Dez 06, 2018 7:46 pm

Re: Anova für mehrere subsets berechnen

Beitrag von flip_0207 »

EDi hat geschrieben: Fr Mär 24, 2023 2:07 pm Verstehe ich nicht- macht doch der code...
Oder meinst du diese (unsäglichen) "signifikanzBuchstaben"? Das geht mit emmeans cld (compact letter display) - beachte aber Bitte den Hinweis unter note.
https://rdrr.io/cran/emmeans/man/CLD.emmGrid.html
Danke!

Ich meinte tatsächlich die Signifikanzbuchstaben. Die Darstellung wäre für meinen tatsächlichen Datensatz zwar schick und einfach gewesen, allerdings passen die - wie in der note beschrieben - nicht zwangsläufig zu den p-values, was eine Interpretation quasi unmöglich macht.

Sinnvoller für meine Anwendung ist die Ausgabe des Outputs als Tabelle.

Mit sjPlot habe ich bereits eine Tabelle für eine ANOVA erstellen können. Funktioniert die Ausgabe mehrerer Ergebnisse auch über funktionelles Programmieren, sodass ich entweder alle ANOVAs (inklusive post-hoc Test?) in einer großen Tabelle habe oder - was noch besser passen würde - eine difinierte Auswahl als Tabelle exportieren kann? Oder muss ich da doch noch anfangen loops zu programmieren? sjPlot oder stargazer sind für mich interessant, da die Tabellen ohne viel Formatierungsaufwand für LaTeX oder Word nutzbar sind.

Viele Grüße!
Antworten