Seite 1 von 1

Anova für mehrere subsets berechnen

Verfasst: Do Mär 16, 2023 3:59 pm
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!

Re: Anova für mehrere subsets berechnen

Verfasst: Fr Mär 17, 2023 12:43 am
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")

Re: Anova für mehrere subsets berechnen

Verfasst: Mo Mär 20, 2023 8:44 am
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.

Re: Anova für mehrere subsets berechnen

Verfasst: Mo Mär 20, 2023 9:23 am
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?

Re: Anova für mehrere subsets berechnen

Verfasst: Fr Mär 24, 2023 2:07 pm
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

Re: Anova für mehrere subsets berechnen

Verfasst: Mo Mär 27, 2023 1:08 pm
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!