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) 11-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?