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!
Anova für mehrere subsets berechnen
Anova für mehrere subsets berechnen
- Dateianhänge
-
- Beispiel_ANOVA.csv
- (4.8 KiB) 22-mal heruntergeladen
Re: Anova für mehrere subsets berechnen
Das kann man durch funktionelles Programmieren lösen (ich nutze hier das purrr Paket, aber lapply geht genauso - ist IMO nur umständlicher):
Man könnte auch einfach Standort und Jahr ins Modell nehmen und dann die paarweisen vergleiche pro Gruppe machen;
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)
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
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz

Re: Anova für mehrere subsets berechnen
Vielen Dank! Dann werde ich mich auch noch intensiver mit dem purrr Paket auseinandersetzen.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):
Man könnte auch einfach Standort und Jahr ins Modell nehmen und dann die paarweisen vergleiche pro Gruppe machen;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)
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
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
Verstehe ich nicht- macht doch der code...direkt die Gruppen aus dem Tukey-Test anzeigen bzw. in den data.frame schreiben zu lassen?
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
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz

Re: Anova für mehrere subsets berechnen
Danke!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
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!