---
format:
  revealjs:
    slide-number: true
    theme: [default, ../theme/presentation_theme.scss, ../theme/presentation_components.scss]
    embed-resources: true
    preview-links: false
    output-file: "presentation"
    output-ext: "html"
    highlight-style: github-light
    include-in-header: "../theme/fonts-include.html"
filters:
  - ../theme/rn-shorthand.lua
  - ../_extensions/EmilHvitfeldt/roughnotation/rough.lua
---

```{r}
#| label: setup
#| include: false
options(htmltools.dir.version = FALSE)
knitr::opts_chunk$set(
  fig.align = "center",
  out.width = "100%",
  message = FALSE,
  warning = FALSE
)

library(here)
here::i_am("Presentation/presentation.qmd")
source(here::here("R", "set_r_theme.R"))

path_materials <- "Presentation/Materials"

source(here::here("R", "include_local_figure.R"))
source(here::here("R", "format_whole_number.R"))
source(here::here("R", "format_whole_number_for_math.R"))
source(here::here("R", "Functions", "format_cz.R"))
source(here::here("R", "Functions", "format_cz_math.R"))
source(here::here("R", "Functions", "format_p_cz.R"))
```

```{r}
#| label: dynamic-links
#| include: false
project_name <- basename(here::here())
display_name <- "Biostatistika"
github_url <- paste0(
  "https://github.com/CUNI-NATUR-Biostatistics/",
  project_name
)
slides_url <- paste0(
  "https://CUNI-NATUR-Biostatistics.github.io/",
  project_name, "/"
)
```

## Liší se průměrná hmotnost těla mezi druhy tučňáků? {.course-title .course-title-illustrated .bg-indigo}

::: {.course-title-mark}
![Logo kurzu Biostatistika](../theme/course-logo-reversed.svg) BIOSTATISTIKA
:::

::: {.course-title-number}
L06
:::

::: {.course-title-formal}
Když prediktor není číslo: od dvou průměrů k analýze rozptylu
:::

::: {.course-title-link}
[cuni-natur-biostatistics.github.io/materialy.html](https://cuni-natur-biostatistics.github.io/materialy.html)
:::

::: {.course-title-illustration}
```{r}
#| label: zobrazit-titulni-ilustraci
#| echo: false
#| fig-alt: "Tři skupiny tučňáků na ledu u fialových praporků; tučňáci oslí a jejich praporek stojí na vyšším ledovém bloku než tučňáci kroužkoví a uzdičkoví. Ilustrace vytvořená pomocí AI."
include_local_figure("tucnaci_titulni_kompozice.png")
```
:::

::: {.course-title-caption}
Ilustrace vytvořená pomocí AI. Anatomická reference: Allison Horst, CC0.
:::

::: {.notes}
Praporky představují skupinové průměry hmotnosti těla; výška ledu je pouze kvalitativní metafora, nikoli měřítko. Tučňáci oslí stojí výše, zatímco kroužkoví a uzdičkoví mají podobnou průměrnou hmotnost. Obrázek nepředstavuje výsledek testu ani důkaz příčinného vlivu druhu.
:::

## Liší se průměrná hmotnost mezi druhy tučňáků?

::: columns
::: {.column width="58%"}
```{r}
#| label: zobrazit-druhy-tucnaku
#| echo: false
#| out-width: "100%"
#| fig-alt: "Kreslené ilustrace tří druhů tučňáků: tučňák uzdičkový, tučňák oslí a tučňák kroužkový."
include_local_figure("lter_penguins.png")
```
:::

::: {.column width="42%"}

<br>

::: {.panel-question .fragment .text-center}
[Biologická otázka]{.panel-title}

Je rozdíl mezi druhy větší, než bychom čekali od variability jednotlivých tučňáků?
:::

:::
:::

::: {.footer}
Ilustrace: Allison Horst · Data: Palmer Station LTER / palmerpenguins
:::

::: {.notes}
Tři druhy tučňáků z Palmerova souostroví. Ukážu barvy, které budou druhy mít v celé přednášce: Adélie oranžová, Chinstrap fialová, Gentoo modrozelená. Otázku nechám chvíli viset: rozdíl mezi druhy porovnáváme s tím, jak se liší jedinci uvnitř druhu.
:::

{{< include ../pollslive/generated/active.qmd >}}

## Výsledky učení

<br>

Po absolvování této přednášky budete schopni:

::: {.incremental}

- fitovat `lm(y ~ skupina)` pro dvě i více skupin a přečíst jeho koeficienty;
- interpretovat [intercept jako průměr referenční skupiny]{.text-hgl-indigo_velvet} a další koeficienty jako rozdíly vůči ní;
- vysvětlit dvouvýběrový t-test a ANOVA jako otázky položené lineárnímu modelu;
- rozlišit [celkový F-test]{.text-hgl-indigo_velvet} od [post-hoc porovnání dvojic]{.text-hgl-orange} a rozhodnout, kdy párová porovnání dávají smysl;
- napsat závěr v biologicky smysluplných jednotkách: rozdíl, nejistota, test a omezení studie.

:::

::: {.notes}
Stejný seznam jako ve skriptech. Zdůrazním, že lineární model se nemění; mění se typ prediktoru a otázky, které modelu klademe.
:::


## Stejná logika, jiný typ prediktoru

::: {.takeaway-strip .text-center}
Efekt, nejistotu a důkaz čteme stejně jako u přímky. Mění se jen prediktor: místo čísla je to **skupina**.
:::

::: {.notes}
Most z předchozí lekce: tam byl prediktorem numerický údaj (zeměpisná šířka), teď je to druh.
:::

## Jak těžcí jsou tučňáci?

```{r}
#| label: vytvorit-graf-spojenych-dat
#| include: false
data_penguins <-
  readr::read_csv(
    here::here("data", "palmer_penguins.csv"),
    na = c("", "NA"),
    show_col_types = FALSE
  ) |>
  dplyr::filter(!is.na(hmotnost_tela_g)) |>
  dplyr::mutate(
    druh = factor(druh, levels = c("Adelie", "Chinstrap", "Gentoo"))
  )

data_pooled_plot <-
  data_penguins |>
  dplyr::mutate(
    skupina = "všichni tučňáci"
  )

plot_pooled <-
  ggplot2::ggplot(
    data_pooled_plot,
    ggplot2::aes(x = skupina, y = hmotnost_tela_g)
  ) +
  ggplot2::geom_violin(
    fill = biostat_cols[["graphite"]],
    alpha = 0.22,
    color = NA
  ) +
  ggbeeswarm::geom_quasirandom(
    width = 0.2, 
    alpha = 0.24, 
    size = 2.1,
    color = biostat_cols[["graphite"]]
  ) +
  ggplot2::geom_boxplot(
    width = 0.18,
    alpha = 0.22,
    fill = biostat_cols[["grey_olive"]],
    color = biostat_cols[["white"]],
    outliers = FALSE
  ) +
  ggplot2::scale_x_discrete(labels = "?") +
  ggplot2::labs(x = NULL, y = "Hmotnost těla (g)") +
  ggplot2::coord_cartesian(xlim = c(0.55, 1.45)) +
  theme_biostat(base_size = 18) +
  ggview::canvas(width = 1500, height = 780, units = "px")

ggview::save_ggplot(
  plot = plot_pooled,
  file = here::here(path_materials, "pooled_body_mass.png")
)
```

```{r}
#| label: zobrazit-graf-spojenych-dat
#| echo: false
#| out-width: "74%"
#| fig-alt: "Šedé body hmotností všech tučňáků v jednom sloupci s obrysem rozdělení a krabicovým grafem; hodnoty sahají přibližně od tří do šesti a půl kilogramu."
include_local_figure("pooled_body_mass.png")
```

::: {.panel-question .fragment .text-center}
Co by mohlo vytvářet tak široký rozsah hodnot?
:::

::: {.notes}
Hmotnosti `r nrow(data_penguins)` tučňáků bez rozlišení druhu. Nechám studenty navrhnout vysvětlení (věk, pohlaví, druh, ostrov, rok) a teprve na dalším snímku obarvím druhy.
:::

## Barva odkryje skupiny

```{r}
#| label: vytvorit-pozorovani-podle-druhu
#| include: false
barvy_druhu <- c(
  "Adelie" = "darkorange",
  "Chinstrap" = "mediumpurple",
  "Gentoo" = "cyan4"
)

popisky_druhu <- c(
  "Adelie" = "Adélie",
  "Chinstrap" = "Chinstrap",
  "Gentoo" = "Gentoo"
)

plot_species <-
  ggplot2::ggplot(
    data_penguins,
    ggplot2::aes(x = druh, y = hmotnost_tela_g, color = druh,
    fill = druh)
  ) +
   ggplot2::geom_violin(
    alpha = 0.22,
    color = NA
  ) +
  ggbeeswarm::geom_quasirandom(
    width = 0.2, 
    alpha = 0.24, 
    size = 2.1,
  ) +
  ggplot2::geom_boxplot(
    width = 0.18,
    alpha = 0.22,
    color = biostat_cols[["white"]],
    outliers = FALSE
  ) +
  ggplot2::scale_color_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_fill_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_x_discrete(labels = popisky_druhu) +
  ggplot2::labs(x = NULL, y = "Hmotnost těla (g)") +
  theme_biostat(base_size = 16) +
  ggview::canvas(width = 1500, height = 780, units = "px")

ggview::save_ggplot(
  plot = plot_species,
  file = here::here(path_materials, "body_mass_by_species.png")
)
```

```{r}
#| label: zobrazit-pozorovani-podle-druhu
#| echo: false
#| out-width: "80%"
#| fig-alt: "Stejné hmotnosti rozdělené do tří sloupců podle druhu: Adélie a Chinstrap leží podobně vysoko, Gentoo výrazně výše; uvnitř každého druhu se jedinci liší o stovky gramů."
include_local_figure("body_mass_by_species.png")
```

::: {.takeaway-strip .fragment .text-center}
Vidíme rozdíly mezi skupinami **i** variabilitu uvnitř skupin.
:::

::: {.notes}
Stejná data jako na předchozím snímku, jen s barvou druhu. Gentoo je zřetelně těžší; Adélie a Chinstrap jsou si podobné. Uvnitř druhu ale zůstává velký rozptyl jedinců.
:::

## Co by předpovídala nulová hypotéza?

<br>

::: {.panel-olive}
[Hlasování]{.panel-title}

Kdyby druh s hmotností nesouvisel, jaký vzorec bychom čekali?
:::

<br>

::: columns
::: {.column width="31%"}
::: {.card-indigo}
[A]{.card-title}

Stejný průměr, žádná variabilita.
:::
:::
::: {.column width="31%"}
::: {.card-indigo}
[B]{.card-title}

[Stejný průměr, variabilita zůstává.]{.rn-circle-orange}
:::
:::
::: {.column width="31%"}
::: {.card-indigo}
[C]{.card-title}

Jiný průměr pro každý druh.
:::
:::
:::

::: {.notes}
Hlasování rukou. Správně je B: nulová hypotéza tvrdí stejný průměr všech druhů, ale jedinci se pořád liší. A je častá chyba („bez rozdílů = žádná variabilita“). Kroužek přidám až po hlasování.
:::

## Průměr neříká celý příběh

```{r}
#| label: vytvorit-graf-prumeru-a-sd
#| include: false
prumery_druhu <-
  data_penguins |>
  dplyr::group_by(druh) |>
  dplyr::summarise(
    n = dplyr::n(),
    prumer = mean(hmotnost_tela_g),
    sd = sd(x = hmotnost_tela_g),
    .groups = "drop"
  )

plot_means_sd <-
  ggplot2::ggplot(
    data_penguins,
    ggplot2::aes(
      x = druh,
      y = hmotnost_tela_g,
      color = druh, 
      fill = druh
    )
  ) +
  ggplot2::geom_violin(
    alpha = 0.22,
    color = NA
  ) +
  ggbeeswarm::geom_quasirandom(
    width = 0.2,
    alpha = 0.24,
    size = 2.1
  ) +
  ggplot2::geom_errorbar(
    data = prumery_druhu,
    ggplot2::aes(
      x = druh,
      ymin = prumer - sd,
      ymax = prumer + sd
    ),
    width = 0.12,
    linewidth = 1.4,
    color = biostat_cols[["white"]],
    inherit.aes = FALSE
  ) +
  ggplot2::geom_point(
    data = prumery_druhu,
    ggplot2::aes(y = prumer),
    color = biostat_cols[["white"]],
    size = 5.5
  ) +
  ggplot2::scale_color_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_fill_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_x_discrete(labels = popisky_druhu) +
  ggplot2::labs(x = NULL, y = "Hmotnost těla (g)") +
  theme_biostat(base_size = 18) +
  ggview::canvas(width = 1500, height = 780, units = "px")

ggview::save_ggplot(
  plot = plot_means_sd,
  file = here::here(path_materials, "species_means_sd.png")
)
```

```{r}
#| label: zobrazit-graf-prumeru-a-sd
#| echo: false
#| out-width: "78%"
#| fig-alt: "Hmotnosti tří druhů s bílým bodem průměru a bílou úsečkou průměr plus minus jedna směrodatná odchylka u každého druhu."
include_local_figure("species_means_sd.png")
```

::: {.text-size-smaller .text-color-grey_olive .text-center}
Bílý bod: průměr druhu · bílá úsečka: průměr ± 1 SD
:::

::: {.takeaway-strip}
Rozdíl průměrů hodnotíme vůči variabilitě jednotlivých pozorování.
:::

::: {.notes}
Bílé body jsou průměry, bílé úsečky průměr plus minus jedna směrodatná odchylka. Průměr sám neříká, jak moc se jedinci překrývají.
:::

# Rozdíl mezi dvěma skupinami

## Dvě vzdálenosti na jedné kře

```{r}
#| label: zobrazit-ledove-kry
#| echo: false
#| out-width: "88%"
#| fig-alt: "Dvě skupiny tučňáků na ledových krách: jedna stojí těsně u sebe, druhá je rozptýlená kolem svého praporku. Ilustrace vytvořená pomocí AI."
include_local_figure("ice_floe_laboratory.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::

::: columns
::: {.column width="48%"}
[**uvnitř skupin**]{.text-hgl-orange}: jak daleko jsou jedinci od vlastního průměru
:::
::: {.column width="48%"}
[**mezi skupinami**]{.text-hgl-indigo_velvet}: jak daleko jsou skupinové průměry od sebe
:::
:::

::: {.notes}
Metafora: praporek je průměr skupiny. Vzdálenost tučňáka od vlastního praporku je variabilita uvnitř skupiny, vzdálenost praporků od sebe je rozdíl mezi skupinami. Obě vzdálenosti budeme později měřit součty čtverců.
:::

## Stejný rozdíl průměrů, jiný vnitřní rozptyl

```{r}
#| label: vytvorit-scenare-stejneho-rozdilu
#| include: false
# Teaching inputs of a constructed thought experiment; the written materials
#   use the identical generator. Groups A and B are abstract, so they use the
#   _brand categorical palette (teal, terracotta), not semantic colours.
z_pattern <- as.numeric(scale(seq(-1, 1, length.out = 10)))
rozdil_myslenkovy_pokus <- 1000
barvy_skupin_ab <- c("A" = "#4E9A8A", "B" = "#C2613A")

fixed_gap <-
  tidyr::crossing(
    sd = c(250, 500, 1000),
    skupina = c("A", "B"),
    i = seq_along(z_pattern)
  ) |>
  dplyr::mutate(
    prumer = ifelse(skupina == "A", 3500, 3500 + rozdil_myslenkovy_pokus),
    hodnota = prumer + sd * z_pattern[i],
    scenar = factor(
      paste0("SD = ", format_cz(sd, 0), " g"),
      levels = paste0("SD = ", format_cz(c(250, 500, 1000), 0), " g")
    )
  )

plot_fixed_gap <-
  ggplot2::ggplot(
    fixed_gap,
    ggplot2::aes(x = skupina, y = hodnota, color = skupina)
  ) +
  ggbeeswarm::geom_quasirandom(width = 0.12, size = 3, alpha = 0.75) +
  ggplot2::stat_summary(fun = mean, geom = "crossbar", width = 0.55, linewidth = 1.1) +
  ggplot2::facet_wrap(~ scenar, nrow = 1) +
  ggplot2::scale_color_manual(
    values = barvy_skupin_ab,
    guide = "none"
  ) +
  ggplot2::scale_y_continuous(limits = c(1800, 6200), breaks = seq(2000, 6000, 1000)) +
  ggplot2::labs(x = NULL, y = "Ilustrační hmotnost (g)") +
  theme_biostat(base_size = 15) +
  ggview::canvas(width = 1600, height = 690, units = "px")

ggview::save_ggplot(
  plot = plot_fixed_gap,
  file = here::here(path_materials, "fixed_gap_varying_sd.png")
)
```

::: {.panel-olive}
[Odhad bez počítání]{.panel-title}

Dvě vymyšlené skupiny A a B. Rozdíl průměrů je vždy **`r format_cz(rozdil_myslenkovy_pokus, 0)` g**. Ve kterém panelu máme největší šanci zamítnout nulovou hypotézu?
:::

```{r}
#| label: zobrazit-scenare-stejneho-rozdilu
#| echo: false
#| out-width: "94%"
#| fig-alt: "Tři panely se dvěma skupinami bodů A a B se stejným rozdílem průměrů; zleva doprava roste směrodatná odchylka uvnitř skupin a skupiny se stále více překrývají."
include_local_figure("fixed_gap_varying_sd.png")
```

::: {.notes}
Myšlenkový pokus, ne data tučňáků. Správně je levý panel: stejný rozdíl průměrů, ale nejmenší variabilita uvnitř skupin. Vpravo se skupiny překrývají natolik, že by rozdíl mohl snadno vzniknout i náhodou.
:::

# Lineární model

## Jak jsme minule zapisovali numerický prediktor?

<br>

::: {.text-size-larger .text-center}
$$
\begin{aligned}
\text{odhadnutá hodnota }(\widehat{y}_i)
={}& \text{intercept }(\widehat{\beta}_0) \\
&+ \text{sklon }(\widehat{\beta}_1)
\times \text{numerický prediktor }(x_i)
\end{aligned}
$$
:::

::: {.text-size-smaller .text-color-grey_olive .text-center}
V lekci o lineárním modelu jsme stejné koeficienty psali jako $a$ a $b$: $\widehat{\beta}_0 = a$, $\widehat{\beta}_1 = b$.
:::

<br>

::: columns
::: {.column width="48%" .fragment}
::: {.panel-result}
[Když $x=0$]{.panel-title}

$\widehat{y}=\widehat{\beta}_0$
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-question}
[Když $x=1$]{.panel-title}

$\widehat{y}=\widehat{\beta}_0+\widehat{\beta}_1$
:::
:::
:::

<br>

::: {.fragment .takeaway-strip .text-center}
Co když 0 a 1 nejsou naměřená čísla, ale „přepínač“ (vypnout / zapnout)?
:::

::: {.notes}
Připomenutí z lekcí o lineárním modelu a testování. Callback: dříve jsme psali a a b, od lekce o testování používáme beta se stříškou. Při x = 0 zbývá intercept, při x = 1 intercept plus sklon. Tohle je klíč k přepínači.
:::

## Jak dostaneme druh do rovnice?

<br>

::: {.panel-olive}
[Diskuze ve dvojici — 90 sekund]{.panel-title}

Jak by se dal „přepínač“ (0/1) nastavit, aby vybral mezi dvěma druhy?
:::

<br>

::: {.fragment}
| Druh | Přepínač „je Gentoo?“ |
|:--|--:|
| Adélie | 0 |
| Gentoo | 1 |
:::

::: {.notes}
Dvojice 90 sekund. Pak vyvolám dva tři nápady. Přepínač je binární proměnná: 0 pro Adélie, 1 pro Gentoo. Není to nové měření ani pořadí druhů.
:::

## Nula nechá průměr Adélie, jednička přičte rozdíl

```{r}
#| label: pripravit-hodnoty-dvou-skupin
#| include: false
mean_adelie <-
  prumery_druhu |>
  dplyr::filter(druh == "Adelie") |>
  dplyr::pull(prumer)

mean_gentoo <-
  prumery_druhu |>
  dplyr::filter(druh == "Gentoo") |>
  dplyr::pull(prumer)

difference_gentoo_adelie <- mean_gentoo - mean_adelie


```

::: {.text-size-larger .text-center}
$$
\begin{aligned}
\text{odhadnutá hmotnost}
={}& \text{průměr Adélie} \\
&+ \text{přepínač „je Gentoo?“} \\
&\quad \times \text{rozdíl Gentoo minus Adélie}
\end{aligned}
$$
:::

::: {.text-size-smaller .text-color-grey_olive .text-center .fragment}
Průměr Adélie: `r format_whole_number(mean_adelie)` g · Průměr Gentoo: `r format_whole_number(mean_gentoo)` g · Rozdíl Gentoo − Adélie: `r format_whole_number(difference_gentoo_adelie)` g
:::

::: columns
::: {.column width="48%" .fragment}
::: {.card-indigo}
[Adélie: přepínač 0]{.card-title}

$$
`r format_whole_number_for_math(mean_adelie)`\ \mathrm{g}
+ 0 \times `r format_whole_number_for_math(difference_gentoo_adelie)`\ \mathrm{g}
= `r format_whole_number_for_math(mean_adelie)`\ \mathrm{g}
$$
:::
:::

::: {.column width="48%" .fragment}
::: {.card-indigo}
[Gentoo: přepínač 1]{.card-title}

$$
`r format_whole_number_for_math(mean_adelie)`\ \mathrm{g}
+ 1 \times `r format_whole_number_for_math(difference_gentoo_adelie)`\ \mathrm{g}
= `r format_whole_number_for_math(mean_gentoo)`\ \mathrm{g}
$$
:::
:::

:::

::: {.takeaway-strip .text-center .fragment}
Nula rozdíl vypne. Jednička ho zapne.
:::

::: {.notes}
Slovní rovnice, pak dosazení skutečných průměrů. Obě karty jsou fialové, protože obě ukazují odhad modelu; barvy druhů zůstávají v grafech.
:::

## Jedna rovnice popíše oba druhy

<br>

::: {.text-size-larger .text-center}
$$
\widehat{y}_i = \widehat{\beta}_0 + \widehat{\beta}_1 x_i
$$
:::

<br>

| Symbol | Význam v našich datech |
|---|---|
| $\widehat{y}_i$ | odhadnutá hmotnost tučňáka $i$ |
| $\widehat{\beta}_0$ | průměr referenčního druhu Adélie |
| $\widehat{\beta}_1$ | rozdíl Gentoo minus Adélie |
| $x_i$ | přepínač: 0 pro Adélie, 1 pro Gentoo |


::: {.fragment .text-center}
**Stejná rovnice jako pro numerický prediktor, jen interpretace koeficientů se liší.**
:::

::: {.notes}
Teprve tady přicházejí symboly; každý symbol má v tabulce význam v datech tučňáků.
:::

## Referenční druh

```{r}
#| label: zobrazit-modelovy-pas
#| echo: false
#| out-width: "86%"
#| fig-alt: "Tři tučňáci u registračního místa; jeden představuje referenční skupinu a cesty k ostatním znázorňují rozdíly vůči ní. Ilustrace vytvořená pomocí AI."
include_local_figure("penguin_model_passport.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::

::: {.takeaway-strip .text-center}
Model zapisuje jednu skupinu (druh) přímo a ostatní jako rozdíly vůči ní.
:::

::: {.notes}
Metafora „modelového pasu“: referenční druh má hodnotu zapsanou přímo, ostatní druhy jen jako cestu od něj. Kterou skupinu R zvolí, ukáže další snímek.
:::

## Která skupina je referenční?

<br>

```{r}
#| label: zkontrolovat-urovne-faktoru
#| echo: true
#| eval: true
# Ponecháme dva druhy a odstraníme nevyužitou úroveň Chinstrap
data_penguins_two <-
  data_penguins[data_penguins$druh %in% c("Adelie", "Gentoo"), ]
data_penguins_two$druh <- droplevels(data_penguins_two$druh)

# První úroveň faktoru je reference
levels(x = data_penguins_two$druh)
```

<br>

::: columns
::: {.column width="48%" .fragment}
::: {.panel-result}
[První úroveň]{.panel-title}

`Adelie` je reference.
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-note}
[Výsledek]{.panel-title}

R vytvoří koeficient `druhGentoo`.
:::
:::
:::

<br>

::: {.fragment .takeaway-strip}
Pořadí úrovní faktoru je součást interpretace modelu.
:::

::: {.notes}
R bere jako referenci první úroveň faktoru. Pořadí jsme nastavili při přípravě dat, takže je to Adélie a druhý koeficient se jmenuje druhGentoo.
:::

## Stejná funkce `lm()`, nový prediktor

<br>

```{r}
#| label: fitovat-model-dvou-skupin-viditelne
#| echo: true
#| eval: true
# Stejná formule jako u přímky, jen prediktorem je druh
mod_dva <-
  lm(
    formula = hmotnost_tela_g ~ druh,
    data = data_penguins_two
  )

# Intercept a rozdíl Gentoo minus Adélie
coef(object = mod_dva)
```

::: {.notes}
Kód je stejný jako u přímky. Výstup má dva řádky: (Intercept) a druhGentoo. Než je přečteme, nechám studenty odhadnout, co každé číslo znamená.
:::


## Dva koeficienty

```{r}
#| label: pripravit-koeficienty-dvou-skupin
#| include: false
model_dva_tidy <-
  broom::tidy(
    mod_dva,
    conf.int = TRUE
  )

coef_dva <-
  setNames(
    model_dva_tidy$estimate,
    model_dva_tidy$term
  )

tabulka_koeficientu_dva <-
  model_dva_tidy |>
  dplyr::transmute(
    Parametr = dplyr::recode(
      term,
      "(Intercept)" = "Průměr Adélie",
      "druhGentoo" = "Gentoo − Adélie"
    ),
    Odhad = format_whole_number(estimate),
    Jednotka = "g"
  )

stopifnot(
  isTRUE(all.equal(
    unname(model_dva_tidy$estimate),
    unname(coef(mod_dva))
  ))
)
```

<br>

```{r}
#| label: zobrazit-tabulku-koeficientu-dvou-skupin
#| echo: false
tinytable::tt(tabulka_koeficientu_dva)
```

<br>

::: columns
::: {.column width="48%" .fragment}
::: {.card-indigo}
[`(Intercept)`]{.card-title}

`r format_whole_number(coef_dva[["(Intercept)"]])` g

Průměrná hmotnost druhu **Adélie**.
:::
:::
::: {.column width="48%" .fragment}
::: {.card-indigo}
[`druhGentoo`]{.card-title}

+`r format_whole_number(coef_dva[["druhGentoo"]])` g

Rozdíl **Gentoo − Adélie**.
:::
:::
:::

<br>

::: {.takeaway-strip .fragment .text-center}
Gentoo: `r format_whole_number(coef_dva[["(Intercept)"]] + coef_dva[["druhGentoo"]])` g = reference + rozdíl.
:::

::: {.notes}
Intercept je průměr Adélie, druhGentoo rozdíl Gentoo minus Adélie. Součet dává průměr Gentoo.
:::

## Reference není „nejdůležitější“ skupina

<br>

::: {.panel-olive}
[Hlasování]{.panel-title}

Změníme referenci z Adélie na Gentoo. Co se musí změnit?
:::

<br>

::: columns
::: {.column width="31%"}
::: {.card-indigo}
[A]{.card-title}

Odhadnuté hodnoty (průměry druhů).
:::
:::
::: {.column width="31%"}
::: {.card-indigo}
[B]{.card-title}

[Hodnota interceptu a název i znaménko rozdílu.]{.rn-circle-orange}
:::
:::
::: {.column width="31%"}
::: {.card-indigo}
[C]{.card-title}

Residua.
:::
:::
:::

<br>

::: {.fragment .takeaway-strip}
Reference mění souřadný systém popisu — ne data ani odhadnuté hodnoty modelu.
:::

::: {.notes}
Hlasování rukou, pak přesvědčit souseda. Správně B: intercept se stane průměrem Gentoo a rozdíl se změní na Adélie minus Gentoo se záporným znaménkem. Odhadnuté průměry i residua zůstanou stejné.
:::

## U kontrolních studií je reference zásadní

<br>

| Skupina | Koeficient | Význam |
|---|:---:|---|
| **kontrola** | $\widehat{\beta}_0$ | průměr kontroly |
| **lék A** | $\widehat{\beta}_1$ | A − kontrola |
| **lék B** | $\widehat{\beta}_2$ | B − kontrola |

<br>

::: {.text-center}
**Je-li kontrola referencí, každý koeficient odpovídá přirozené otázce „oproti kontrole“.**
:::

::: {.notes}
Příklad mimo tučňáky: pokus s kontrolou a dvěma léky. Volba reference je volba čitelnosti, ne nová analýza.
:::

## Ale reference nevytváří kontrolu

<br>

::: {.panel-warning}
[Pozor na interpretaci]{.panel-title}

Příkaz `relevel()` pouze změní, kterou skupinu model používá jako výchozí.

Nevytváří randomizaci, kontrolní podmínky ani kauzální důkaz.
:::

```{r}
#| label: zmenit-referenci-viditelne
#| echo: true
#| eval: false
data_pokus <-
  data.frame(
    skupina = factor(c("kontrola", "lék A", "lék B"))
  )

data_pokus$skupina <-
  relevel(
    x = data_pokus$skupina,
    ref = "kontrola"
  )
```

::: {.takeaway-strip .fragment}
Kontrolní skupinu vytváří design studie. Reference pouze zpřehlední otázku.
:::

::: {.notes}
Kód je jen ukázka na vymyšlené tabulce; relevel() zvolí referenční úroveň. Kauzální závěr dává randomizace, ne volba reference.
:::

## Každý tučňák dostane průměr svého druhu

```{r}
#| label: vytvorit-fit-dvou-skupin
#| include: false
data_two_plot <-
  data_penguins_two |>
  dplyr::mutate(
    x = ifelse(druh == "Adelie", 0, 1),
    fitted = fitted(object = mod_dva)
  )

plot_two_fit <-
  ggplot2::ggplot(
    data_two_plot,
    ggplot2::aes(x = x, y = hmotnost_tela_g, color = druh)
  ) +
  ggbeeswarm::geom_quasirandom(width = 0.12, alpha = 0.34, size = 2.2) +
  ggplot2::geom_segment(
    data = data.frame(
      x = c(-0.2, 0.8), xend = c(0.2, 1.2),
      y = c(coef_dva[[1]], sum(coef_dva)),
      yend = c(coef_dva[[1]], sum(coef_dva)),
      druh = factor(c("Adelie", "Gentoo"), levels = levels(data_penguins_two$druh))
    ),
    ggplot2::aes(x = x, xend = xend, y = y, yend = yend, color = druh),
    linewidth = 2,
    inherit.aes = FALSE
  ) +
  ggplot2::scale_color_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_x_continuous(
    breaks = c(0, 1),
    labels = c("Adélie (0)", "Gentoo (1)"),
    limits = c(-0.35, 1.35)
  ) +
  ggplot2::labs(x = NULL, y = "Hmotnost (g)") +
  theme_biostat(base_size = 18) +
  ggview::canvas(width = 1500, height = 760, units = "px")

ggview::save_ggplot(
  plot = plot_two_fit,
  file = here::here(path_materials, "two_group_fitted_means.png")
)
```

```{r}
#| label: zobrazit-fit-dvou-skupin
#| echo: false
#| out-width: "75%"
#| fig-alt: "Body hmotností Adélie nad hodnotou 0 a Gentoo nad hodnotou 1, každá skupina s vodorovnou úsečkou svého průměru."
include_local_figure("two_group_fitted_means.png")
```

::: {.takeaway-strip}
Odhadnutá hodnota každého tučňáka je průměr jeho druhu.
:::

::: {.notes}
U přímky měl každý tučňák vlastní bod na přímce. Tady existují jen dvě odhadnuté hodnoty: průměr Adélie a průměr Gentoo.
:::

## Residuum je stále vzdálenost od odhadu

```{r}
#| label: vytvorit-graf-residui
#| include: false
pocet_ukazkovych_tucnaku <- 18

set.seed(900723)
data_residual_plot <-
  data_two_plot |>
  dplyr::group_by(druh) |>
  dplyr::slice_sample(n = pocet_ukazkovych_tucnaku) |>
  dplyr::ungroup() |>
  dplyr::mutate(
    xj = x + runif(
      n = dplyr::n(),
      min = -0.12,
      max = 0.12
    )
  )

plot_residuals <-
  ggplot2::ggplot(data_residual_plot) +
  ggplot2::geom_segment(
    ggplot2::aes(
      x = xj, xend = xj,
      y = fitted, yend = hmotnost_tela_g,
      color = druh
    ),
    alpha = 0.5,
    linewidth = 0.7
  ) +
  ggplot2::geom_point(
    ggplot2::aes(x = xj, y = hmotnost_tela_g, color = druh),
    size = 2.8
  ) +
  ggplot2::geom_segment(
    data = data.frame(
      x = c(-0.2, 0.8), xend = c(0.2, 1.2),
      y = c(coef_dva[[1]], sum(coef_dva)),
      yend = c(coef_dva[[1]], sum(coef_dva)),
      druh = factor(c("Adelie", "Gentoo"), levels = levels(data_penguins_two$druh))
    ),
    ggplot2::aes(x = x, xend = xend, y = y, yend = yend, color = druh),
    linewidth = 2,
    inherit.aes = FALSE
  ) +
  ggplot2::scale_color_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_x_continuous(
    breaks = c(0, 1), labels = c("Adélie", "Gentoo"), limits = c(-0.35, 1.35)
  ) +
  ggplot2::labs(x = NULL, y = "Hmotnost těla (g)") +
  theme_biostat(base_size = 18) +
  ggview::canvas(width = 1500, height = 760, units = "px")

ggview::save_ggplot(
  plot = plot_residuals,
  file = here::here(path_materials, "two_group_residuals.png")
)
```

```{r}
#| label: zobrazit-graf-residui
#| echo: false
#| out-width: "79%"
#| fig-alt: "Několik tučňáků každého druhu se svislými úsečkami od bodu k průměru jeho druhu; úsečky jsou residua."
include_local_figure("two_group_residuals.png")
```

::: {.text-size-smaller .text-color-grey_olive .text-center}
Pro přehlednost `r pocet_ukazkovych_tucnaku` náhodně vybraných tučňáků z každého druhu.
:::

::: {.takeaway-strip}
Jiný tvar prediktoru, stejná definice residua.
:::

::: {.notes}
Residuum je naměřená hmotnost minus průměr druhu. Kladné residuum: tučňák těžší než průměr svého druhu.
:::

## Jak přesně jsme odhadli rozdíl?

```{r}
#| label: vytvorit-interval-dvou-skupin
#| include: false
radek_rozdilu_dva <-
  model_dva_tidy |>
  dplyr::filter(term == "druhGentoo")

ci_dva <-
  c(
    radek_rozdilu_dva$conf.low,
    radek_rozdilu_dva$conf.high
  )
ci_plot_data <- data.frame(
  odhad = coef_dva[["druhGentoo"]],
  dolni = ci_dva[[1]],
  horni = ci_dva[[2]],
  srovnani = "Gentoo − Adélie"
)

plot_two_ci <-
  ggplot2::ggplot(
    ci_plot_data,
    ggplot2::aes(y = srovnani, x = odhad, xmin = dolni, xmax = horni)
  ) +
  ggplot2::geom_vline(xintercept = 0, linetype = "dashed", color = biostat_cols[["grey_olive"]]) +
  ggplot2::geom_errorbarh(height = 0.18, linewidth = 2.6, color = biostat_cols[["orange"]]) +
  ggplot2::geom_point(size = 3.5, color = biostat_cols[["indigo_velvet"]]) +
  ggplot2::labs(x = "Rozdíl hmotnosti (g)", y = NULL) +
  ggplot2::scale_x_continuous(
    limits = c(-100, 1650),
    breaks = c(0, 750, 1500)
  ) +
  theme_biostat(base_size = 20) +
  ggview::canvas(width = 1500, height = 560, units = "px")

ggview::save_ggplot(
  plot = plot_two_ci,
  file = here::here(path_materials, "two_group_difference_ci.png")
)
```

```{r}
#| label: zobrazit-interval-dvou-skupin
#| echo: false
#| out-width: "85%"
#| fig-alt: "Fialový bod odhadu rozdílu Gentoo minus Adélie s oranžovou úsečkou 95% intervalu spolehlivosti; celý interval leží daleko vpravo od čárkované nuly."
include_local_figure("two_group_difference_ci.png")
```

::: {.text-size-larger .text-center}
Odhad: [**+`r format_whole_number(coef_dva[["druhGentoo"]])` g**]{.text-hgl-indigo_velvet}

95% CI: [`r format_whole_number(ci_dva[[1]])` až `r format_whole_number(ci_dva[[2]])` g]{.text-hgl-orange}
:::

::: {.notes}
Stejně jako v předchozích lekcích: nejdřív velikost efektu v gramech, pak nejistota. Interval je daleko od nuly a také ukazuje, jak velké rozdíly jsou s daty slučitelné.
:::

## Je rozdíl slučitelný s nulou?

```{r}
#| label: pripravit-t-statistiku
#| include: false
t_dva <-
  radek_rozdilu_dva |>
  dplyr::pull(statistic)

se_dva <-
  radek_rozdilu_dva |>
  dplyr::pull(std.error)
```

::: {.text-center}
$H_0$: průměr Gentoo − průměr Adélie = 0 g ($\beta_1 = 0$)

$H_A$: průměr Gentoo − průměr Adélie ≠ 0 g ($\beta_1 \neq 0$)
:::

<br>

::: {.panel-result .fragment}
[$t$-statistika: vzdálenost od nuly ve standardních chybách]{.panel-title}

$$
t = \frac{\text{odhad rozdílu} - 0}{\text{standardní chyba rozdílu}}
= \frac{`r format_whole_number_for_math(coef_dva[["druhGentoo"]])` - 0}{`r format_cz_math(se_dva, 1)`}
= `r format_cz_math(t_dva, 2)`
$$
:::

<br>

::: {.takeaway-strip .fragment}
Pro dvě skupiny dává tento model stejnou testovou otázku jako klasický dvouvýběrový t-test se společným rozptylem.
:::

::: {.notes}
Stejný postup jako u sklonu v předchozí lekci: odhad minus nulová hodnota, děleno standardní chybou. Rozdíl je vzdálený od nuly asi tolik standardních chyb, kolik ukazuje t. Klasický název tohoto testu je dvouvýběrový t-test; R ho spočítá i funkcí t.test(var.equal = TRUE).
:::

## Kde leží naše $t$ v nulovém rozdělení?

```{r}
#| label: vytvorit-ukazku-t-rozdeleni
#| include: false
df_t <- df.residual(object = mod_dva)
p_dva <- 2 * stats::pt(q = -abs(t_dva), df = df_t)
p_label_t <- format.pval(p_dva, digits = 2, eps = 0.001)
p_label_t <- gsub(pattern = "\\.", replacement = ",", x = p_label_t)
t_limit_observed <- ceiling(abs(t_dva) * 1.08)

t_distribution <-
  dplyr::bind_rows(
    data.frame(
      panel = "Tvar nulového t-rozdělení",
      t = seq(-4.5, 4.5, length.out = 1000)
    ),
    data.frame(
      panel = "Pozorované t na celé ose",
      t = seq(-t_limit_observed, t_limit_observed, length.out = 1800)
    )
  ) |>
  dplyr::mutate(
    panel = factor(
      panel,
      levels = c(
        "Tvar nulového t-rozdělení",
        "Pozorované t na celé ose"
      )
    ),
    hustota = stats::dt(x = t, df = df_t),
    ocas = ifelse(
      panel == "Pozorované t na celé ose" & abs(t) >= abs(t_dva),
      "p-hodnota",
      "střed"
    ),
    strana_ocasu = ifelse(t < 0, "levý ocas", "pravý ocas")
  )

t_lines <- data.frame(
  panel = factor(
    rep("Pozorované t na celé ose", 2),
    levels = levels(t_distribution$panel)
  ),
  x = c(-abs(t_dva), abs(t_dva))
)

t_annotations <- data.frame(
  panel = factor(
    c("Tvar nulového t-rozdělení", "Pozorované t na celé ose"),
    levels = levels(t_distribution$panel)
  ),
  x = c(-4.4, -t_limit_observed * 0.97),
  y = c(0.38, 0.32),
  label = c(
    "nulové rozdělení\nkolem 0",
    paste0(
      "pozorované |t| = ",
      format(round(abs(t_dva), 2), decimal.mark = ","),
      "\np ",
      p_label_t
    )
  )
)

plot_t_distribution <-
  ggplot2::ggplot(t_distribution, ggplot2::aes(x = t, y = hustota)) +
  ggplot2::geom_area(
    data = dplyr::filter(t_distribution, ocas == "p-hodnota"),
    ggplot2::aes(fill = ocas, group = strana_ocasu),
    alpha = 0.68
  ) +
  ggplot2::geom_line(linewidth = 1.2, color = biostat_cols[["graphite"]]) +
  ggplot2::geom_vline(
    data = t_lines,
    ggplot2::aes(xintercept = x),
    color = biostat_cols[["orange"]],
    linewidth = 1.25,
    linetype = "dashed"
  ) +
  ggplot2::geom_label(
    # The left panel title already names the null distribution; only the
    #   observed t is annotated, away from the curve.
    data = t_annotations[2, ],
    ggplot2::aes(x = x, y = y, label = label),
    inherit.aes = FALSE,
    hjust = 0,
    size = 4.8,
    label.size = 0,
    fill = "white",
    color = biostat_cols[["graphite"]]
  ) +
  ggplot2::facet_wrap(~ panel, scales = "free_x", nrow = 1) +
  ggplot2::scale_fill_manual(
    values = c("p-hodnota" = biostat_cols[["orange"]]),
    guide = "none"
  ) +
  ggplot2::scale_y_continuous(limits = c(0, 0.42), breaks = NULL) +
  ggplot2::labs(x = "Hodnota t při platnosti nulové hypotézy", y = NULL) +
  theme_biostat(base_size = 16) +
  ggview::canvas(width = 1600, height = 700, units = "px")

ggview::save_ggplot(
  plot = plot_t_distribution,
  file = here::here(path_materials, "t_distribution_showcase.png")
)
```

```{r}
#| label: zobrazit-ukazku-t-rozdeleni
#| echo: false
#| out-width: "92%"
#| fig-alt: "Dva panely t-rozdělení: vlevo zvonovitá křivka kolem nuly, vpravo stejná křivka na široké ose s oranžovými čárkovanými čarami pozorovaného t a jeho zrcadlové hodnoty daleko v obou ocasech."
include_local_figure("t_distribution_showcase.png")
```

::: {.takeaway-strip}
$p$-hodnota `r p_label_t` je plocha v obou ocasech ještě dál od nuly než pozorované $t$.
:::

::: {.notes}
Levý panel ukazuje tvar nulového t-rozdělení, pravý panel umístí naše t na celou osu. Plocha za ním je tak malá, že ji nevidíme.
:::

## Rozdíl, nejistota a test v jedné tabulce

```{r}
#| label: zobrazit-testovou-tabulku-dvou-skupin
#| echo: false
tabulka_testu_dva <-
  model_dva_tidy |>
  dplyr::filter(term == "druhGentoo") |>
  dplyr::transmute(
    Srovnání = "Gentoo − Adélie",
    `Odhad (g)` = format_whole_number(estimate),
    `Std. chyba (g)` = formatC(std.error, format = "f", digits = 1, decimal.mark = ","),
    `t` = formatC(statistic, format = "f", digits = 2, decimal.mark = ","),
    `p` = gsub(
      pattern = ".",
      replacement = ",",
      x = format.pval(p.value, digits = 2, eps = 0.001),
      fixed = TRUE
    )
  )

tinytable::tt(tabulka_testu_dva)
```

::: {.takeaway-strip}
Odhad rozdílu čteme spolu s jeho nejistotou a důkazem proti nulové hypotéze.
:::

::: {.notes}
Celý řádek druhGentoo z výstupu modelu v jedné tabulce: odhad, standardní chyba, t a p.
:::

## Co můžeme říci biologicky?

<br>

::: {.panel-olive}
[Řekněte sousedovi jednou větou]{.panel-title}

Co tento výsledek znamená pro tučňáky? Začněte gramy, ne p-hodnotou.
:::

<br>

::: {.panel-result .fragment}
[Výsledek]{.panel-title}

V tomto souboru jsou tučňáci Gentoo v průměru o přibližně [**`r format_whole_number(coef_dva[["druhGentoo"]])` g těžší**]{.text-hgl-indigo_velvet} než tučňáci Adélie (95% CI `r format_whole_number(ci_dva[[1]])` až `r format_whole_number(ci_dva[[2]])` g).
:::

<br>

::: {.fragment .panel-warning}
[Rozsah závěru]{.panel-title}

Jde o asociaci v pozorovaných datech.
:::

::: {.notes}
Krátké sdílení ve dvojicích, pak odhalím vzorovou větu. Pořadí: rozdíl v gramech, interval, teprve potom test a omezení.
:::

# Více skupin

## Co se stane, když přidáme třetí druh?

<br>

::: {.panel-olive}
[Předpověď]{.panel-title}

Kolik koeficientů potřebujeme pro tři skupinové průměry?
:::

<br>

::: columns
::: {.column width="31%"}
::: {.card-indigo}
[A]{.card-title}

Jeden
:::
:::
::: {.column width="31%"}
::: {.card-indigo}
[B]{.card-title}

Dva
:::
:::
::: {.column width="31%"}
::: {.card-indigo}
[C]{.card-title}

[Tři]{.rn-circle-orange}
:::
:::
:::

<br>

::: {.fragment .text-center}
tři průměry = jeden referenční (intercept) + dva rozdíly
:::

::: {.notes}
Předpověď před výstupem. Častá odpověď B (dva) počítá jen přepínače. Správně C: intercept plus dva rozdílové koeficienty.
:::

## Tři druhy, tři průměry

```{r}
#| label: vytvorit-prumery-tri-skupin
#| include: false
plot_three_means <-
  ggplot2::ggplot(
    data_penguins,
    ggplot2::aes(x = druh, y = hmotnost_tela_g, color = druh)
  ) +
  ggbeeswarm::geom_quasirandom(width = 0.2, alpha = 0.28, size = 2.1) +
  ggplot2::geom_point(
    data = prumery_druhu,
    ggplot2::aes(y = prumer),
    size = 6,
    color = biostat_cols[["white"]],
  ) +
  ggplot2::scale_color_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_x_discrete(labels = popisky_druhu) +
  ggplot2::labs(x = NULL, y = "Hmotnost těla (g)") +
  theme_biostat(base_size = 18) +
  ggview::canvas(width = 1500, height = 760, units = "px")

ggview::save_ggplot(
  plot = plot_three_means,
  file = here::here(path_materials, "three_species_means.png")
)
```

```{r}
#| label: zobrazit-prumery-tri-skupin
#| echo: false
#| out-width: "80%"
#| fig-alt: "Hmotnosti tří druhů s bílým bodem průměru: průměry Adélie a Chinstrap leží téměř stejně vysoko, průměr Gentoo výrazně výše."
include_local_figure("three_species_means.png")
```

::: {.takeaway-strip .fragment}
Adélie a Chinstrap mají podobné průměry; Gentoo je zřetelně výše.
:::

::: {.notes}
Stejný graf jako na začátku, teď s průměry. Tahle podobnost Adélie a Chinstrap bude důležitá u párových porovnání i v diagnostice.
:::

## Tři průměry potřebují dva přepínače

<br>

| Druh | Referenční průměr Adélie | Je Chinstrap?  | Je Gentoo? |
|---|:---:|:---:|:---:|
| Adélie | 1 | 0 | 0 |
| Chinstrap | 1 | 1 | 0 |
| Gentoo | 1 | 0 | 1 |

<br>

::: {.takeaway-strip}
Každý řádek říká, které rozdíly se mají přičíst k průměru Adélie.
:::

::: {.notes}
Referenční průměr dostává každý tučňák; přepínače zapínají rozdíl Chinstrap, nebo rozdíl Gentoo. Adélie má oba přepínače vypnuté.
:::

## Tři průměry potřebují dva přepínače

<br>
<br>

::: {.text-size-larger .text-center}
$$
\begin{aligned}
\text{odhadnutá hmotnost}
={}& \text{průměr Adélie} \\
&+ \text{přepínač Chinstrap}
\times \text{rozdíl Chinstrap minus Adélie} \\
&+ \text{přepínač Gentoo}
\times \text{rozdíl Gentoo minus Adélie}
\end{aligned}
$$
:::

::: {.notes}
Stejná slovní rovnice jako u dvou druhů, jen s jedním řádkem navíc.
:::

## Tři koeficienty z jednoho modelu

```{r}
#| label: fitovat-model-tri-skupin-viditelne
#| echo: true
#| eval: true
#| output: false
# Stejná formule jako u dvou druhů, jen na všech třech druzích
mod_tri <-
  lm(
    formula = hmotnost_tela_g ~ druh,
    data = data_penguins
  )
```

```{r}
#| label: pripravit-tabulku-koeficientu-tri-skupin
#| include: false
model_tri_tidy <-
  broom::tidy(mod_tri)

coef_tri <-
  setNames(
    model_tri_tidy$estimate,
    model_tri_tidy$term
  )

tabulka_koeficientu_tri <-
  model_tri_tidy |>
  dplyr::transmute(
    Parametr = dplyr::recode(
      term,
      "(Intercept)" = "Průměr Adélie",
      "druhChinstrap" = "Chinstrap − Adélie",
      "druhGentoo" = "Gentoo − Adélie"
    ),
    Odhad = format_whole_number(estimate),
    Jednotka = "g"
  )

stopifnot(
  isTRUE(all.equal(
    unname(model_tri_tidy$estimate),
    unname(coef(mod_tri))
  ))
)
```

```{r}
#| label: zobrazit-tabulku-koeficientu-tri-skupin
#| echo: false
tinytable::tt(tabulka_koeficientu_tri)
```

::: {.takeaway-strip}
Jeden referenční průměr a dva rozdíly popisují všechny tři skupiny.
:::

::: {.notes}
Stejná formule lm(hmotnost_tela_g ~ druh), jen na všech třech druzích. Model zapisuje přímo jen srovnání s Adélie; rozdíl Gentoo minus Chinstrap v tabulce není.
:::

## Každý druh zapne jinou kombinaci

```{r}
#| label: pripravit-hodnoty-tri-skupin
#| include: false
mean_chinstrap <-
  coef_tri[["(Intercept)"]] + coef_tri[["druhChinstrap"]]

difference_chinstrap_adelie <-
  coef_tri[["druhChinstrap"]]
```

::: {.text-center}
**Základ:** průměr Adélie = `r format_whole_number(mean_adelie)` g

**Rozdíly:** Chinstrap − Adélie = `r format_whole_number(difference_chinstrap_adelie)` g;
Gentoo − Adélie = `r format_whole_number(difference_gentoo_adelie)` g
:::

::: {.card-indigo .fragment}
[Adélie]{.card-title}

`r format_whole_number(mean_adelie)` g + 0 × `r format_whole_number(difference_chinstrap_adelie)` g + 0 × `r format_whole_number(difference_gentoo_adelie)` g = **`r format_whole_number(mean_adelie)` g**
:::

::: {.card-indigo .fragment}
[Chinstrap]{.card-title}

`r format_whole_number(mean_adelie)` g + 1 × `r format_whole_number(difference_chinstrap_adelie)` g + 0 × `r format_whole_number(difference_gentoo_adelie)` g = **`r format_whole_number(mean_chinstrap)` g**
:::

::: {.card-indigo .fragment}
[Gentoo]{.card-title}

`r format_whole_number(mean_adelie)` g + 0 × `r format_whole_number(difference_chinstrap_adelie)` g + 1 × `r format_whole_number(difference_gentoo_adelie)` g = **`r format_whole_number(mean_gentoo)` g**
:::

::: {.notes}
Dosazení skutečných koeficientů. Všechny karty jsou fialové, protože ukazují odhady modelu.
:::

## Jedna rovnice popíše všechny tři druhy

<br>

::: {.text-center}
$$
\begin{aligned}
\text{odhadnutá hmotnost}
={}& \text{průměr Adélie} \\
&+ \text{přepínač Chinstrap}
\times \text{rozdíl Chinstrap minus Adélie} \\
&+ \text{přepínač Gentoo}
\times \text{rozdíl Gentoo minus Adélie}
\end{aligned}
$$
:::

<br>

::: {.text-size-larger .text-center .fragment}
$$
\widehat y_i = \widehat\beta_0
+ \widehat\beta_1 x_{\mathrm{Chinstrap},i}
+ \widehat\beta_2 x_{\mathrm{Gentoo},i}
$$
:::

<br>

::: {.panel-note .fragment}
$x_{\mathrm{Chinstrap},i}$ a $x_{\mathrm{Gentoo},i}$ jsou přepínače 0/1 pro tučňáka $i$. $\widehat\beta_0$ je průměr Adélie; $\widehat\beta_1$ a $\widehat\beta_2$ jsou rozdíly vůči Adélie.
:::

<br>

::: {.takeaway-strip .fragment}
Pro tři skupiny potřebujeme jeden referenční průměr a dva rozdílové přepínače.
:::

::: {.notes}
Obecný zápis až po dosazení. Symboly x jsou stejné přepínače jako v tabulce.
:::

## Sedí model k datům?

```{r}
#| label: vytvorit-diagnosticke-grafy
#| include: false
diag_data <-
  data_penguins |>
  dplyr::mutate(
    fitted = fitted(object = mod_tri),
    residual = residuals(object = mod_tri)
  )

prumery_tri <- prumery_druhu$prumer

plot_resid_fitted <-
  ggplot2::ggplot(
    diag_data,
    ggplot2::aes(x = fitted, y = residual, color = druh)
  ) +
  ggplot2::geom_hline(yintercept = 0, linetype = "dashed", color = biostat_cols[["graphite"]]) +
  ggplot2::geom_point(
    alpha = 0.45,
    size = 2.2,
    position = ggplot2::position_jitter(width = 15, height = 0, seed = 900723)
  ) +
  ggplot2::scale_color_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_x_continuous(
    breaks = round(range(prumery_tri), -2),
    labels = paste0("≈", format_cz(round(range(prumery_tri), -2), 0)),
    expand = ggplot2::expansion(mult = 0.15)
  ) +
  ggplot2::labs(x = "Odhad (g)", y = "Residuum (g)") +
  theme_biostat(base_size = 14) +
  ggplot2::theme(plot.margin = ggplot2::margin(18, 24, 12, 24))

plot_qq <-
  ggplot2::ggplot(diag_data, ggplot2::aes(sample = residual)) +
  ggplot2::stat_qq(alpha = 0.5, color = biostat_cols[["grey_olive"]], size = 2.2) +
  ggplot2::stat_qq_line(color = biostat_cols[["graphite"]]) +
  ggplot2::labs(x = "Teoretické kvantily", y = "Residua (g)") +
  theme_biostat(base_size = 14) +
  ggplot2::theme(plot.margin = ggplot2::margin(18, 24, 12, 24))

plot_diagnostics <-
  cowplot::plot_grid(
    plot_resid_fitted,
    plot_qq,
    labels = c("A", "B"),
    label_x = 0,
    hjust = -0.2,
    nrow = 1
  ) +
  ggview::canvas(width = 1600, height = 640, units = "px")

ggview::save_ggplot(
  plot = plot_diagnostics,
  file = here::here(path_materials, "model_diagnostics.png")
)
```

```{r}
#| label: zobrazit-diagnosticke-grafy
#| echo: false
#| out-width: "91%"
#| fig-alt: "Panel A: residua proti odhadnuté hmotnosti; body Adélie a Chinstrap tvoří společný svislý pás vlevo, body Gentoo pás vpravo, oba podobně široké kolem nuly. Panel B: Q–Q graf, body leží téměř na referenční přímce."
include_local_figure("model_diagnostics.png")
```

::: {.panel-question}
Vidíme systematický vzorec, extrémní bod nebo výrazně odlišný rozptyl skupin?
:::

::: {.takeaway-strip .fragment}
Pásy Adélie a Chinstrap splývají, protože se jejich průměry liší jen o `r format_whole_number(difference_chinstrap_adelie)` g. Šířka pásů je podobná a Q–Q body sledují přímku: model můžeme použít k testům.
:::

::: {.notes}
Diagnostika před testem, stejně jako u přímky. Svislé pásy jsou vlastnost modelu se skupinovými průměry, ne chyba. Pásy jsou jen dva, protože Adélie a Chinstrap mají skoro stejný průměr. Nezávislost z grafu nepoznáme; tu musíme zdůvodnit způsobem sběru dat.
:::

# Jedna otázka pro tři druhy

## Jedna otázka zůstala otevřená

::: {.text-size-larger .text-center .fragment}
Liší se [alespoň jeden skupinový průměr]{.text-hgl-indigo_velvet}
od ostatních?
:::

<br>

::: {.panel-question .fragment}
Nechceme zatím tři samostatné testy. Chceme jednu celkovou otázku.
:::

<br>

::: {.fragment .takeaway-strip .text-center}
Porovnáme model s jedním průměrem (nulový) a model se třemi průměry.
:::

::: {.panel-olive .fragment}
[Předpověď]{.panel-title}

Ve kterém modelu budou vzdálenosti tučňáků od průměru (residua) kratší? Stačí jakékoli zkrácení, nebo musí být velké?
:::

::: {.notes}
Návrat k úvodní otázce: liší se průměrná hmotnost mezi druhy? Koeficienty odpovídají jen na srovnání s Adélie, my chceme jednu celkovou odpověď.
:::

## Jeden nebo tři?

```{r}
#| label: zobrazit-krmne-praporky
#| echo: false
#| out-width: "90%"
#| fig-alt: "Tři skupiny tučňáků se nejprve orientují podle jednoho společného praporku a potom podle tří skupinových praporků. Ilustrace vytvořená pomocí AI."
include_local_figure("one_vs_three_feeding_flags.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::

::: columns
::: {.column width="48%"}
[**nulový model**]{.text-hgl-graphite}: jeden společný průměr
:::
::: {.column width="48%"}
[**skupinový model**]{.text-hgl-indigo_velvet}: jeden průměr pro každý druh
:::
:::



::: {.notes}
Metafora praporků: jeden společný praporek proti praporku pro každý druh. Residua se se třemi praporky vždy aspoň trochu zkrátí; otázka je, zda o hodně víc, než by zkrátila náhoda. To vede k součtům čtverců a F.
:::

## Rozdíly průměrů proti variabilitě uvnitř skupin

<br>

::: {.text-size-larger .text-center}
Testová statistika porovnává **variabilitu mezi skupinovými průměry**
s **variabilitou jedinců uvnitř skupin**.
:::

<br>

$$
\frac{\text{variabilita mezi skupinovými průměry}}{\text{variabilita jedinců uvnitř skupin}}
$$

::: {.text-center .text-color-grey_olive}
Čitatel roste, když se vzdalují průměry. Jmenovatel roste, když se více rozptylují jedinci.
:::

::: {.notes}
Slovní podoba poměru, který za chvíli spočítáme na malém příkladu. Jméno F-statistika zazní až po výpočtu.
:::

## Součty čtverců ve třech skupinách

```{r}
#| label: vytvorit-priklad-ss-tri-skupin
#| include: false
data_ss_three <-
  data.frame(
    druh = factor(
      rep(c("Adelie", "Chinstrap", "Gentoo"), each = 3),
      levels = c("Adelie", "Chinstrap", "Gentoo")
    ),
    hmotnost_g = c(
      3300, 3500, 4000,
      4000, 4500, 4700,
      4300, 5100, 5300
    ),
    posun_x = rep(c(-0.18, 0, 0.18), times = 3)
  ) |>
  dplyr::group_by(druh) |>
  dplyr::mutate(
    prumer_g = mean(hmotnost_g),
    residuum_g = hmotnost_g - prumer_g,
    ctverec_uvnitr_g2 = residuum_g^2,
    x = dplyr::cur_group_id() + posun_x
  ) |>
  dplyr::ungroup()

means_ss_three <-
  data_ss_three |>
  dplyr::summarise(
    prumer_g = dplyr::first(prumer_g),
    n = dplyr::n(),
    .by = druh
  ) |>
  dplyr::mutate(
    x = dplyr::row_number(),
    xmin = x - 0.30,
    xmax = x + 0.30
  )

ss_three_within <- sum(data_ss_three$ctverec_uvnitr_g2)

# Displayed arithmetic for each species, built from the same objects.
ss_three_by_species <-
  data_ss_three |>
  dplyr::summarise(
    vypocet = paste0(
      "(", vapply(residuum_g, format_whole_number_for_math, character(1)), ")^2",
      collapse = " + "
    ),
    ss = sum(ctverec_uvnitr_g2),
    .by = druh
  )

latex_ss_three_within <-
  paste0(
    paste0(
      "\\mathrm{SS}_{\\text{", popisky_druhu[as.character(ss_three_by_species$druh)], "}} &= ",
      ss_three_by_species$vypocet,
      " = ",
      vapply(ss_three_by_species$ss, format_whole_number_for_math, character(1)),
      " \\\\"
    ),
    collapse = "\n"
  )

latex_ss_three_within_total <-
  paste0(
    "\\mathrm{SS}_{\\text{uvnitř}} &= ",
    paste(
      vapply(ss_three_by_species$ss, format_whole_number_for_math, character(1)),
      collapse = " + "
    ),
    " \\\\\n&= ",
    format_whole_number_for_math(ss_three_within),
    "\\ \\mathrm{g}^2"
  )

plot_ss_three_within <-
  ggplot2::ggplot(data_ss_three) +
  ggplot2::geom_segment(
    ggplot2::aes(
      x = x, xend = x,
      y = prumer_g, yend = hmotnost_g
    ),
    color = biostat_cols[["orange"]],
    linewidth = 1.4
  ) +
  ggplot2::geom_segment(
    data = means_ss_three,
    ggplot2::aes(
      x = xmin, xend = xmax,
      y = prumer_g, yend = prumer_g,
      color = druh
    ),
    linewidth = 3,
    inherit.aes = FALSE
  ) +
  ggplot2::geom_point(
    ggplot2::aes(x = x, y = hmotnost_g, fill = druh),
    shape = 21,
    size = 4.8,
    stroke = 1.4,
    color = "white"
  ) +
  ggplot2::scale_color_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_fill_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_x_continuous(
    breaks = 1:3,
    labels = unname(popisky_druhu),
    limits = c(0.55, 3.45)
  ) +
  ggplot2::scale_y_continuous(
    breaks = seq(3400, 5200, 400),
    limits = c(3150, 5350)
  ) +
  ggplot2::labs(x = NULL, y = "Ilustrační hmotnost (g)") +
  theme_biostat(base_size = 15) +
  ggview::canvas(width = 1300, height = 820, units = "px")

ggview::save_ggplot(
  plot = plot_ss_three_within,
  file = here::here(path_materials, "ss_three_within.png")
)
```

::: {.text-size-larger .text-center}
$$
\begin{aligned}
\text{součet uvnitř skupin}
&= \text{čtverce vzdáleností jedinců} \\
&\quad \text{od vlastního skupinového průměru}
\end{aligned}
$$
:::

<br>

::: columns
::: {.column width="50%"}
```{r}
#| label: zobrazit-ss-uvnitr-tri-skupin
#| echo: false
#| out-width: "100%"
#| fig-alt: "Tři vymyšlení tučňáci každého druhu jako body; vodorovná úsečka označuje průměr druhu a oranžové svislé úsečky vzdálenosti jedinců od něj."
include_local_figure("ss_three_within.png")
```

::: {.text-size-tiny .text-color-grey_olive}
Malý vymyšlený příklad: tři tučňáci na druh.
:::
:::
::: {.column width="50%"}
::: {.text-size-smaller .text-center}
$$
\begin{aligned}
`r latex_ss_three_within`
`r latex_ss_three_within_total`
\end{aligned}
$$
:::
:::
:::

::: {.notes}
Malý vymyšlený příklad se třemi tučňáky na druh, aby šlo počítat ručně. Každou vzdálenost od průměru vlastního druhu umocníme a sečteme. Stejné kroky R udělá se všemi tučňáky.
:::

## Skupinové průměry měří rozdíl mezi skupinami

```{r}
#| label: vytvorit-ss-mezi-tremi-skupinami
#| include: false
grand_mean_ss_three <- mean(data_ss_three$hmotnost_g)

means_ss_three <-
  means_ss_three |>
  dplyr::mutate(
    odchylka_g = prumer_g - grand_mean_ss_three,
    ctverec_mezi_g2 = n * odchylka_g^2
  )

ss_three_between <- sum(means_ss_three$ctverec_mezi_g2)

plot_ss_three_between <-
  ggplot2::ggplot(means_ss_three) +
  ggplot2::geom_hline(
    yintercept = grand_mean_ss_three,
    linewidth = 1.4,
    linetype = "dashed",
    color = biostat_cols[["grey_olive"]]
  ) +
  ggplot2::geom_segment(
    ggplot2::aes(
      x = x, xend = x,
      y = grand_mean_ss_three, yend = prumer_g
    ),
    linewidth = 2,
    color = biostat_cols[["indigo_velvet"]]
  ) +
  ggplot2::geom_point(
    ggplot2::aes(x = x, y = prumer_g, fill = druh),
    shape = 21,
    size = 7,
    stroke = 1.5,
    color = "white"
  ) +
  ggplot2::scale_fill_manual(values = barvy_druhu, guide = "none") +
  ggplot2::scale_x_continuous(
    breaks = 1:3,
    labels = unname(popisky_druhu),
    limits = c(0.55, 3.45)
  ) +
  ggplot2::scale_y_continuous(
    breaks = seq(3500, 5000, 500),
    limits = c(3450, 5100)
  ) +
  ggplot2::labs(x = NULL, y = "Průměr (g)") +
  theme_biostat(base_size = 17) +
  ggplot2::theme(plot.margin = ggplot2::margin(12, 22, 46, 28)) +
  ggview::canvas(width = 1500, height = 660, units = "px")

ggview::save_ggplot(
  plot = plot_ss_three_between,
  file = here::here(path_materials, "ss_three_between.png")
)
```

::: {.text-size-larger .text-center}
$$
\begin{aligned}
\text{součet mezi skupinami}
&= \text{velikosti skupin} \times \text{čtverce vzdáleností} \\
&\quad \text{skupinových průměrů od společného průměru}
\end{aligned}
$$
:::

```{r}
#| label: zobrazit-ss-mezi-tremi-skupinami
#| echo: false
#| out-width: "82%"
#| fig-alt: "Průměry tří druhů jako body nad čárkovanou čarou společného průměru; fialové svislé úsečky měří vzdálenost každého skupinového průměru od společného průměru."
include_local_figure("ss_three_between.png")
```

::: {.text-size-larger .text-center}
$$
`r means_ss_three$n[[1]]` \times (`r format_whole_number_for_math(means_ss_three$odchylka_g[[1]])`)^2
+ `r means_ss_three$n[[2]]` \times (`r format_whole_number_for_math(means_ss_three$odchylka_g[[2]])`)^2
+ `r means_ss_three$n[[3]]` \times (`r format_whole_number_for_math(means_ss_three$odchylka_g[[3]])`)^2
= `r format_whole_number_for_math(ss_three_between)`\ \mathrm{g}^2
$$
:::

::: {.notes}
Každou vzdálenost průměru od společného průměru násobíme počtem tučňáků ve skupině, protože tento posun se týká každého z nich.
:::

## Celkový součet má dvě viditelné části

```{r}
#| label: vytvorit-rozklad-ss-tri-skupin
#| include: false
ss_three_total <- sum((data_ss_three$hmotnost_g - grand_mean_ss_three)^2)

data_ss_two_parts <-
  data.frame(
    cast = factor(
      c("Mezi skupinami", "Uvnitř skupin"),
      levels = c("Mezi skupinami", "Uvnitř skupin")
    ),
    xmin = c(0, ss_three_between),
    xmax = c(ss_three_between, ss_three_total),
    ss = c(ss_three_between, ss_three_within)
  ) |>
  dplyr::mutate(
    label_x = (xmin + xmax) / 2,
    label = paste0(c("mezi skupinami", "uvnitř skupin"), "\n", format_whole_number(ss), " g²")
  )

plot_ss_two_parts <-
  ggplot2::ggplot(data_ss_two_parts) +
  ggplot2::geom_rect(
    ggplot2::aes(xmin = xmin, xmax = xmax, ymin = 0.55, ymax = 1.45, fill = cast)
  ) +
  ggplot2::geom_text(
    ggplot2::aes(x = label_x, y = 1, label = label),
    size = 4.4,
    lineheight = 0.95,
    color = "white"
  ) +
  ggplot2::scale_fill_manual(
    values = c(
      "Mezi skupinami" = biostat_cols[["indigo_velvet"]],
      "Uvnitř skupin" = biostat_cols[["orange"]]
    ),
    guide = "none"
  ) +
  ggplot2::scale_x_continuous(
    labels = scales::label_number(
      scale = 1e-6, suffix = " mil.", decimal.mark = ","
    ),
    limits = c(0, ss_three_total),
    expand = ggplot2::expansion(mult = c(0, 0))
  ) +
  ggplot2::scale_y_continuous(limits = c(0.45, 1.55), breaks = NULL) +
  ggplot2::labs(x = "Součet čtverců (g²)", y = NULL) +
  theme_biostat(base_size = 16) +
  ggplot2::theme(plot.margin = ggplot2::margin(18, 34, 18, 24)) +
  ggview::canvas(width = 1500, height = 500, units = "px")

ggview::save_ggplot(
  plot = plot_ss_two_parts,
  file = here::here(path_materials, "ss_two_decomposition.png")
)
```

<br>

::: {.text-size-larger .text-center}
$$
\text{celkový součet čtverců}
= \text{součet mezi skupinami} + \text{součet uvnitř skupin}
$$
:::

<br>

```{r}
#| label: zobrazit-rozklad-ss-tri-skupin
#| echo: false
#| out-width: "65%"
#| fig-alt: "Vodorovný pruh celkového součtu čtverců rozdělený na fialovou část mezi skupinami a oranžovou část uvnitř skupin."
include_local_figure("ss_two_decomposition.png")
```

::: {.notes}
Celková variabilita kolem společného průměru se rozdělí na dvě části: část vysvětlenou rozdíly průměrů a část, která zůstává uvnitř skupin.
:::

## Dělením stupni volnosti získáme průměrné čtverce

```{r}
#| label: vypocitat-ms-tri-skupin
#| include: false
df_three_between <- nlevels(data_ss_three$druh) - 1
df_three_within <- nrow(data_ss_three) - nlevels(data_ss_three$druh)

ms_three_between <- ss_three_between / df_three_between
ms_three_within <- ss_three_within / df_three_within
f_three_example <- ms_three_between / ms_three_within
```

::: {.text-size-larger .text-center}
$$
MS = \frac{SS}{\text{stupně volnosti}}
$$
:::

<br>

::: columns
::: {.column width="48%"}
::: {.panel-result}
[Mezi skupinami]{.panel-title}

$$
df = `r nlevels(data_ss_three$druh)` - 1 = `r df_three_between`
$$

$$
MS_{\mathrm{mezi}}
=
\frac{`r format_whole_number_for_math(ss_three_between)`}{`r df_three_between`}
=
`r format_whole_number_for_math(ms_three_between)`\ \mathrm{g}^2
$$
:::
:::
::: {.column width="48%"}
::: {.panel-question}
[Uvnitř skupin]{.panel-title}

$$
df = `r nrow(data_ss_three)` - `r nlevels(data_ss_three$druh)` = `r df_three_within`
$$

$$
MS_{\mathrm{uvnitř}}
=
\frac{`r format_whole_number_for_math(ss_three_within)`}{`r df_three_within`}
=
`r format_whole_number_for_math(ms_three_within)`\ \mathrm{g}^2
$$
:::
:::
:::

::: {.text-size-smaller .text-center}
Tři průměry = jeden referenční + **dva rozdíly**; `r nrow(data_ss_three)` tučňáků mínus `r nlevels(data_ss_three$druh)` odhadnuté průměry.
:::

::: {.takeaway-strip}
Oba součty čtverců přepočítáme na variabilitu připadající na jeden stupeň volnosti.
:::

::: {.notes}
Mezi skupinami: tři průměry, ale jeden je dán referencí, proto dva stupně volnosti. Uvnitř: devět tučňáků minus tři odhadnuté průměry.
:::

## Poměr průměrných čtverců je $F$

<br>

::: {.text-size-larger .text-center}
$$
F
=
\frac{MS_{\mathrm{mezi}}}{MS_{\mathrm{uvnitř}}}
=
\frac{`r format_whole_number_for_math(ms_three_between)`}{`r format_whole_number_for_math(ms_three_within)`}
=
`r format_cz_math(f_three_example, 2)`
$$
:::

<br>

::: columns
::: {.column width="48%"}
::: {.panel-result}
[$MS_{\mathrm{mezi}}$]{.panel-title}

variabilita připadající na jeden stupeň volnosti mezi skupinami
:::
:::
::: {.column width="48%"}
::: {.panel-question}
[$MS_{\mathrm{uvnitř}}$]{.panel-title}

variabilita připadající na jeden stupeň volnosti uvnitř skupin
:::
:::
:::

::: {.notes}
Tomuto poměru říkáme F-statistika. Kdyby druh nepomáhal, byl by poměr kolem 1.
:::

## Analýza se jmenuje ANOVA

<br>

::: {.text-size-larger .text-center}
[ANOVA]{.text-hgl-indigo_velvet} = analýza rozptylu
:::

<br>

::: {.panel-note .fragment}
Název zdůrazňuje mechanismus: rozdíly mezi průměry posuzujeme pomocí rozptylu uvnitř skupin.
:::

<br>

::: {.fragment .takeaway-strip .text-center}
Model je stále `lm()`. ANOVA je test tohoto modelu.
:::

::: {.notes}
Název analýza rozptylu dává smysl: o rozdílech průměrů rozhodujeme porovnáním dvou variabilit. Není to nová metoda vedle lineárního modelu, ale otázka položená stejnému modelu.
:::

## Stejný vnitřní rozptyl, jiný rozdíl

```{r}
#| label: vytvorit-scenare-stejne-sd
#| include: false
fixed_sd <-
  tidyr::crossing(
    gap = c(250, 500, 1000),
    skupina = c("A", "B"),
    i = seq_along(z_pattern)
  ) |>
  dplyr::mutate(
    prumer = 4000 + ifelse(skupina == "A", -gap / 2, gap / 2),
    hodnota = prumer + 500 * z_pattern[i],
    scenar = factor(
      paste0("Rozdíl = ", format_cz(gap, 0), " g"),
      levels = paste0("Rozdíl = ", format_cz(c(250, 500, 1000), 0), " g")
    )
  )

plot_fixed_sd <-
  ggplot2::ggplot(
    fixed_sd,
    ggplot2::aes(x = skupina, y = hodnota, color = skupina)
  ) +
  ggbeeswarm::geom_quasirandom(width = 0.12, size = 3, alpha = 0.75) +
  ggplot2::stat_summary(fun = mean, geom = "crossbar", width = 0.55, linewidth = 1.1) +
  ggplot2::facet_wrap(~ scenar, nrow = 1) +
  ggplot2::scale_color_manual(
    values = barvy_skupin_ab,
    guide = "none"
  ) +
  ggplot2::scale_y_continuous(limits = c(2600, 5400), breaks = seq(3000, 5000, 1000)) +
  ggplot2::labs(x = NULL, y = "Ilustrační hmotnost (g)") +
  theme_biostat(base_size = 15) +
  ggview::canvas(width = 1600, height = 690, units = "px")

ggview::save_ggplot(
  plot = plot_fixed_sd,
  file = here::here(path_materials, "fixed_sd_varying_gap.png")
)
```

::: {.panel-olive}
[Pořadí panelů]{.panel-title}

Seřaďte panely od nejslabšího po nejsilnější důkaz proti shodným průměrům.
:::

```{r}
#| label: zobrazit-scenare-stejne-sd
#| echo: false
#| out-width: "94%"
#| fig-alt: "Tři panely se dvěma vymyšlenými skupinami A a B se stejnou variabilitou uvnitř skupin; zleva doprava roste rozdíl jejich průměrů."
include_local_figure("fixed_sd_varying_gap.png")
```

::: {.notes}
Opačný myšlenkový pokus: stejná variabilita, roste rozdíl průměrů. Nejslabší důkaz je vlevo, nejsilnější vpravo; F roste s rozdílem průměrů.
:::

## Celková otázka v R

```{r}
#| label: anova-viditelne
#| echo: true
#| eval: true
# Celkový F-test pro mod_tri: jsou všechny tři průměry stejné?
anova(object = mod_tri)
```

```{r}
#| label: pripravit-vysledek-anova
#| include: false
tab_anova <- anova(object = mod_tri)
f_anova <- unname(tab_anova["druh", "F value"])
p_anova <- unname(tab_anova["druh", "Pr(>F)"])
df_anova <- unname(tab_anova["druh", "Df"])
df_residual <- unname(tab_anova["Residuals", "Df"])
```

::: {.takeaway-strip .fragment}
$F(`r df_anova`, `r df_residual`) = `r format_cz_math(f_anova, 1)`$, $p$-hodnota `r format_p_cz(p_anova)`: data jsou obtížně slučitelná se shodou všech tří průměrů.
:::

::: {.notes}
Řádek druh: Df, Sum Sq, Mean Sq, F value a Pr(>F). Řádek Residuals: variabilita uvnitř druhů. Stejné kroky jako na malém příkladu, jen na všech tučňácích.
:::

## Kde leží naše $F$ v nulovém rozdělení?

```{r}
#| label: vytvorit-ukazku-f-rozdeleni
#| include: false
f_limit_observed <- ceiling(f_anova * 1.04)

f_distribution <-
  dplyr::bind_rows(
    data.frame(
      panel = "Tvar nulového F-rozdělení",
      f = seq(0, 8, length.out = 1200)
    ),
    data.frame(
      panel = "Pozorované F na celé ose",
      f = seq(0, f_limit_observed, length.out = 2400)
    )
  ) |>
  dplyr::mutate(
    panel = factor(
      panel,
      levels = c(
        "Tvar nulového F-rozdělení",
        "Pozorované F na celé ose"
      )
    ),
    hustota = stats::df(x = f, df1 = df_anova, df2 = df_residual),
    ocas = panel == "Pozorované F na celé ose" & f >= f_anova
  )

f_line <- data.frame(
  panel = factor(
    "Pozorované F na celé ose",
    levels = levels(f_distribution$panel)
  ),
  f = f_anova
)

f_annotations <- data.frame(
  panel = factor(
    c("Tvar nulového F-rozdělení", "Pozorované F na celé ose"),
    levels = levels(f_distribution$panel)
  ),
  x = c(3.6, f_anova * 0.55),
  y = c(0.72, 0.72),
  label = c(
    "velké hodnoty F\nleží v pravém ocasu",
    paste0(
      "pozorované F = ",
      format_cz(f_anova, 1),
      "\np ",
      ifelse(p_anova < 0.001, "< 0,001", paste("=", format_p_cz(p_anova)))
    )
  )
)

plot_f_distribution <-
  ggplot2::ggplot(f_distribution, ggplot2::aes(x = f, y = hustota)) +
  ggplot2::geom_area(
    data = dplyr::filter(f_distribution, ocas),
    fill = biostat_cols[["orange"]],
    alpha = 0.75
  ) +
  ggplot2::geom_line(linewidth = 1.25, color = biostat_cols[["graphite"]]) +
  ggplot2::geom_vline(
    data = f_line,
    ggplot2::aes(xintercept = f),
    linewidth = 1.4,
    linetype = "dashed",
    color = biostat_cols[["orange"]]
  ) +
  ggplot2::geom_label(
    data = f_annotations,
    ggplot2::aes(x = x, y = y, label = label),
    inherit.aes = FALSE,
    size = 3.9,
    label.size = 0,
    fill = "white",
    color = biostat_cols[["graphite"]]
  ) +
  ggplot2::facet_wrap(~ panel, scales = "free_x", nrow = 1) +
  ggplot2::scale_y_continuous(limits = c(0, 1.02), breaks = NULL) +
  ggplot2::labs(x = "Hodnota F při platnosti nulové hypotézy", y = NULL) +
  theme_biostat(base_size = 16) +
  ggview::canvas(width = 1600, height = 700, units = "px")

ggview::save_ggplot(
  plot = plot_f_distribution,
  file = here::here(path_materials, "f_distribution_showcase.png")
)
```

```{r}
#| label: zobrazit-ukazku-f-rozdeleni
#| echo: false
#| out-width: "92%"
#| fig-alt: "Dva panely F-rozdělení: vlevo křivka s většinou hodnot blízko jedné, vpravo stejná křivka na široké ose a oranžová čárkovaná čára pozorovaného F daleko vpravo."
include_local_figure("f_distribution_showcase.png")
```

::: {.takeaway-strip}
$p$-hodnota je plocha napravo od pozorovaného $F$; zde je tak malá, že ji v grafu téměř nevidíme.
:::

::: {.notes}
F je vždy kladné a velké hodnoty leží vpravo, proto jen pravý chvost. Nulové F-rozdělení má dva stupně volnosti pro čitatel a residuální stupně volnosti pro jmenovatel.
:::

## Co nám malá $p$-hodnota říká?

<br>

::: {.panel-olive}
[Hlasování]{.panel-title}

Který závěr plyne přímo z celkového F-testu?
:::

<br>

::: columns
::: {.column width="31%"}
::: {.card-indigo}
[A]{.card-title}

Všechny dvojice se liší.
:::
:::
::: {.column width="31%"}
::: {.card-indigo}
[B]{.card-title}

[Alespoň jeden průměr se liší.]{.rn-circle-orange}
:::
:::
::: {.column width="31%"}
::: {.card-indigo}
[C]{.card-title}

Gentoo je příčinou rozdílu.
:::
:::
:::

<br>

::: {.fragment .takeaway-strip}
Celkový test neříká, které konkrétní dvojice se liší.
:::

::: {.notes}
Hlasování a přesvědčení souseda. A je nejčastější omyl. C míchá test s příčinou. Správně B.
:::


## Stejné $F$, jiný biologický rozdíl

```{r}
#| label: vytvorit-scenare-stejneho-f
#| include: false
same_f_cases <- data.frame(
  gap = c(500, 1000, 1500),
  sd = c(250, 500, 750)
)

same_f <-
  tidyr::crossing(
    case = seq_len(nrow(same_f_cases)),
    skupina = c("A", "B"),
    i = seq_along(z_pattern)
  ) |>
  dplyr::left_join(
    dplyr::mutate(same_f_cases, case = dplyr::row_number()),
    by = "case"
  ) |>
  dplyr::mutate(
    prumer = 4000 + ifelse(skupina == "A", -gap / 2, gap / 2),
    hodnota = prumer + sd * z_pattern[i],
    scenar = factor(
      paste0("Rozdíl ", gap, " g\nSD ", sd, " g"),
      levels = paste0(
        "Rozdíl ", same_f_cases$gap,
        " g\nSD ", same_f_cases$sd, " g"
      )
    )
  )

plot_same_f <-
  ggplot2::ggplot(
    same_f,
    ggplot2::aes(x = skupina, y = hodnota, color = skupina)
  ) +
  ggbeeswarm::geom_quasirandom(width = 0.12, size = 3, alpha = 0.75) +
  ggplot2::stat_summary(fun = mean, geom = "crossbar", width = 0.55, linewidth = 1.1) +
  ggplot2::facet_wrap(~ scenar, nrow = 1) +
  ggplot2::scale_color_manual(
    values = barvy_skupin_ab,
    guide = "none"
  ) +
  ggplot2::scale_y_continuous(limits = c(1900, 6100), breaks = seq(2000, 6000, 1000)) +
  ggplot2::labs(x = NULL, y = "Ilustrační hmotnost (g)") +
  theme_biostat(base_size = 14) +
  ggview::canvas(width = 1600, height = 690, units = "px")

ggview::save_ggplot(
  plot = plot_same_f,
  file = here::here(path_materials, "same_f_different_effect.png")
)

# F of every constructed scenario, computed from the same draws.
f_same <-
  same_f |>
  dplyr::group_by(scenar) |>
  dplyr::group_modify(
    ~ data.frame(
      f = anova(lm(formula = hodnota ~ skupina, data = .x))["skupina", "F value"]
    )
  ) |>
  dplyr::pull(f)

stopifnot(isTRUE(all.equal(min(f_same), max(f_same))))
```

```{r}
#| label: zobrazit-scenare-stejneho-f
#| echo: false
#| out-width: "94%"
#| fig-alt: "Tři panely se dvěma vymyšlenými skupinami A a B; zleva doprava roste rozdíl průměrů i rozptyl uvnitř skupin ve stejném poměru."
include_local_figure("same_f_different_effect.png")
```

::: {.panel-question}
Všechny panely mají $F = `r format_cz_math(f_same[[1]], 0)`$. Jsou biologické závěry stejné?
:::

::: {.notes}
Diskuse ve dvojicích. Poměr rozdílu k šumu je stejný, proto stejné F i p. Rozdíl v gramech je ale třikrát větší vpravo než vlevo; biologická důležitost se liší.
:::

## Síla důkazu není velikost efektu

<br>

::: columns
::: {.column width="48%"}
::: {.panel-result}
[Stejné]{.panel-title}

- poměr rozdílu k šumu;
- $F$-statistika;
- $p$-hodnota.
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-question}
[Jiné]{.panel-title}

- rozdíl v gramech;
- biologická relevance;
- praktický závěr.
:::
:::
:::

<br>

::: {.takeaway-strip .fragment}
Vždy uvádějte odhad efektu a jeho interval — ne pouze $p$-hodnotu.
:::

::: {.notes}
Návaznost na předchozí lekci: síla důkazu a velikost efektu jsou dvě různé informace.
:::

# Které dvojice se liší?

## Od celkové otázky ke dvojicím

```{r}
#| label: zobrazit-lupu
#| echo: false
#| out-width: "88%"
#| fig-alt: "Lupa zvýrazňuje dvojici ze tří tučňáků a připomíná přechod od celkové otázky ANOVA ke srovnání dvojic. Ilustrace vytvořená pomocí AI."
include_local_figure("penguin_group_magnifying_glass.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::

::: {.takeaway-strip .text-center}
ANOVA: „je někde rozdíl?“ → post-hoc porovnání: „mezi kterými dvojicemi?“
:::

::: {.notes}
Lupa: od celkového pohledu na tři druhy k jednotlivým dvojicím. Tři druhy znamenají tři páry. Navazujícím párovým otázkám se říká post-hoc porovnání.
:::

## Ze stejného modelu

<br>

::: {.takeaway-strip .text-center .fragment}
Post-hoc otázky čteme ze stejného fitovaného modelu. Nefitujeme tři nové modely.
:::

<br>

::: columns
::: {.column width="29%"}
::: {.card-indigo .text-center .fragment}
[1. Model]{.card-title}

`mod_tri`
:::
:::
::: {.column width="34%"}
::: {.card-amethyst .text-center .fragment}
[2. Odhadnuté průměry]{.card-title}

`emmeans()` pro každý druh
:::
:::
::: {.column width="34%"}
::: {.card-orange .text-center .fragment}
[3. Párové rozdíly]{.card-title}

`contrast()` s Tukeyho úpravou
:::
:::
:::

::: {.notes}
Žádný nový model: z mod_tri vezmeme odhadnuté průměry a z nich rozdíly všech dvojic.
:::

## Kdy dávají párová porovnání smysl?

<br>

::: {.box-rule}
[Dvě různé otázky položené stejnému modelu]{.card-title}

- **Celkový F-test:** jsou [všechny průměry stejné]{.text-hgl-indigo_velvet}?
- **Post-hoc porovnání:** [které dvojice]{.text-hgl-orange} se liší a o kolik gramů?
:::

<br>

::: {.incremental}
- Smysl mají u **tří a více skupin**; u dvou skupin odpovídá koeficient modelu.
- Tukeyho úprava sama zohlední, že porovnáváme více dvojic; nepotřebuje předchozí „významný“ F-test.
- Malé rozdíly a nevýrazný F-test? Poctivý závěr je „nerozlišeno od nuly“, ne lovení jedné zajímavé dvojice.
:::

::: {.notes}
Zjemnění častého pravidla „post-hoc jen po významné ANOVA“: Tukeyho metoda kontroluje chybu pro celou rodinu porovnání sama. Celkový test a párová porovnání odpovídají na různé otázky.
:::

## Post-hoc v R

```{r}
#| label: emmeans-post-hoc-viditelne
#| echo: true
#| eval: true
# Odhadnuté průměry druhů ze stejného modelu
prumery_emm <-
  emmeans::emmeans(
    object = mod_tri,
    specs = ~druh
  )

# Rozdíly všech tří dvojic s Tukeyho úpravou
post_hoc_tri <-
  emmeans::contrast(
    object = prumery_emm,
    method = "revpairwise",
    adjust = "tukey"
  )
```

<br>

::: {.takeaway-strip .fragment}
`specs` vybírá skupinové průměry; `adjust` říká, že tři navazující otázky hodnotíme společně.
:::

::: {.notes}
Balíček emmeans voláme přes emmeans:: bez library(). Metoda revpairwise dává směr Chinstrap minus Adélie, Gentoo minus Adélie a Gentoo minus Chinstrap.
:::

## Výsledek post-hoc testu

```{r}
#| label: emmeans-post-hoc-viditelne-vysledek
#| echo: true
#| eval: true
summary(object = post_hoc_tri)
```

::: {.notes}
Sloupec estimate je rozdíl v gramech, p.value upravená p-hodnota. Ukážu řádek Chinstrap minus Adélie s velkou p-hodnotou.
:::

## Tři rozdíly na jedné ose

```{r}
#| label: vytvorit-graf-post-hoc
#| include: false
post_hoc_plot <-
  post_hoc_tri |>
  confint() |>
  as.data.frame() |>
  dplyr::mutate(
    kontrast = dplyr::recode(
      contrast,
      "Chinstrap - Adelie" = "Chinstrap − Adélie",
      "Gentoo - Adelie" = "Gentoo − Adélie",
      "Gentoo - Chinstrap" = "Gentoo − Chinstrap"
    ),
    kontrast = factor(
      kontrast,
      levels = c(
        "Gentoo − Adélie",
        "Gentoo − Chinstrap",
        "Chinstrap − Adélie"
      )
    )
  )

plot_posthoc <-
  ggplot2::ggplot(
    post_hoc_plot,
    ggplot2::aes(y = kontrast, x = estimate, xmin = lower.CL, xmax = upper.CL)
  ) +
  ggplot2::geom_vline(xintercept = 0, linetype = "dashed", color = biostat_cols[["grey_olive"]]) +
  ggplot2::geom_errorbarh(height = 0.18, linewidth = 2.4, color = biostat_cols[["orange"]]) +
  ggplot2::geom_point(size = 3.5, color = biostat_cols[["indigo_velvet"]]) +
  ggplot2::labs(x = "Rozdíl hmotnosti (g)", y = NULL) +
  ggplot2::scale_x_continuous(
    breaks = c(-500, 0, 750, 1500),
    limits = c(-500, 1750)
  ) +
  theme_biostat(base_size = 18) +
  ggview::canvas(width = 1500, height = 720, units = "px")

ggview::save_ggplot(
  plot = plot_posthoc,
  file = here::here(path_materials, "posthoc_species_intervals.png")
)
```

```{r}
#| label: zobrazit-graf-post-hoc
#| echo: false
#| out-width: "84%"
#| fig-alt: "Tři fialové body rozdílů s oranžovými úsečkami intervalů: interval Chinstrap minus Adélie protíná čárkovanou nulu, oba rozdíly s Gentoo leží daleko vpravo."
include_local_figure("posthoc_species_intervals.png")
```

::: {.text-size-smaller .text-color-grey_olive .text-center}
Tukeyho simultánní 95% intervaly: všechna tři porovnání jsou vyhodnocena společně.
:::

::: {.panel-olive}
[Diskuse ve dvojici]{.panel-title}

Který interval obsahuje nulu? Proč to neodporuje výsledku celkového F-testu?
:::

::: {.notes}
Malá skupinová interpretace: který interval obsahuje nulu a proč to neodporuje celkové ANOVA? Interval obsahující nulu nedokazuje shodu průměrů.
:::

## Co jsme zjistili?

<br>

::: columns
::: {.column width="48%"}
::: {.panel-result}
[Gentoo]{.panel-title}

Je v průměru asi o **`r format_whole_number(min(post_hoc_plot$estimate[post_hoc_plot$kontrast != "Chinstrap − Adélie"]))`–`r format_whole_number(max(post_hoc_plot$estimate[post_hoc_plot$kontrast != "Chinstrap − Adélie"]))` g těžší** než Adélie i Chinstrap.
:::
:::
::: {.column width="48%"}
::: {.panel-note}
[Adélie vs. Chinstrap]{.panel-title}

Odhad rozdílu je jen asi **`r format_whole_number(abs(post_hoc_plot$estimate[post_hoc_plot$kontrast == "Chinstrap − Adélie"]))` g** a interval obsahuje nulu.
:::
:::
:::

<br>

::: {.takeaway-strip .fragment}
Významná (signifikantní) ANOVA neznamená, že se liší každá dvojice.
:::

::: {.notes}
Shrnutí párových výsledků v gramech. Adélie a Chinstrap: data rozdíl neodlišují od nuly, což neznamená, že jsou průměry přesně stejné.
:::

# Závěr

## Druh není celý příběh

```{r}
#| label: vytvorit-graf-pohlavi-a-druhu
#| include: false
sex_species <-
  data_penguins |>
  dplyr::filter(!is.na(pohlavi)) |>
  dplyr::group_by(druh, pohlavi) |>
  dplyr::summarise(
    prumer = mean(hmotnost_tela_g),
    se = sd(x = hmotnost_tela_g) / sqrt(x = dplyr::n()),
    .groups = "drop"
  )

plot_sex_species <-
  ggplot2::ggplot(
    sex_species,
    ggplot2::aes(x = druh, y = prumer, color = pohlavi, group = pohlavi)
  ) +
  ggplot2::geom_line(linewidth = 1.2) +
  ggplot2::geom_point(size = 4.5) +
  ggplot2::geom_errorbar(
    ggplot2::aes(ymin = prumer - 1.96 * se, ymax = prumer + 1.96 * se),
    width = 0.1,
    linewidth = 0.8
  ) +
  ggplot2::scale_x_discrete(labels = popisky_druhu) +
  ggplot2::scale_color_manual(
    # Sex is a grouping variable: _brand categorical palette.
    values = c("female" = "#C2613A", "male" = "#2E6CA4"),
    labels = c("female" = "samice", "male" = "samci"),
    name = NULL
  ) +
  ggplot2::labs(x = NULL, y = "Průměr (g)") +
  theme_biostat(base_size = 17) +
  ggview::canvas(width = 1500, height = 720, units = "px")

ggview::save_ggplot(
  plot = plot_sex_species,
  file = here::here(path_materials, "species_and_sex_means.png")
)
```

```{r}
#| label: zobrazit-graf-pohlavi-a-druhu
#| echo: false
#| out-width: "78%"
#| fig-alt: "Průměrná hmotnost samic a samců u tří druhů s 95% intervaly; u každého druhu jsou samci těžší než samice."
include_local_figure("species_and_sex_means.png")
```

::: {.text-size-smaller .text-color-grey_olive .text-center}
Bod: průměr · úsečka: 95% interval průměru
:::

::: {.takeaway-strip}
Model s jediným prediktorem odpovídá jedné otázce. Hmotnost souvisí s pohlavím a druh je navíc propojený s ostrovem: Chinstrap byli měřeni jen na ostrově `r paste(unique(data_penguins$ostrov[data_penguins$druh == "Chinstrap"]), collapse = ", ")`, Gentoo jen na `r paste(unique(data_penguins$ostrov[data_penguins$druh == "Gentoo"]), collapse = ", ")`.
:::

::: {.notes}
Samci jsou u všech druhů těžší. Chinstrap žijí v datech jen na ostrově Dream a Gentoo jen na Biscoe, takže druh nejde oddělit od ostrova. Rozdíly mezi druhy jsou asociace v observačních datech.
:::

## Co kdybychom přidali pohlaví nebo ostrov?

::: {.slide-margin-top-15}
:::: {.columns}

::: {.column width="48%"}
::: {.panel-result}
[Tato lekce]{.panel-title}

Jeden kategoriální prediktor: druh.

Efekt: **rozdíl průměrů vůči referenci**.
:::
:::

::: {.column width="48%"}
::: {.panel-question}
[Následující lekce]{.panel-title}

Více prediktorů v jednom modelu: například druh a pohlaví.

Efekt: **rozdíl při zohlednění ostatních prediktorů**.
:::
:::

::::

<br>

::: {.takeaway-strip}
Změní se odhad rozdílu mezi druhy, když budeme porovnávat tučňáky stejného pohlaví?
:::
:::

::: {.notes}
Most k následující lekci: stejný lm(), jen s dalším prediktorem na pravé straně formule.
:::

## Shrnutí

::: {.slide-margin-top-15}
::: {.blockquote}
::: {.incremental}
- Kategoriální prediktor vstupuje do `lm()` pomocí [přepínačů 0/1]{.text-hgl-graphite}.
- Intercept je průměr [referenční skupiny]{.text-hgl-indigo_velvet}, ostatní koeficienty jsou rozdíly vůči ní.
- Dvouvýběrový t-test je test koeficientu dvouskupinového modelu.
- ANOVA porovnává variabilitu [mezi skupinami]{.text-hgl-indigo_velvet} s variabilitou [uvnitř nich]{.text-hgl-orange}; celkový F-test neříká, která dvojice se liší.
- Post-hoc porovnání odpovídají na otázky o konkrétních dvojicích a Tukeyho úprava zohlední, že jich je více.
:::
:::

::: {.takeaway-strip .text-center .fragment}
Rozdíl v gramech → interval → test → omezení studie
:::
:::

::: {.notes}
Shrnutí prochází výsledky učení. U studií s kontrolou zvolíme kontrolu jako referenci, ale design studie tím nevzniká.
:::

## Co potřebujete vědět, než napíšete „druh určuje hmotnost tučňáka“? {.text-center}

<br>

::: {.text-size-large .text-bold .text-center}
Jaké tři otázky položíte autorovi, který vám ukáže jen tuto větu a malou p-hodnotu ANOVA?
:::

<br>

::: {.panel-olive}
[Řekněte sousedovi jednou větou]{.panel-title}

Kterou z otázek byste položili jako první, a proč?
:::

::: {.notes}
Otevřená otázka bez jedné správné odpovědi. Očekávané otázky: O kolik gramů se druhy liší a jak široké jsou intervaly? Které dvojice se liší a které ne? Jak vypadají residua? Lze rozdíl připsat druhu, když jsou druhy propojené s ostrovy a hmotnost souvisí s pohlavím? Slovo „určuje“ naznačuje příčinu, kterou observační data neprokážou.
:::

## Materiály

::: {.text-size-larger}
- [Zdrojový repozitář](`r github_url`)
- [Online prezentace](`r slides_url`)
- [Moodle](https://dl2.cuni.cz/course/view.php?id=106)
:::

::: {.text-size-smaller .text-color-grey_olive}
Data: Palmer Station LTER a palmerpenguins. Druhová ilustrace: Allison Horst. Ostatní ilustrace byly vytvořeny pomocí AI pro tuto lekci.
:::
