::p_load(tidyverse, readxl, parameters,
pacman
effectsize, magrittr, multcomp,
multcompView, rcompanion, rstatix,
emmeans, see, performance,
conflicted)## resolve some conflicts with same function naming
conflicts_prefer(dplyr::select)
conflicts_prefer(dplyr::filter)
conflicts_prefer(effectsize::eta_squared)
4 Steuerung der vegetativen Entwicklung krautiger Pflanzen (44B0608) - Teil 1
Letzte Änderung am 13. January 2024 um 17:50:36
Genutzte R Pakete
Es geht hier um das Modul Steuerung der vegetativen Entwicklung krautiger Pflanzen (44B0608)
<- read_excel("data/keimversuch_basilikum.xlsx") %>%
basi_tbl mutate(versuchsgruppe = as_factor(versuchsgruppe))
## Ist das Outcome annährend normalverteilt
## -> ja, ANOVA
## -> nein, Sie unten
ggplot(basi_tbl, aes(versuchsgruppe, frischmasse)) +
theme_bw() +
geom_point()
%>%
basi_tbl group_by(versuchsgruppe) %>%
shapiro_test(frischmasse)
# A tibble: 4 × 4
versuchsgruppe variable statistic p
<fct> <chr> <dbl> <dbl>
1 Erde frischmasse 0.990 0.980
2 Erde+Fließ frischmasse 0.774 0.0486
3 Erde+Perlite frischmasse 0.957 0.786
4 Erde+Perlite+Fließ frischmasse 0.977 0.918
%>%
basi_tbl filter(versuchsgruppe == "Erde+Fließ") %>%
select(frischmasse) %>%
check_outliers()
OK: No outliers detected.
- Based on the following method and threshold: mahalanobis (10.83).
- For variable: frischmasse
## Wir nehmen an, dass es sich bei Frischmasse um einen annährend
## normalverteilten Endpunkt handelt.
<- lm(frischmasse ~ versuchsgruppe, data = basi_tbl)
fit
%>%
fit anova() %>%
parameters()
Parameter | Sum_Squares | df | Mean_Square | F | p
----------------------------------------------------------------
versuchsgruppe | 715.54 | 3 | 238.51 | 21.70 | < .001
Residuals | 175.89 | 16 | 10.99 | |
Anova Table (Type 1 tests)
%>%
fit eta_squared()
For one-way between subjects designs, partial eta squared is equivalent
to eta squared. Returning eta squared.
# Effect Size for ANOVA
Parameter | Eta2 | 95% CI
------------------------------------
versuchsgruppe | 0.80 | [0.61, 1.00]
- One-sided CIs: upper bound fixed at [1.00].
## posthoc Test durchführen.
## Welcher paarweise Unterschied ist signifikant?
## alle Varianzen in allen Gruppen sind gleich
%$%
basi_tbl pairwise.t.test(frischmasse, versuchsgruppe)
Pairwise comparisons using t tests with pooled SD
data: frischmasse and versuchsgruppe
Erde Erde+Fließ Erde+Perlite
Erde+Fließ 0.00097 - -
Erde+Perlite 0.00582 0.28493 -
Erde+Perlite+Fließ 3.4e-06 0.01173 0.00229
P value adjustment method: holm
## alle Varianzen unterscheiden sich
%$%
basi_tbl pairwise.t.test(frischmasse, versuchsgruppe,
pool.sd = FALSE)
Pairwise comparisons using t tests with non-pooled SD
data: frischmasse and versuchsgruppe
Erde Erde+Fließ Erde+Perlite
Erde+Fließ 0.00853 - -
Erde+Perlite 0.00853 0.29330 -
Erde+Perlite+Fließ 0.00059 0.05245 0.01172
P value adjustment method: holm
## Soll ich für multiple Vergleiche adjustieren?
## -> nein!
%$%
basi_tbl pairwise.t.test(frischmasse, versuchsgruppe,
pool.sd = FALSE, p.adjust.method = "none")
Pairwise comparisons using t tests with non-pooled SD
data: frischmasse and versuchsgruppe
Erde Erde+Fließ Erde+Perlite
Erde+Fließ 0.0017 - -
Erde+Perlite 0.0017 0.2933 -
Erde+Perlite+Fließ 9.9e-05 0.0262 0.0039
P value adjustment method: none
## -> ja
%$%
basi_tbl pairwise.t.test(frischmasse, versuchsgruppe,
pool.sd = FALSE,
p.adjust.method = "bonferroni")
Pairwise comparisons using t tests with non-pooled SD
data: frischmasse and versuchsgruppe
Erde Erde+Fließ Erde+Perlite
Erde+Fließ 0.01024 - -
Erde+Perlite 0.01023 1.00000 -
Erde+Perlite+Fließ 0.00059 0.15734 0.02344
P value adjustment method: bonferroni
## Die p-Werte sind nach Bonferroni adjustiert
%$%
basi_tbl pairwise.t.test(frischmasse, versuchsgruppe,
pool.sd = FALSE,
p.adjust.method = "bonferroni") %>%
extract2("p.value") %>%
fullPTable() %>%
multcompLetters()
Erde Erde+Fließ Erde+Perlite Erde+Perlite+Fließ
"a" "bc" "b" "c"
4.1 Barplot mit compact letter display und abspeichern
<- basi_tbl %>%
stat_tbl group_by(versuchsgruppe) %>%
summarise(mean = mean(frischmasse),
sd = sd(frischmasse),
se = sd/sqrt(n()))
ggplot(stat_tbl, aes(x = versuchsgruppe, y = mean,
fill = versuchsgruppe)) +
theme_bw() +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = mean-sd, ymax = mean+sd),
width = 0.2) +
labs(x = "Versuchsgruppe", y = "Frischmasse in [g]") +
theme(legend.position = "none") +
scale_fill_okabeito() +
annotate("text",
x = 1:4,
y = c(19, 31, 27, 37),
label = c("a", "bc", "b", "c")) +
annotate("text", x = 1, y = 35,
label = "ANOVA = <0.001", size = 3)
ggsave("img/barplot_frischmasse.png",
width = 5, height = 3)
ggsave("img/barplot_trockenmasse.png",
width = 5, height = 3)
<- basi_tbl %>%
basi_time_tbl select(versuchsgruppe, t1:t4) %>%
pivot_longer(cols = t1:t4,
values_to = "values",
names_to = "timepoint") %>%
mutate(timepoint = as_factor(timepoint),
time_num = as.numeric(timepoint))
ggplot(basi_time_tbl, aes(time_num, values, color = versuchsgruppe)) +
theme_bw() +
scale_color_okabeito() +
geom_jitter(position=position_dodge(0.3), shape = 4) +
stat_summary(fun.data="mean_sdl", , fun.args = list(mult = 1),
geom="pointrange", position=position_dodge(0.3)) +
stat_summary(fun = "mean", fun.min = "min", fun.max = "max", geom = "line",
position=position_dodge(0.3)) +
theme(legend.position = c(0.8, 0.2),
legend.background = element_rect(color="black",
size=0.5, linetype="solid"))
<- lm(values ~ versuchsgruppe + timepoint + versuchsgruppe:timepoint, basi_time_tbl) basi_time_fit
%>%
basi_time_fit emmeans(specs = ~ versuchsgruppe | timepoint) %>%
contrast(method = "pairwise", adjust = "none") %>%
%>%
as_tibble select(contrast, timepoint, p.value) %>%
mutate(p.value = format.pval(p.value, eps = 0.001, digits = 2)) %>%
print(n = Inf)
# A tibble: 24 × 3
contrast timepoint p.value
<fct> <fct> <chr>
1 Erde - (Erde+Fließ) t1 0.2265
2 Erde - (Erde+Perlite) t1 0.2265
3 Erde - (Erde+Perlite+Fließ) t1 0.0053
4 (Erde+Fließ) - (Erde+Perlite) t1 1.0000
5 (Erde+Fließ) - (Erde+Perlite+Fließ) t1 0.1007
6 (Erde+Perlite) - (Erde+Perlite+Fließ) t1 0.1007
7 Erde - (Erde+Fließ) t2 0.9119
8 Erde - (Erde+Perlite) t2 0.0499
9 Erde - (Erde+Perlite+Fließ) t2 0.1538
10 (Erde+Fließ) - (Erde+Perlite) t2 0.0388
11 (Erde+Fließ) - (Erde+Perlite+Fließ) t2 0.1250
12 (Erde+Perlite) - (Erde+Perlite+Fließ) t2 0.5807
13 Erde - (Erde+Fließ) t3 0.8250
14 Erde - (Erde+Perlite) t3 0.0388
15 Erde - (Erde+Perlite+Fließ) t3 0.2710
16 (Erde+Fließ) - (Erde+Perlite) t3 0.0229
17 (Erde+Fließ) - (Erde+Perlite+Fließ) t3 0.1875
18 (Erde+Perlite) - (Erde+Perlite+Fließ) t3 0.3214
19 Erde - (Erde+Fließ) t4 0.1007
20 Erde - (Erde+Perlite) t4 0.2710
21 Erde - (Erde+Perlite+Fließ) t4 0.7402
22 (Erde+Fließ) - (Erde+Perlite) t4 0.0072
23 (Erde+Fließ) - (Erde+Perlite+Fließ) t4 0.1875
24 (Erde+Perlite) - (Erde+Perlite+Fließ) t4 0.1538
%>%
basi_time_fit emmeans(specs = ~ versuchsgruppe | timepoint) %>%
cld(Letters = letters, adjust = "none")
timepoint = t1:
versuchsgruppe emmean SE df lower.CL upper.CL .group
Erde 15.0 1.27 64 12.5 17.5 a
Erde+Perlite 17.2 1.27 64 14.7 19.7 ab
Erde+Fließ 17.2 1.27 64 14.7 19.7 ab
Erde+Perlite+Fließ 20.2 1.27 64 17.7 22.7 b
timepoint = t2:
versuchsgruppe emmean SE df lower.CL upper.CL .group
Erde+Fließ 19.8 1.27 64 17.3 22.3 a
Erde 20.0 1.27 64 17.5 22.5 a
Erde+Perlite+Fließ 22.6 1.27 64 20.1 25.1 ab
Erde+Perlite 23.6 1.27 64 21.1 26.1 b
timepoint = t3:
versuchsgruppe emmean SE df lower.CL upper.CL .group
Erde+Fließ 20.4 1.27 64 17.9 22.9 a
Erde 20.8 1.27 64 18.3 23.3 a
Erde+Perlite+Fließ 22.8 1.27 64 20.3 25.3 ab
Erde+Perlite 24.6 1.27 64 22.1 27.1 b
timepoint = t4:
versuchsgruppe emmean SE df lower.CL upper.CL .group
Erde+Fließ 20.2 1.27 64 17.7 22.7 a
Erde+Perlite+Fließ 22.6 1.27 64 20.1 25.1 ab
Erde 23.2 1.27 64 20.7 25.7 ab
Erde+Perlite 25.2 1.27 64 22.7 27.7 b
Confidence level used: 0.95
significance level used: alpha = 0.05
NOTE: If two or more means share the same grouping symbol,
then we cannot show them to be different.
But we also did not show them to be the same.