---
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
#| echo: false
#| eval: true
#| message: false
#| warning: false
options(htmltools.dir.version = FALSE)

knitr::opts_chunk$set(
  fig.width = 10,
  fig.height = 5.6,
  fig.align = "center",
  out.width = "100%",
  warning = FALSE,
  message = FALSE
)

here::i_am(path = "Presentation/presentation.qmd")

# Visible code reads data/krabi.csv relative to the project root,
#   exactly as students do in their own R project.
knitr::opts_knit$set(root.dir = here::here())

source(here::here("R", "set_r_theme.R"))
source(here::here("R", "format_value_cz.R"))
source(here::here("R", "Functions", "include_optional_figure.R"))
source(here::here("R", "Functions", "ai_disclosure.R"))
source(here::here("R", "Functions", "use_ragg_brand_fonts.R"))
source(here::here("R", "Functions", "build_tree_bands.R"))
source(here::here("R", "Functions", "plot_tree_panels.R"))
use_ragg_brand_fonts()

# Hidden figures use Czech decimal commas on their axes. Visible chunks keep
#   R's default output so that it matches what students see in R.
knitr::knit_hooks$set(
  desetinna_carka = function(before) {
    if (before) {
      options(OutDec = ",")
    } else {
      options(OutDec = ".")
    }
  }
)
knitr::opts_hooks$set(
  echo = function(options) {
    if (isFALSE(options$echo)) {
      options$desetinna_carka <- TRUE
    }
    options
  }
)

path_materials <- "Presentation/Materials"

# Absolute paths: root.dir is the project root, so knitr must not rewrite
#   the image path relative to the Presentation folder.
include_local_figure <- function(data_source) {
  return(
    knitr::include_graphics(
      path = here::here(path_materials, data_source),
      rel_path = FALSE,
      error = TRUE
    )
  )
}

# Sex is a grouping variable, not a semantic data/model/focus role. The crab
#   forms are literally blue and orange, so the sexes use a colour-blind-safe
#   pair that avoids blue, orange and the brand purple (author decision
#   2026-10-15); the same mapping is used in the written materials and the
#   exercise. Shapes repeat the distinction without colour.
vec_barvy_pohlavi <- c(
  samice = "#009E73",
  samec = "#CC79A7"
)

# Blue and orange circles name the two colour forms in labels and headings.
vec_popisky_forem <- c(
  "modrá" = "🔵 modrá forma",
  "oranžová" = "🟠 oranžová forma"
)
vec_symboly_pohlavi <- c(
  samice = 16,
  samec = 17
)

theme_l08 <-
  theme_biostat(base_size = 19) +
  ggplot2::theme(
    axis.title = ggplot2::element_text(
      color = biostat_cols[["graphite"]]
    ),
    panel.grid.minor = ggplot2::element_blank(),
    legend.position = "bottom"
  )
```

```{r}
#| label: dynamic-link-generation
#| include: false
#| echo: false
#| eval: true
#| message: false
#| warning: false
project_name <-
  basename(path = here::here())

display_name <-
  stringr::str_glue("Biostatistika - {project_name}")

github_url <-
  stringr::str_glue(
    "https://github.com/CUNI-NATUR-Biostatistics/{project_name}"
  )

slides_url <-
  stringr::str_glue(
    "https://CUNI-NATUR-Biostatistics.github.io/{project_name}/"
  )
```

## Liší se vztah délky a zadní šířky krunýře mezi samicemi a samci? {.course-title .course-title-illustrated .bg-indigo}

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

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

::: {.course-title-formal}
Interakce prediktorů
:::

::: {.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: "Dva modří krabi u posuvného měřítka mezi skalami a přílivovými tůněmi; za nimi vede pobřežím zelená a růžovofialová stopa ke dvěma oranžovým krabům. Ilustrace vytvořená pomocí AI."
# Generated title illustration; prompt and provenance in GENERATED_IMAGES.md.
include_optional_figure(data_source = "krabi_titulni_ilustrace.png")
```
:::

::: {.course-title-caption}
`r ai_disclosure("krabi_titulni_ilustrace.png")`
:::

::: {.notes}
Titulní ilustrace propojuje měření krunýře, dvě barevné formy a dvojici stop jako připomínku otázky, zda se rozdíl může s velikostí měnit. Samotný obraz nedokládá rozdíly mezi pohlavími.
:::

## Co vlastně na krabovi měříme?

```{r}
#| label: zobrazit-krabi-mereni
#| echo: false
#| out-width: "78%"
#| fig-alt: "Modří pobřežní krabi u měření na skalnatém pobřeží; velké posuvné měřítko obepíná krunýř kraba uprostřed a menší měřítko měří kraba vpravo."
include_local_figure("krabi_mereni.png")
```

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

**Délka krunýře** a **zadní šířka krunýře** jsou dvě měření téhož kraba.

::: {.notes}
Posuvná měřítka ukazují, že obě proměnné jsou rozměry téhož krunýře: délka podél těla a šířka zadní části.
:::

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

## Výsledky učení

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

::: {.incremental}
- rozpoznat biologickou otázku, ve které vztah jednoho prediktoru k odezvě [závisí na druhém prediktoru]{.text-hgl-orange};
- fitovat model s interakcí a zobrazit jeho [předpovědi]{.text-hgl-indigo_velvet} pro kombinace číselných i skupinových prediktorů;
- vyložit koeficienty modelu s interakcí jako [podmíněné]{.text-hgl-indigo_velvet} a porovnávat skupiny nebo různé hodnoty prediktoru pomocí předpovědí;
- vysvětlit interakci dvou skupinových prediktorů jako [rozdíl dvou rozdílů]{.text-hgl-orange};
- omezit závěr na pozorovaný rozsah dat a na souvislost v pozorovacích datech.
:::

# Platí rovnoběžné přímky i pro kraby?

## Proč by se samice a samci mohli lišit tvarem krunýře?

::: {.slide-margin-top-15}
::: columns
::: {.column width="52%"}
::: {.panel-data}
[Co víme o krabech]{.panel-title}

::: {.incremental}
- Zadní část krunýře leží zhruba nad zadečkem.
- Samice pod zadečkem nosí vajíčka.
- Samice a samci se liší [poměrem zadní šířky a délky]{.text-hgl-indigo_velvet} krunýře.
:::
:::
:::
::: {.column width="44%" .fragment}

<br>

::: {.panel-question}
Bude rozdíl v zadní šířce mezi stejně dlouhou samicí a samcem stejný u [malých i velkých]{.text-hgl-orange} krabů?
:::
:::
:::
:::

::: {.footer}
Campbell a Mahon (1974), *Australian Journal of Zoology* 22: 417–425.
:::

::: {.notes}
Biologické očekávání: pokud samice s rostoucí velikostí potřebují pro snůšku relativně více místa, rozdíl mezi pohlavími by se mohl s velikostí měnit. Zatím je to jen hypotéza; data ji teprve posoudí.
:::

## Jeden bod představuje jednoho kraba

::: columns
::: {.column width="60%"}
```{r}
#| label: nacist-data
#| echo: true
data_krabi_vse <-
  read.csv(file = "data/krabi.csv")

# Modrá forma, pohlaví, délka a zadní šířka
data_krabi <-
  data_krabi_vse[
    data_krabi_vse$sp == "B",
    c("sex", "CL", "RW")
  ]
names(data_krabi) <-
  c("pohlavi", "delka_krunyre_mm",
    "zadni_sirka_mm")
data_krabi$pohlavi <-
  factor(
    x = data_krabi$pohlavi,
    levels = c("F", "M"),
    labels = c("samice", "samec")
  )
head(x = data_krabi, n = 3)
```
:::
::: {.column width="36%" .fragment}

<br>

::: {.panel-data}
[`r nrow(data_krabi)` krabů]{.panel-title}

- 🔵 modrá barevná forma
- `r sum(data_krabi$pohlavi == "samice")` samic · `r sum(data_krabi$pohlavi == "samec")` samců
- délka krunýře v mm
- zadní šířka v mm
:::
:::
:::

::: {.footer}
Campbell a Mahon (1974) · `data/krabi.csv`
:::

## Co naznačují měření krabů?

```{r}
#| label: graf-body
#| echo: false
#| fig-height: 5.2
#| fig-alt: "Body krabů ukazují rostoucí vztah délky a zadní šířky u obou pohlaví; samice jsou zelené kruhy, samci růžovofialové trojúhelníky."
graf_body <-
  ggplot2::ggplot(
    data = data_krabi,
    mapping = ggplot2::aes(
      x = delka_krunyre_mm,
      y = zadni_sirka_mm,
      colour = pohlavi,
      shape = pohlavi
    )
  ) +
  ggplot2::geom_point(alpha = 0.85, size = 2.6) +
  ggplot2::scale_colour_manual(values = vec_barvy_pohlavi) +
  ggplot2::scale_shape_manual(values = vec_symboly_pohlavi) +
  ggplot2::labs(
    x = "Délka krunýře (mm)",
    y = "Zadní šířka krunýře (mm)",
    colour = "Pohlaví",
    shape = "Pohlaví"
  ) +
  theme_l08

graf_body
```

::: {.panel-question}
1. Jaký je směr vztahu?
2. Kde se skupiny překrývají?
3. Vypadají oba sklony stejně?
:::

## Aditivní model kreslí rovnoběžné přímky

```{r}
#| label: aditivni-model
#| echo: true
mod_rovnobezne <-
  lm(
    formula = zadni_sirka_mm ~ delka_krunyre_mm + pohlavi,
    data = data_krabi
  )
```

```{r}
#| label: aditivni-primky
#| echo: false
#| fig-height: 4.8
#| fig-alt: "Body krabů a dvě rovnoběžné přímky aditivního modelu; přímka samic leží nad přímkou samců."
# Each line spans only the lengths observed in its own group
data_primky <-
  data_krabi |>
  dplyr::group_by(pohlavi) |>
  dplyr::reframe(
    delka_krunyre_mm = seq(
      from = min(delka_krunyre_mm),
      to = max(delka_krunyre_mm),
      length.out = 100
    )
  )
data_primky$odhad_rovnobezne_mm <-
  predict(object = mod_rovnobezne, newdata = data_primky)

graf_aditivni <-
  graf_body +
  ggplot2::geom_line(
    data = data_primky,
    mapping = ggplot2::aes(y = odhad_rovnobezne_mm),
    linewidth = 1.3
  )

graf_aditivni
```

::: {.footer}
`+` dovoluje posun mezi skupinami, ale ukládá jim společný sklon.
:::

## Zůstává rozdíl mezi pohlavími při každé délce stejný?

::: columns
::: {.column width="64%"}
```{r}
#| label: aditivni-otazka
#| echo: false
#| fig-width: 7.5
#| fig-height: 6
#| fig-alt: "Dvě rovnoběžné modelové přímky mají v celém rozsahu stejnou svislou vzdálenost."
graf_aditivni
```
:::
::: {.column width="32%" .fragment}

<br>

::: {.panel-question}
[Ve dvojici]{.panel-title}

Porovnejte svislou vzdálenost přímek u kratších a delších krabů.

Sedí přímky k bodům i na koncích rozsahu?
:::
:::
:::

::: {.notes}
Dvojice porovnají vzdálenost přímek a potom body kolem nich: sedí rovnoběžné přímky k bodům na koncích rozsahu?
:::

## Data naznačují různé sklony

```{r}
#| label: ruzne-sklony
#| echo: false
#| fig-height: 5.2
#| fig-alt: "Samostatné přímky vedené body samic a samců mají rozdílné sklony; přímka samic stoupá strměji."
graf_body +
  ggplot2::geom_smooth(
    method = "lm",
    formula = y ~ x,
    se = FALSE,
    linewidth = 1.3
  )
```

::: {.fragment}
[Svislá vzdálenost mezi přímkami se s délkou mění.]{.text-size-heading .text-bold .text-color-orange}
:::

## Když se rozdíl mění, mluvíme o interakci

::: {.slide-margin-top-15}
::: columns
::: {.column width="48%" .fragment}
::: {.panel-data}
[Aditivní model]{.panel-title}

Rozdíl mezi pohlavími je [při každé délce stejný]{.text-hgl-indigo_velvet}.

Rovnoběžné přímky
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-result}
[Model s interakcí]{.panel-title}

Rozdíl mezi pohlavími se [mění s délkou]{.text-hgl-orange}.

Různé sklony
:::
:::
:::

<br>

::: {.fragment}
**Interakce:** vztah délky a zadní šířky [závisí na pohlaví]{.text-hgl-orange}.
:::
:::

## Jak zapsat model s interakcí?

<br>

::: {.incremental}
1. `zadni_sirka_mm ~ delka_krunyre_mm + pohlavi`
2. `zadni_sirka_mm ~ delka_krunyre_mm + pohlavi + delka_krunyre_mm:pohlavi`
3. `zadni_sirka_mm ~ delka_krunyre_mm * pohlavi`
:::

<br>

::: {.fragment .panel-result}
`x * y` je zkratka pro `x + y + x:y`; dvojtečka označuje [interakční člen]{.text-hgl-orange}.
:::

## Model s interakcí dovoluje dvěma pohlavím různé sklony

```{r}
#| label: model-s-interakci
#| echo: true
mod_interakce <-
  lm(
    formula = zadni_sirka_mm ~ delka_krunyre_mm * pohlavi,
    data = data_krabi
  )
```

```{r}
#| label: interakcni-primky
#| echo: false
#| fig-height: 4.8
#| fig-alt: "Body krabů a dvě nerovnoběžné přímky modelu s interakcí; přímka samic stoupá strměji než přímka samců."
data_primky$odhad_interakce_mm <-
  predict(object = mod_interakce, newdata = data_primky)

graf_interakce <-
  graf_body +
  ggplot2::geom_line(
    data = data_primky,
    mapping = ggplot2::aes(y = odhad_interakce_mm),
    linewidth = 1.3
  )

graf_interakce
```

::: {.footer}
Každou přímku kreslíme jen přes délky zastoupené v její skupině.
:::

## Co model odhaduje pro dva stejně dlouhé kraby?

```{r}
#| label: zvolit-delku
#| echo: true
# Společná délka uvnitř rozsahu obou pohlaví
delka_porovnani_mm <- 30
```

```{r}
#| label: graf-zvolena-delka
#| echo: false
#| fig-height: 4.9
#| fig-alt: "Interakční přímky nad body krabů a svislá přerušovaná čára při zvolené délce krunýře."
graf_interakce +
  ggplot2::geom_vline(
    xintercept = delka_porovnani_mm,
    linetype = "dashed",
    colour = biostat_cols[["graphite"]]
  )
```

::: {.panel-question}
[Která přímka je při `r delka_porovnani_mm` mm výše? O kolik přibližně?]{.text-bold}
:::

## Dva odhady při stejné délce krunýře

<br>

```{r}
#| label: predpovedi-pro-stejnou-delku
#| echo: true
data_porovnani <-
  data.frame(
    delka_krunyre_mm = rep(x = delka_porovnani_mm, times = 2),
    pohlavi = c("samice", "samec")
  )

data_porovnani$odhad_sirky_mm <-
  predict(
    object = mod_interakce,
    newdata = data_porovnani
  )

data_porovnani
```

::: {.notes}
`predict()` dosadí do modelu stejnou délku pro obě pohlaví; tabulka ukazuje dvě modelové předpovědi, ne dva změřené kraby.
:::

## Samec má při `r delka_porovnani_mm` mm užší zadní část krunýře

```{r}
#| label: rozdil-pri-zvolene-delce
#| include: false
odhad_samice_porovnani <-
  data_porovnani$odhad_sirky_mm[data_porovnani$pohlavi == "samice"]
odhad_samec_porovnani <-
  data_porovnani$odhad_sirky_mm[data_porovnani$pohlavi == "samec"]
rozdil_porovnani <- odhad_samec_porovnani - odhad_samice_porovnani
```

::: columns
::: {.column width="34%"}

<br>

::: {.panel-result}
**● Samice**

[`r format_value_cz(odhad_samice_porovnani, digits = 2)` mm]{.text-size-heading .text-bold}

**▲ Samec**

[`r format_value_cz(odhad_samec_porovnani, digits = 2)` mm]{.text-size-heading .text-bold}

**Samec − samice**

[`r format_value_cz(rozdil_porovnani, digits = 2, signed = TRUE)` mm]{.text-size-heading .text-bold .text-color-orange}
:::
:::
::: {.column width="62%"}
```{r}
#| label: graf-dva-odhady
#| echo: false
#| fig-width: 7.5
#| fig-height: 6.2
#| fig-alt: "Nerovnoběžné přímky modelu s interakcí; dva zvýrazněné body při zvolené délce leží na přímce samic výše a na přímce samců níže."
graf_interakce +
  ggplot2::geom_vline(
    xintercept = delka_porovnani_mm,
    linetype = "dashed",
    colour = biostat_cols[["graphite"]]
  ) +
  ggplot2::geom_point(
    data = data_porovnani,
    mapping = ggplot2::aes(
      x = delka_krunyre_mm,
      y = odhad_sirky_mm,
      fill = pohlavi
    ),
    inherit.aes = FALSE,
    shape = 21,
    size = 6,
    colour = biostat_cols[["white"]],
    stroke = 1.6,
    show.legend = FALSE
  ) +
  ggplot2::scale_fill_manual(values = vec_barvy_pohlavi)
```
:::
:::

## Co už můžeme říci o stejně dlouhých krabech?

::: {.slide-margin-top-15}
::: columns
::: {.column width="48%"}
::: {.panel-result}
[Co víme]{.panel-title}

- Zadní šířka roste s délkou u obou pohlaví.
- Samci mají [pomalejší sklon]{.text-hgl-orange}.
- Při `r delka_porovnani_mm` mm má samec zadní šířku o [`r format_value_cz(abs(rozdil_porovnani), digits = 2)` mm menší]{.text-hgl-indigo_velvet}.
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-question}
[Co ještě nevíme]{.panel-title}

- Jak tento výsledek vyjadřují koeficienty modelu?
- Jak přesně známe rozdíl sklonů?
:::
:::
:::
:::

# Koeficienty interakčního modelu

## Jaké jsou koeficienty v `summary()`?

```{r}
#| label: souhrn-interakce
#| echo: true
souhrn_interakce <-
  summary(object = mod_interakce)

round(
  x = souhrn_interakce$coefficients,
  digits = 3
)
```

<br>

::: {.fragment}
Pro výklad nám stačí sloupec **Estimate**.
:::

## První dva koeficienty popisují referenční samice

```{r}
#| label: koeficienty-interakce
#| include: false
vec_koef_interakce <- coef(mod_interakce)
```

::: {.slide-margin-top-15}
::: columns
::: {.column width="48%" .fragment}
::: {.panel-result}
[`(Intercept)`]{.panel-title}

[`r format_value_cz(vec_koef_interakce[["(Intercept)"]], digits = 3)` mm]{.text-size-heading .text-bold}

Odhad pro samici při délce **0 mm** (hypotetický krab).
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-result}
[`delka_krunyre_mm`]{.panel-title}

[`r format_value_cz(vec_koef_interakce[["delka_krunyre_mm"]], digits = 3, signed = TRUE)` mm/mm]{.text-size-heading .text-bold}

Sklon samičí přímky: samice delší o 1 mm má odhadem širší zadní část.
:::
:::
:::
:::

## Koeficient pohlaví porovnává skupiny při délce 0 mm

<br>

`pohlavisamec` = [`r format_value_cz(vec_koef_interakce[["pohlavisamec"]], digits = 3, signed = TRUE)` mm]{.text-size-heading .text-bold .text-hgl-indigo_velvet}

Rozdíl **samec − samice**, když `delka_krunyre_mm = 0`.

::: {.fragment}
Není to:

- rozdíl při každé délce;
- rozdíl při `r delka_porovnani_mm` mm;
- průměrný rozdíl mezi všemi samci a samicemi.
:::

::: {.fragment}
**Biologicky smysluplné srovnání získáme z předpovědí uvnitř dat.**
:::

## Interakční koeficient mění sklon samců vůči samicím

```{r}
#| label: interval-rozdilu-sklonu
#| include: false
vec_interval_rozdilu_sklonu <-
  confint(mod_interakce)["delka_krunyre_mm:pohlavisamec", ]
sklon_samec <-
  sum(vec_koef_interakce[c("delka_krunyre_mm", "delka_krunyre_mm:pohlavisamec")])
```

<br>

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

[`r format_value_cz(vec_koef_interakce[["delka_krunyre_mm"]], digits = 4)` mm/mm]{.text-size-heading .text-bold}
:::
:::
::: {.column width="48%"}
::: {.panel-result}
[Rozdíl sklonů samec − samice]{.panel-title}

[`r format_value_cz(vec_koef_interakce[["delka_krunyre_mm:pohlavisamec"]], digits = 4, signed = TRUE)` mm/mm]{.text-size-heading .text-bold .text-color-orange}
:::
:::
:::

<br>

::: {.fragment}
$$
\text{sklon samců}
=
`r format_value_cz(vec_koef_interakce[["delka_krunyre_mm"]], digits = 4, math = TRUE)`
+
(`r format_value_cz(vec_koef_interakce[["delka_krunyre_mm:pohlavisamec"]], digits = 4, math = TRUE)`)
\approx
`r format_value_cz(sklon_samec, digits = 3, math = TRUE)`\ \text{mm/mm}
$$
:::

::: {.fragment .text-center}
95% interval spolehlivosti rozdílu sklonů: `r format_value_cz(vec_interval_rozdilu_sklonu[[1]], digits = 3)` až `r format_value_cz(vec_interval_rozdilu_sklonu[[2]], digits = 3)` mm/mm
:::

## Rozdíl při `r delka_porovnani_mm` mm skládají dva známé příspěvky

<br>

Rozdíl **samec − samice při `r delka_porovnani_mm` mm** tvoří:

::: {.incremental}
1. rozdíl mezi pohlavími při délce 0 mm: [`r format_value_cz(vec_koef_interakce[["pohlavisamec"]], digits = 4, signed = TRUE)` mm]{.text-hgl-indigo_velvet};
2. `r delka_porovnani_mm` mm × změna rozdílu o [`r format_value_cz(vec_koef_interakce[["delka_krunyre_mm:pohlavisamec"]], digits = 4, signed = TRUE)` mm]{.text-hgl-orange} na každý milimetr délky.
:::

::: {.fragment}
$$
\text{rozdíl při } `r delka_porovnani_mm`\ \text{mm}
=
`r format_value_cz(vec_koef_interakce[["pohlavisamec"]], digits = 4, math = TRUE)`
+ `r delka_porovnani_mm` \times (`r format_value_cz(vec_koef_interakce[["delka_krunyre_mm:pohlavisamec"]], digits = 4, math = TRUE)`)
\approx
\mathbf{`r format_value_cz(rozdil_porovnani, digits = 2, signed = TRUE, math = TRUE)`\ \text{mm}}
$$
:::

::: {.fragment}
Obecně pro délku $x$, kde $\beta$ označuje koeficient modelu:

$$
\text{rozdíl}(x)=\beta_{\text{samec}}+x\,\beta_{\text{délka:samec}}
$$
:::

::: {.footer}
Je to stejný rozdíl, který jsme odečetli z předpovědí.
:::

## Platí koeficient `pohlavisamec` při každé délce?

<br>

::: {.panel-question}
**A)** Ano, při každé délce.
:::

::: {.panel-question}
[**B)** Ne, pouze při délce 0 mm.]{.rn-circle-orange}
:::

::: {.panel-question}
**C)** Ne, pouze při délce `r delka_porovnani_mm` mm.
:::

<br>

::: {.fragment}
Při jiné délce musíme přidat příspěvek [interakčního koeficientu]{.text-hgl-orange}.
:::

::: {.notes}
Hlasování a jednověté zdůvodnění sousedovi; správnou možnost zakroužkujte až po diskusi.
:::

## Jak dobře přímky popisují změřené kraby?

::: columns
::: {.column width="62%"}
```{r}
#| label: diagnostika-interakcniho-modelu
#| echo: false
#| fig-width: 7.5
#| fig-height: 6
#| fig-alt: "Residua modelu s interakcí proti odhadnuté zadní šířce; body samic a samců leží nad i pod přerušovanou nulou bez oblouku a s podobným rozptylem."
data_diagnostika <-
  data.frame(
    odhad_mm = fitted(mod_interakce),
    residuum_mm = residuals(mod_interakce),
    pohlavi = data_krabi$pohlavi
  )

ggplot2::ggplot(
  data = data_diagnostika,
  mapping = ggplot2::aes(
    x = odhad_mm,
    y = residuum_mm,
    colour = pohlavi,
    shape = pohlavi
  )
) +
  ggplot2::geom_hline(
    yintercept = 0,
    linetype = "dashed",
    colour = biostat_cols[["graphite"]]
  ) +
  ggplot2::geom_point(alpha = 0.85, size = 2.4) +
  ggplot2::scale_colour_manual(values = vec_barvy_pohlavi) +
  ggplot2::scale_shape_manual(values = vec_symboly_pohlavi) +
  ggplot2::labs(
    x = "Odhadnutá zadní šířka (mm)",
    y = "Residuum (mm)",
    colour = "Pohlaví",
    shape = "Pohlaví"
  ) +
  theme_l08
```
:::
::: {.column width="34%"}

<br>

::: {.panel-result}
Residua leží kolem nuly [bez oblouku]{.text-hgl-indigo_velvet} a s podobným rozptylem u malých i velkých krabů.
:::

<br>

::: {.fragment}
::: {.panel-question}
Graf neověří příčinu ani platnost mimo pozorované délky.
:::
:::
:::
:::

## Co víme o rozdílu mezi samicemi a samci modré formy?

::: {.box-question}
Bude rozdíl v zadní šířce mezi stejně dlouhou samicí a samcem stejný u malých i velkých krabů?
:::

<br>

::: columns
::: {.column width="52%"}
::: {.panel-result}
[Co data ukazují]{.panel-title}

- Sklon samic `r format_value_cz(vec_koef_interakce[["delka_krunyre_mm"]], digits = 3)`, samců `r format_value_cz(sklon_samec, digits = 3)` mm/mm.
- Rozdíl samec − samice se mění o [`r format_value_cz(vec_koef_interakce[["delka_krunyre_mm:pohlavisamec"]], digits = 3, signed = TRUE)` mm]{.text-hgl-orange} na 1 mm délky (95% interval spolehlivosti `r format_value_cz(vec_interval_rozdilu_sklonu[[1]], digits = 3)` až `r format_value_cz(vec_interval_rozdilu_sklonu[[2]], digits = 3)`).
- Při `r delka_porovnani_mm` mm: samec − samice [`r format_value_cz(rozdil_porovnani, digits = 2, signed = TRUE)` mm]{.text-hgl-indigo_velvet}.
:::
:::
::: {.column width="44%" .fragment}
::: {.panel-question}
[Co zůstává otevřené]{.panel-title}

- Proč se pohlaví liší: data jsou pozorovací.
- Platí to i pro kraby mimo tento vzorek?
- A pro kraby menší nebo větší, než jsme změřili?
:::
:::
:::

::: {.notes}
Výsledek odpovídá biologickému očekávání z úvodu, ale samotná data neukazují mechanismus.
:::

# Když jsou oba prediktory skupiny

## Liší se rozdíl mezi pohlavími u modré a oranžové formy?

::: columns
::: {.column width="56%"}
```{r}
#| label: zobrazit-krabi-ctyri-skupiny
#| echo: false
#| out-width: "100%"
#| fig-alt: "Čtyři krabi mezi skalami: vlevo modrá samice a modrý samec, vpravo oranžová samice a oranžový samec; samice mají zelený odznak se symbolem samice, samci růžovofialový odznak se symbolem samce."
include_local_figure("krabi_ctyri_skupiny.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::
:::
::: {.column width="40%"}

::: {.panel-data}
[Odezva]{.panel-title}

Délka krunýře (mm)
:::

::: {.panel-data .fragment}
[Dva skupinové prediktory]{.panel-title}

Barevná forma · pohlaví
:::

::: {.panel-question .fragment}
Mění se rozdíl **samec − samice** mezi barevnými formami?
:::

[Do každé skupiny vybrali autoři stejný počet krabů, takže průměrné délky závisejí i na výběru.]{.text-size-smaller}
:::
:::

::: {.notes}
Čtyři krabi ukazují čtyři kombinace dvou skupinových znaků: barva těla je forma, barva odznaku pohlaví (stejné barvy jako v grafech). U mnoha živočichů se velikost samců a samic liší a rozdíl nemusí být u příbuzných forem stejný. Autoři vybrali do každé skupiny stejný počet krabů.
:::

## Jaké délky vidíme ve čtyřech skupinách?

```{r}
#| label: graf-ctyri-skupiny
#| echo: false
#| fig-height: 5.4
#| fig-alt: "Jednotlivé body ukazují délku krunýře samic a samců v modré a oranžové formě; délky se ve všech skupinách výrazně překrývají."
data_formy <-
  data_krabi_vse[, c("sp", "sex", "CL")]
names(data_formy) <-
  c("forma", "pohlavi", "delka_krunyre_mm")
data_formy$forma <-
  factor(
    x = data_formy$forma,
    levels = c("B", "O"),
    labels = c("modrá", "oranžová")
  )
data_formy$pohlavi <-
  factor(
    x = data_formy$pohlavi,
    levels = c("F", "M"),
    labels = c("samice", "samec")
  )
pocet_ve_skupine <- min(table(data_formy$forma, data_formy$pohlavi))

graf_ctyri_body <-
  ggplot2::ggplot(
    data = data_formy,
    mapping = ggplot2::aes(
      x = pohlavi,
      y = delka_krunyre_mm,
      fill = pohlavi,
      colour = pohlavi,
      shape = pohlavi
    )
  ) +
  ggplot2::geom_point(
    position = ggplot2::position_jitter(
      width = 0.12,
      height = 0,
      seed = 900723
    ),
    alpha = 0.85,
    size = 2.4
  ) +
  ggplot2::facet_wrap(
    facets = ggplot2::vars(forma),
    labeller = ggplot2::labeller(forma = vec_popisky_forem)
  ) +
  ggplot2::scale_colour_manual(values = vec_barvy_pohlavi) +
  ggplot2::scale_fill_manual(values = vec_barvy_pohlavi) +
  ggplot2::scale_shape_manual(values = vec_symboly_pohlavi) +
  ggplot2::labs(
    x = "Pohlaví",
    y = "Délka krunýře (mm)"
  ) +
  theme_l08 +
  ggplot2::theme(legend.position = "none")

graf_ctyri_body
```

::: {.footer}
Každý bod je jeden krab. Autoři vybrali do každé skupiny `r pocet_ve_skupine` krabů.
:::

## Je rozdíl mezi samci a samicemi u obou forem stejný?

::: columns
::: {.column width="58%"}
```{r}
#| label: graf-tichy-zapis
#| echo: false
#| fig-width: 7.5
#| fig-height: 6.2
#| fig-alt: "Stejný graf čtyř skupin bez zobrazených průměrů."
graf_ctyri_body
```
:::
::: {.column width="38%"}

<br>

::: {.panel-question}
[Minuta bez hovoru]{.panel-title}

Napište pro každou formu:

- kdo má vyšší průměr;
- zda čekáte podobně velký rozdíl;
- jednu větu, kterou z bodů říci nemůžeme.
:::
:::
:::

::: {.notes}
Po minutě porovnejte zápisy se sousedem a potom odkryjte průměry.
:::

## Průměry ukazují dva různé rozdíly

```{r}
#| label: graf-prumery
#| echo: false
#| fig-height: 5.4
#| fig-alt: "Stejný graf jednotlivých krabů doplněný o čtyři průměry; u modré formy spojnice stoupá od samic k samcům, u oranžové mírně klesá."
data_prumery <-
  data_formy |>
  dplyr::group_by(forma, pohlavi) |>
  dplyr::summarise(
    prumer_mm = mean(delka_krunyre_mm),
    .groups = "drop"
  )

graf_ctyri_prumery <-
  graf_ctyri_body +
  ggplot2::geom_line(
    data = data_prumery,
    mapping = ggplot2::aes(
      x = pohlavi,
      y = prumer_mm,
      group = forma
    ),
    inherit.aes = FALSE,
    colour = biostat_cols[["graphite"]],
    linewidth = 1.2
  ) +
  ggplot2::geom_point(
    data = data_prumery,
    mapping = ggplot2::aes(
      x = pohlavi,
      y = prumer_mm,
      fill = pohlavi
    ),
    inherit.aes = FALSE,
    shape = 23,
    size = 5,
    colour = biostat_cols[["white"]],
    stroke = 1.4
  )

graf_ctyri_prumery
```

::: {.footer}
Body, osy i náhodné posunutí jsou stejné. Přibyly pouze průměry a spojnice.
:::

## Jak velký je rozdíl samec minus samice v každé formě?

```{r}
#| label: rozdily-v-kazde-forme
#| include: false
mat_prumery_formy <-
  xtabs(
    formula = prumer_mm ~ forma + pohlavi,
    data = data_prumery
  )
rozdil_modra <-
  mat_prumery_formy["modrá", "samec"] - mat_prumery_formy["modrá", "samice"]
rozdil_oranzova <-
  mat_prumery_formy["oranžová", "samec"] - mat_prumery_formy["oranžová", "samice"]
rozdil_rozdilu <- rozdil_oranzova - rozdil_modra
```

::: {.slide-margin-top-15}
::: columns
::: {.column width="48%" .fragment}
::: {.panel-result}
[🔵 Modrá forma]{.panel-title}

$$
`r format_value_cz(mat_prumery_formy["modrá", "samec"], digits = 2, math = TRUE)`
-
`r format_value_cz(mat_prumery_formy["modrá", "samice"], digits = 2, math = TRUE)`
=
\mathbf{`r format_value_cz(rozdil_modra, digits = 2, signed = TRUE, math = TRUE)`\ \text{mm}}
$$
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-result}
[🟠 Oranžová forma]{.panel-title}

$$
`r format_value_cz(mat_prumery_formy["oranžová", "samec"], digits = 2, math = TRUE)`
-
`r format_value_cz(mat_prumery_formy["oranžová", "samice"], digits = 2, math = TRUE)`
=
\mathbf{`r format_value_cz(rozdil_oranzova, digits = 2, signed = TRUE, math = TRUE)`\ \text{mm}}
$$
:::
:::
:::

<br>

::: {.fragment}
U modré formy jsou samci v průměru delší, u oranžové [o něco kratší]{.text-hgl-orange}.
:::
:::

## Interakce je rozdíl dvou rozdílů

::: {.slide-margin-top-15}
**Rozdíl dvou rozdílů** $\Delta$ = rozdíl u 🟠 oranžové formy − rozdíl u 🔵 modré formy

::: {.fragment}
$$
\Delta
=
(`r format_value_cz(rozdil_oranzova, digits = 2, signed = TRUE, math = TRUE)`)
-
(`r format_value_cz(rozdil_modra, digits = 2, signed = TRUE, math = TRUE)`)
=
\mathbf{`r format_value_cz(rozdil_rozdilu, digits = 2, signed = TRUE, math = TRUE)`\ \text{mm}}
$$
:::

<br>

::: {.fragment .panel-result}
Rozdíl mezi pohlavími se při přechodu od modré k oranžové formě změní o [`r format_value_cz(rozdil_rozdilu, digits = 2, signed = TRUE)` mm]{.text-size-heading .text-bold .text-color-orange}.
:::
:::

## `forma * pohlavi` zapíše všechny čtyři kombinace

<br>

::: {.fragment}
`forma + pohlavi + forma:pohlavi = forma * pohlavi`; referenční kombinace je modrá forma a samice.
:::

::: {.fragment}
```{r}
#| label: model-dvou-skupinovych-znaku
#| echo: true
mod_formy <-
  lm(
    formula = delka_krunyre_mm ~ forma * pohlavi,
    data = data_formy
  )

round(
  x = summary(object = mod_formy)$coefficients,
  digits = 3
)
```
:::


## Který údaj je rozdíl samec − samice v oranžové formě?

```{r}
#| label: koeficienty-formy
#| include: false
vec_koef_formy <- coef(mod_formy)
```

::: columns
::: {.column width="44%"}
::: {.text-size-smaller}
| Koeficient | Odhad (mm) |
|---|---|
| `(Intercept)` | `r format_value_cz(vec_koef_formy[["(Intercept)"]], digits = 3)` |
| `formaoranžová` | `r format_value_cz(vec_koef_formy[["formaoranžová"]], digits = 3, signed = TRUE)` |
| `pohlavisamec` | `r format_value_cz(vec_koef_formy[["pohlavisamec"]], digits = 3, signed = TRUE)` |
| `formaoranžová:pohlavisamec` | `r format_value_cz(vec_koef_formy[["formaoranžová:pohlavisamec"]], digits = 3, signed = TRUE)` |
:::
:::
::: {.column width="4%"}
:::
::: {.column width="50%"}
::: {.panel-question}
**A)** `pohlavisamec`
:::

::: {.panel-question}
**B)** `formaoranžová:pohlavisamec`
:::

::: {.panel-question}
[**C)** `pohlavisamec` + `formaoranžová:pohlavisamec`]{.rn-circle-orange}
:::

::: {.panel-question}
**D)** `formaoranžová`
:::
:::
:::

<br>

::: {.fragment}
`r format_value_cz(vec_koef_formy[["pohlavisamec"]], digits = 2, signed = TRUE)` + (`r format_value_cz(vec_koef_formy[["formaoranžová:pohlavisamec"]], digits = 2, signed = TRUE)`) = [`r format_value_cz(sum(vec_koef_formy[c("pohlavisamec", "formaoranžová:pohlavisamec")]), digits = 2, signed = TRUE)` mm]{.text-hgl-orange}: stejný rozdíl, jaký jsme spočítali z průměrů oranžové formy.
:::

::: {.notes}
Hlasování a krátké zdůvodnění ve dvojici; správnou možnost zakroužkujte až po diskusi. Součet koeficientů dává rozdíl u oranžové formy ze snímku s rozdíly v každé formě.
:::

## Co znamená každý ze čtyř koeficientů?

```{r}
#| label: interval-interakce-forem
#| include: false
vec_interval_formy <- confint(mod_formy)["formaoranžová:pohlavisamec", ]
```

<br>

::: columns
::: {.column width="48%"}
**`(Intercept)`**: 🔵 modrá samice

[`r format_value_cz(vec_koef_formy[["(Intercept)"]], digits = 2)` mm]{.text-hgl-indigo_velvet}

<br>

**`formaoranžová`**: 🟠 oranžová − 🔵 modrá mezi samicemi

[`r format_value_cz(vec_koef_formy[["formaoranžová"]], digits = 2, signed = TRUE)` mm]{.text-hgl-indigo_velvet}
:::
::: {.column width="48%" .fragment}
**`pohlavisamec`**: samec − samice v 🔵 modré formě

[`r format_value_cz(vec_koef_formy[["pohlavisamec"]], digits = 2, signed = TRUE)` mm]{.text-hgl-indigo_velvet}

<br>

**`formaoranžová:pohlavisamec`**: změna rozdílu mezi formami

[`r format_value_cz(vec_koef_formy[["formaoranžová:pohlavisamec"]], digits = 2, signed = TRUE)` mm]{.text-hgl-orange}
:::
:::

<br>

::: {.fragment .text-center}
95% interval spolehlivosti interakce: `r format_value_cz(vec_interval_formy[[1]], digits = 2)` až `r format_value_cz(vec_interval_formy[[2]], digits = 2)` mm
:::

## Odhad pro každou ze čtyř skupin

```{r}
#| label: emmeans-ctyri-skupiny
#| echo: true
prumery_formy <-
  emmeans::emmeans(
    object = mod_formy,
    specs = ~ pohlavi | forma
  )

prumery_formy
```

<br>

::: {.fragment}
Model má jeden parametr pro každou kombinaci, proto odhady odpovídají pozorovaným skupinovým průměrům.
:::

## Residua jsou odchylky jednotlivých krabů od skupinových průměrů

```{r}
#| label: residua-ctyr-skupin
#| echo: false
#| fig-height: 5.4
#| fig-alt: "Houslové grafy residuí s body všech krabů ukazují velkou variabilitu uvnitř všech čtyř skupin kolem nuly."
data_formy$residuum_mm <- residuals(mod_formy)

ggplot2::ggplot(
  data = data_formy,
  mapping = ggplot2::aes(
    x = pohlavi,
    y = residuum_mm,
    fill = pohlavi
  )
) +
  ggplot2::geom_violin(
    alpha = 0.35,
    width = 0.75,
    colour = biostat_cols[["grey_olive"]]
  ) +
  ggplot2::geom_point(
    position = ggplot2::position_jitter(
      width = 0.10,
      height = 0,
      seed = 900723
    ),
    alpha = 0.6,
    size = 1.7,
    colour = biostat_cols[["graphite"]]
  ) +
  ggplot2::geom_hline(
    yintercept = 0,
    linetype = "dashed",
    colour = biostat_cols[["graphite"]]
  ) +
  ggplot2::facet_wrap(
    facets = ggplot2::vars(forma),
    labeller = ggplot2::labeller(forma = vec_popisky_forem)
  ) +
  ggplot2::scale_fill_manual(values = vec_barvy_pohlavi, guide = "none") +
  ggplot2::labs(
    x = "Pohlaví",
    y = "Residuum: krab − průměr skupiny (mm)"
  ) +
  theme_l08
```

::: {.footer}
Residuum = délka kraba − průměr jeho skupiny.
:::

## Rozdíl mezi pohlavími závisí na barevné formě

::: {.slide-margin-top-15}
::: {.panel-result}
- 🔵 Modrá forma: samec − samice = [`r format_value_cz(rozdil_modra, digits = 2, signed = TRUE)` mm]{.text-hgl-indigo_velvet}
- 🟠 Oranžová forma: samec − samice = [`r format_value_cz(rozdil_oranzova, digits = 2, signed = TRUE)` mm]{.text-hgl-indigo_velvet}
- Změna rozdílu: [`r format_value_cz(rozdil_rozdilu, digits = 2, signed = TRUE)` mm]{.text-hgl-orange}; 95% interval spolehlivosti `r format_value_cz(vec_interval_formy[[1]], digits = 2)` až `r format_value_cz(vec_interval_formy[[2]], digits = 2)` mm
:::

<br>

::: {.fragment}
Průměrné délky závisejí i na tom, které kraby autoři vybrali. Výsledek popisuje tento soubor, ne velikost krabů v přírodě.
:::
:::

# Když jsou oba prediktory čísla

## Přibude vysokému stromu s každým centimetrem průměru víc dřeva?

```{r}
#| label: nacist-stromy
#| include: false
data_stromy <-
  read.csv(file = "data/stromy.csv")
data_stromy$prumer_cm <-
  data_stromy$Girth * 2.54
data_stromy$vyska_m <-
  data_stromy$Height * 0.3048
data_stromy$objem_m3 <-
  data_stromy$Volume * 0.0283168
```

::: {.slide-margin-top-15}
::: columns
::: {.column width="48%"}
::: {.panel-data}
[Střemcha pozdní]{.panel-title}

- severoamerický, u nás invazní strom
- objem dřeva z **průměru kmene** a **výšky**
- `r nrow(data_stromy)` pokácených stromů, z amerických jednotek převedeno na cm, m a m³
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-question}
[Ve dvojici]{.panel-title}

Dva stejně tlusté kmeny ztloustnou o 1 cm. Jeden strom je nízký, druhý vysoký.

Kterému přibude [víc dřeva]{.text-hgl-orange}?
:::
:::
:::

<br>

::: {.fragment}
Vysokému: nová vrstva dřeva obalí delší kmen.
:::
:::

::: {.footer}
Meyer (1953), *Forest Mensuration* · `data/stromy.csv`
:::

::: {.notes}
Dvojice se nejprve shodnou na odpovědi a jednou větou ji zdůvodní. Očekávání vychází z tvaru kmene, ne z fyziologie stromu. Výška i průměr jsou čísla, žádné skupiny tu nejsou.
:::

## Vystihne společný sklon nízké i vysoké stromy?

```{r}
#| label: aditivni-model-stromy
#| echo: true
mod_aditivni <-
  lm(
    formula = objem_m3 ~ prumer_cm + vyska_m,
    data = data_stromy
  )
```

```{r}
#| label: pasma-stromu
#| include: false
res_pasma_stromy <- build_tree_bands(data_stromy = data_stromy)
```

```{r}
#| label: panely-aditivni
#| echo: false
#| fig-width: 12
#| fig-height: 3.7
#| fig-alt: "Čtyři panely vedle sebe, jeden pro každé výškové pásmo stromů od nejnižšího vlevo po nejvyšší vpravo; v každém je objem dřeva proti průměru kmene a fialová přímka aditivního modelu se stejným sklonem ve všech panelech. V nejnižším pásmu leží tenké kmeny nad přímkou a tlusté pod ní, v nejvyšším pásmu naopak."
plot_tree_panels(
  res_pasma = res_pasma_stromy,
  mod = mod_aditivni,
  base_size = 18
)
```

::: {.fragment}
**Ve dvojici:** kde leží tenké a tlusté kmeny v krajních panelech?
:::

::: {.footer}
Panel = výšková čtvrtina stromů · přímka = model při střední výšce panelu
:::

::: {.notes}
Výšková pásma slouží jen ke kreslení: každý panel ukazuje stromy jednoho pásma a přímku pro jeho střední výšku. Model pracuje s výškou jako s číslem. Aditivní model dává všem výškám stejný sklon; v nejnižším pásmu body stoupají pozvolněji, v nejvyšším strměji.
:::

## Mění se sklon přímky s výškou stromu?

```{r}
#| label: model-stromy-skryty
#| include: false
mod_stromy <-
  lm(
    formula = objem_m3 ~ prumer_cm * vyska_m,
    data = data_stromy
  )
```

```{r}
#| label: panely-interakce
#| echo: false
#| fig-width: 12
#| fig-height: 4.6
#| fig-alt: "Stejné čtyři panely stromů s fialovými přímkami modelu s interakcí a šedou přerušovanou přímkou nejnižšího pásma v každém panelu; od nejnižšího k nejvyššímu pásmu je fialová přímka stále strmější a vzdaluje se od šedé."
plot_tree_panels(
  res_pasma = res_pasma_stromy,
  mod = mod_stromy,
  flag_reference = TRUE,
  base_size = 18
)
```

::: {.fragment}
[Čím vyšší strom, tím strmější přímka.]{.text-size-heading .text-bold .text-color-orange}
:::

::: {.footer}
Šedá přerušovaná = přímka nejnižšího panelu · sklon = m³ na 1 cm průměru
:::

::: {.notes}
Projeďte prstem po fialových přímkách zleva doprava a porovnejte je se šedou. Stejný centimetr průměru navíc znamená u vyšších stromů víc dřeva: sklon průměru závisí na výšce. To je interakce dvou číselných prediktorů.
:::

## `prumer_cm * vyska_m`: sklon průměru závisí na výšce

```{r}
#| label: model-stromy
#| echo: true
mod_stromy <-
  lm(
    formula = objem_m3 ~ prumer_cm * vyska_m,
    data = data_stromy
  )
round(x = coef(object = mod_stromy), digits = 5)
```

```{r}
#| label: sklony-stromy
#| include: false
vec_koef_stromy <- coef(mod_stromy)
vec_vysky_sklon_m <- c(21, 23, 25)
vec_sklony_prumeru <-
  vec_koef_stromy[["prumer_cm"]] +
  vec_koef_stromy[["prumer_cm:vyska_m"]] * vec_vysky_sklon_m
```

::: {.fragment .panel-result}
sklon průměru = `prumer_cm` + [`prumer_cm:vyska_m`]{.text-hgl-orange} × výška
:::

::: {.fragment}
| Výška stromu | `r paste0(vec_vysky_sklon_m, " m", collapse = " | ")` |
|---|---|---|---|
| Sklon průměru (m³ na 1 cm) | `r paste(format_value_cz(vec_sklony_prumeru, digits = 3), collapse = " | ")` |
:::

::: {.notes}
Sklon průměru při zvolené výšce složíme ze dvou řádků výpisu. S každým metrem výšky navíc přibude ke sklonu hodnota interakčního koeficientu.
:::

## Pro který strom platí koeficient `prumer_cm`?

<br>

`prumer_cm` = [`r format_value_cz(vec_koef_stromy[["prumer_cm"]], digits = 3, signed = TRUE)` m³ na 1 cm]{.text-size-heading .text-bold .text-hgl-indigo_velvet}

::: {.panel-question}
**A)** Pro každý změřený strom.
:::

::: {.panel-question}
**B)** Jen pro nejnižší stromy v datech.
:::

::: {.panel-question}
**C)** Pro žádný: tlustší kmen má méně dřeva.
:::

::: {.panel-question}
[**D)** Jen pro strom vysoký 0 m.]{.rn-circle-orange}
:::

<br>

::: {.fragment}
Takový strom v datech není. Sklon průměru proto uvádíme [při zvolené výšce]{.text-hgl-orange} uvnitř dat.
:::

::: {.notes}
Hlasování a jednověté zdůvodnění sousedovi; správnou možnost zakroužkujte až po diskusi. Stejná logika jako u koeficientu `pohlavisamec`: hlavní koeficient platí při nule druhého prediktoru.
:::

## Co víme o stromech?

```{r}
#| label: vysledek-stromy
#| include: false
prumery_porovnani_cm <- c(28, 36)
vysky_porovnani_m <- c(21, 25)
data_porovnani_stromy <-
  expand.grid(
    prumer_cm = prumery_porovnani_cm,
    vyska_m = vysky_porovnani_m
  )
data_porovnani_stromy$objem_odhad_m3 <-
  predict(object = mod_stromy, newdata = data_porovnani_stromy)
vec_odhad_stromy <- data_porovnani_stromy$objem_odhad_m3
vec_vyska_porovnani <- data_porovnani_stromy$vyska_m
prirustek_nizky <-
  diff(vec_odhad_stromy[vec_vyska_porovnani == vysky_porovnani_m[[1]]])
prirustek_vysoky <-
  diff(vec_odhad_stromy[vec_vyska_porovnani == vysky_porovnani_m[[2]]])
vec_interval_stromy <- confint(mod_stromy)["prumer_cm:vyska_m", ]
```

::: {.box-question}
Přibude vysokému stromu s každým centimetrem průměru víc dřeva?
:::

<br>

::: columns
::: {.column width="52%"}
::: {.panel-result}
[Co data ukazují]{.panel-title}

- Kmen `r prumery_porovnani_cm[[2]]` cm místo `r prumery_porovnani_cm[[1]]` cm podle modelu: [+`r format_value_cz(prirustek_nizky, digits = 2)` m³]{.text-hgl-indigo_velvet} při `r vysky_porovnani_m[[1]]` m, [+`r format_value_cz(prirustek_vysoky, digits = 2)` m³]{.text-hgl-indigo_velvet} při `r vysky_porovnani_m[[2]]` m.
- Sklon průměru (m³ na 1 cm) roste o [`r format_value_cz(vec_koef_stromy[["prumer_cm:vyska_m"]], digits = 4)`]{.text-hgl-orange} na každý 1 m výšky (95% interval spolehlivosti `r format_value_cz(vec_interval_stromy[[1]], digits = 4)` až `r format_value_cz(vec_interval_stromy[[2]], digits = 4)`).
:::
:::
::: {.column width="44%" .fragment}
::: {.panel-question}
[Co zůstává otevřené]{.panel-title}

- `r nrow(data_stromy)` stromů bez popsaného výběru.
- Rezidua ani vliv jednotlivých stromů jsme nekontrolovali.
- Nepopsal by vztah lépe zakřivený model?
:::
:::
:::

::: {.notes}
Objem kmene roste zhruba s druhou mocninou průměru krát výšce. Na logaritmickém měřítku se tento součin změní v součet a interakce tam data nedokládají; podrobněji box o měřítku ve skriptech.
:::

# Jedna myšlenka, tři obrazy

## Interakce mění sklon nebo skupinový rozdíl

```{r}
#| label: porovnat-tri-obrazy
#| echo: false
#| fig-width: 15
#| fig-height: 5.4
#| fig-alt: "Tři panely vedle sebe: vlevo dvě nerovnoběžné přímky pro samice a samce, uprostřed čtyři skupiny krabů s propojenými průměry, vpravo body stromů a dvě fialové přímky pro stromy vysoké 21 a 25 m; přímka vyšších stromů je strmější."
# Lines at the two comparison heights used on the result slide. Each spans
#   the diameters observed in the height band that contains that height, so
#   neither line extrapolates. Only two lines stay legible in this panel.
data_pasma_souhrn <- res_pasma_stromy$summary
vec_popisky_vysek <- paste(vysky_porovnani_m, "m")
data_vysky_pasem <-
  purrr::map(
    .x = seq_along(vysky_porovnani_m),
    .f = ~ {
      vyska_i <- vysky_porovnani_m[[.x]]
      index_pasma <-
        which(
          data_pasma_souhrn$vyska_min_m <= vyska_i &
            data_pasma_souhrn$vyska_max_m >= vyska_i
        )[[1]]
      data.frame(
        prumer_cm = seq(
          from = data_pasma_souhrn$prumer_min_cm[[index_pasma]],
          to = data_pasma_souhrn$prumer_max_cm[[index_pasma]],
          length.out = 50
        ),
        vyska_m = vyska_i,
        vyska_popisek = vec_popisky_vysek[[.x]]
      )
    }
  ) |>
  purrr::list_rbind()
data_vysky_pasem$vyska_popisek <-
  factor(x = data_vysky_pasem$vyska_popisek, levels = vec_popisky_vysek)
data_vysky_pasem$objem_odhad_m3 <-
  predict(object = mod_stromy, newdata = data_vysky_pasem)
data_popisky_vysek <-
  data_vysky_pasem |>
  dplyr::group_by(vyska_popisek) |>
  dplyr::slice_max(order_by = prumer_cm, n = 1) |>
  dplyr::ungroup()

graf_stromy_vysky <-
  ggplot2::ggplot(
    data = data_stromy,
    mapping = ggplot2::aes(x = prumer_cm, y = objem_m3)
  ) +
  ggplot2::geom_point(
    alpha = 0.7,
    size = 2.2,
    colour = biostat_cols[["graphite"]]
  ) +
  ggplot2::geom_line(
    data = data_vysky_pasem,
    mapping = ggplot2::aes(
      y = objem_odhad_m3,
      colour = vyska_popisek
    ),
    linewidth = 1.3
  ) +
  ggplot2::geom_text(
    data = data_popisky_vysek,
    mapping = ggplot2::aes(
      y = objem_odhad_m3,
      label = vyska_popisek,
      colour = vyska_popisek
    ),
    hjust = -0.15,
    size = 7,
    fontface = "bold"
  ) +
  # Both are model lines: lighter purple for the lower trees
  ggplot2::scale_colour_manual(
    values = c(biostat_cols[["amethyst"]], biostat_cols[["indigo_velvet"]]),
    guide = "none"
  ) +
  ggplot2::scale_x_continuous(
    expand = ggplot2::expansion(mult = c(0.05, 0.35))
  ) +
  ggplot2::labs(
    x = "Průměr kmene (cm)",
    y = "Objem dřeva (m³)"
  ) +
  theme_l08

cowplot::plot_grid(
  graf_interakce +
    ggplot2::ggtitle("číselný × skupinový"),
  graf_ctyri_prumery +
    ggplot2::ggtitle("skupinový × skupinový") +
    ggplot2::labs(colour = "Pohlaví", shape = "Pohlaví") +
    ggplot2::theme(
      legend.position = "bottom",
      strip.text = ggplot2::element_text(size = ggplot2::rel(0.75))
    ) +
    ggplot2::guides(fill = "none"),
  graf_stromy_vysky +
    ggplot2::ggtitle("číselný × číselný"),
  nrow = 1,
  labels = c("A", "B", "C"),
  align = "h",
  axis = "b"
)
```

::: columns
::: {.column width="32%"}
[Co se mění?]{.text-bold} Rozdíl mezi přímkami podél osy délky.
:::
::: {.column width="32%"}
[Co se mění?]{.text-bold} Rozdíl mezi pohlavími podle formy.
:::
::: {.column width="32%"}
[Co se mění?]{.text-bold} Sklon průměru s výškou stromu.
:::
:::

## Co musíme doplnit, aby tvrzení o efektu bylo úplné?

<br>

::: columns
::: {.column width="48%"}
::: {.panel-warning}
[Neúplné]{.panel-title}

„Délka má efekt.“

„Samci jsou větší.“

„Průměr kmene má efekt.“
:::
:::
::: {.column width="48%" .fragment}
::: {.panel-question}
[Opravte tvrzení]{.panel-title}

- Pro které pohlaví?
- Při jaké délce?
- V které barevné formě?
- Větší v jakém znaku?
- Při jaké výšce?
:::
:::
:::

<br>

::: {.fragment .panel-result}
V modelu s interakcí vždy uvádíme [hodnotu nebo úroveň druhého prediktoru]{.text-hgl-indigo_velvet}.
:::

::: {.notes}
Dvojice přepíší všechny tři věty tak, aby obsahovaly pohlaví, délku, formu nebo výšku a znak.
:::

## Jak číst model s interakcí?

::: {.slide-margin-top-15}
::: columns
::: {.column width="48%"}
::: {.panel-question .fragment}
[1. Otázka]{.panel-title}
Mění se [vztah nebo rozdíl]{.text-hgl-orange} podle druhého prediktoru?
:::

::: {.panel-data .fragment}
[2. Data a předpovědi]{.panel-title}
Ukažte body a [předpovědi pro konkrétní kombinace]{.text-hgl-indigo_velvet}.
:::
:::
::: {.column width="48%"}
::: {.panel-result .fragment}
[3. Koeficienty]{.panel-title}
Hlavní koeficient platí v [referenční skupině nebo při nule]{.text-hgl-indigo_velvet} druhého prediktoru.
:::

::: {.panel-warning .fragment}
[4. Závěr]{.panel-title}
Jen v rozsahu dat a jako souvislost, ne příčina.
:::
:::
:::
:::

## Co si odnést

::: {.incremental}
- Interakci potřebujeme, když vztah jednoho prediktoru [závisí na druhém]{.text-hgl-orange}; podpořit ji má biologická otázka i graf.
- `x * y` je zkratka pro `x + y + x:y`.
- Hlavní koeficienty jsou [podmíněné]{.text-hgl-indigo_velvet}; skupiny porovnáváme pomocí předpovědí při zvolené hodnotě.
- U dvou skupinových prediktorů je interakce [rozdíl dvou rozdílů]{.text-hgl-orange}.
- U dvou číselných prediktorů se [sklon jednoho plynule mění]{.text-hgl-orange} s hodnotou druhého.
- Závěr omezujeme na pozorovaný rozsah a na souvislost v pozorovacích datech.
:::

::: {.footer}
Data: Campbell, N. A. a Mahon, R. J. (1974) · Meyer, H. A. (1953) · `data/krabi.csv`, `data/stromy.csv`
:::

## Který biologicky smysluplný model máme zvolit?

::: columns
::: {.column width="50%"}
```{r}
#| label: zobrazit-krabi-modely
#| echo: false
#| out-width: "100%"
#| fig-alt: "Modří krabi na pláži porovnávají dvě dvojice stop v písku, vždy zelenou a růžovofialovou: vlevo zůstávají stopy rovnoběžné, vpravo se postupně rozcházejí."
include_local_figure("krabi_modely.png")
```

::: {.text-size-tiny .text-right}
Ilustrace vytvořená pomocí AI.
:::
:::
::: {.column width="46%"}
**Aditivní kandidát**

`zadni_sirka_mm ~`<br>
`delka_krunyre_mm + pohlavi`

[Stálý rozdíl]{.text-hgl-indigo_velvet}

<br>

**Interakční kandidát**

`zadni_sirka_mm ~`<br>
`delka_krunyre_mm * pohlavi`

[Měnící se rozdíl]{.text-hgl-orange}
:::
:::

::: {.fragment}
Jak mezi kandidáty vybírat, ukáže následující lekce.
:::

::: {.notes}
Krab stojí před dvěma dvojicemi stop: rovnoběžné stopy odpovídají aditivnímu modelu, rozbíhající se modelu s interakcí. Ani jedna cesta není automaticky správná; volbou mezi kandidáty se zabývá následující lekce.
:::

## Kde byste čekali interakci vy?

::: {.slide-margin-top-15}
::: {.panel-question .text-size-large}
Uveďte biologickou otázku, u které byste čekali, že vztah dvou znaků závisí na skupině nebo na hodnotě jiného znaku.

[Jak by vypadal graf?]{.text-hgl-orange}
:::
:::

::: {.notes}
Dvojice navrhnou vlastní příklad a načrtnou graf: rovnoběžné, nebo rozbíhající se přímky? Pokud nikoho nenapadne číselný příklad: růst semenáčků s teplotou může být strmější ve vlhčí půdě, takže graf by měl několik panelů pro různou vlhkost. Několik příkladů krátce sdílejte.
:::
