---
lang: cs
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.width = 7,
  fig.height = 5,
  fig.align = "center",
  out.width = "100%"
)

here::i_am("Presentation/presentation.qmd")
source(here::here("R", "set_r_theme.R"))
source(here::here("R", "Functions", "format_cz_math.R"))
source(here::here("R", "Functions", "include_optional_figure.R"))
source(here::here("R", "Functions", "ai_disclosure.R"))

path_materials <- "Presentation/Materials"

include_local_figure <- function(data_source) {
  knitr::include_graphics(
    path = here::here(path_materials, data_source),
    error = TRUE
  )
}
```

```{r}
#| label: dynamic-link-generation
#| include: false
project_name <-
  basename(here::here())

display_name <-
  paste0("Biostatistika - ", project_name)

github_url <-
  paste0(
    "https://github.com/CUNI-NATUR-Biostatistics/",
    project_name
  )

slides_url <-
  paste0(
    "https://CUNI-NATUR-Biostatistics.github.io/",
    project_name,
    "/"
  )
```

## Co nám statistický test dovoluje tvrdit? {.course-title .course-title-illustrated .bg-indigo}

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

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

::: {.course-title-formal}
Od velikosti efektu k testování hypotéz
:::

::: {.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: "Kompozitní ilustrace krabích výzkumníků s fialovou měřicí tyčí a skeptické volavky u okna do slaniska; dvě desky nesou schematické motivy rostoucího vztahu a rozdělení sklonů v nulovém světě. Ilustrace vytvořená pomocí AI."
include_local_figure("krabi_titulni_kompozice.png")
```
:::

::: {.course-title-caption}
Ilustrace vytvořená pomocí AI. Anatomická reference: Natalia Agudelo / SERC, CC BY 2.0.
:::

## Měsíc je celý ze sýra! {.text-center}

```{r}
#| label: zobrazit-mesic-ze-syra
#| echo: false
#| fig-cap: "Ilustrační obraz vytvořen AI."
#| fig-alt: "Humorná ilustrace Měsíce tvořeného sýrem; slouží jako příklad tvrzení, které lze ověřovat pozorováním."
include_local_figure("mesic_ze_syra.png")
```

::: {.notes}
Začínám záměrně absurdním tvrzením. Nechám pár vteřin smíchu a pak se zeptám, proč se smějeme: co o Měsíci víme a jak bychom to věděli? Cílem je otevřít otázku, co vůbec může věda tvrdit.
:::

## Co by mohlo změnit váš závěr?

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

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

<br>

::: {.box-question .text-center .text-size-large}
Jaké pozorování by vás přimělo tvrzení o sýrovém Měsíci vyvrátit?
:::

:::

::: {.column width="34%"}
```{r}
#| label: zobrazit-maly-mesic-ze-syra
#| echo: false
#| fig-alt: "Humorná ilustrace Měsíce tvořeného sýrem vedle otázky, jaké pozorování by mohlo změnit závěr."
include_local_figure("mesic_ze_syra.png")
```
:::

::::
:::

::: {.notes}
Krátká diskuze se sousedem, asi minuta. Hledám odpovědi typu vzorek horniny, chemické složení, hustota. Zdůrazním, že tvrzení je testovatelné, i když je zjevně nevěrohodné.
:::

## Která tvrzení mohou pozorování změnit?

:::: {.columns}

::: {.column width="24%" .fragment}
```{r}
#| label: zobrazit-tvrzeni-labute
#| echo: false
#| fig-alt: "Ilustrace bílých labutí k tvrzení, že všechny labutě jsou bílé."
include_local_figure("tvrzeni_labute.png")
```

::: {.text-center .text-bold}
Všechny labutě jsou bílé.
:::
:::

::: {.column width="24%" .fragment}
```{r}
#| label: zobrazit-tvrzeni-holub
#| echo: false
#| fig-alt: "Ilustrace holuba stěhovavého k tvrzení, že tento druh vyhynul."
include_local_figure("tvrzeni_holub_stehovavy.png")
```

::: {.text-center .text-bold}
Holub stěhovavý vyhynul.
:::
:::

::: {.column width="24%" .fragment}
```{r}
#| label: zobrazit-tvrzeni-mesic
#| echo: false
#| fig-alt: "Humorná ilustrace Měsíce tvořeného sýrem jako příklad empiricky ověřitelného tvrzení."
image_mesic <-
  magick::image_read(path = here::here(path_materials, "mesic_ze_syra.png"))
vyska_mesice <- magick::image_info(image = image_mesic)$height
image_mesic_ctverec <-
  magick::image_crop(
    image = image_mesic,
    geometry = magick::geometry_area(
      width = vyska_mesice,
      height = vyska_mesice,
      x_off = (magick::image_info(image = image_mesic)$width - vyska_mesice) %/% 2,
      y_off = 0
    )
  )
magick::image_write(
  image = image_mesic_ctverec,
  path = here::here(path_materials, "tvrzeni_mesic.png")
)
include_local_figure("tvrzeni_mesic.png")
```

::: {.text-center .text-bold}
Měsíc je celý ze sýra.
:::
:::

::: {.column width="24%" .fragment}
```{r}
#| label: zobrazit-tvrzeni-krasa
#| echo: false
#| fig-alt: "Ilustrace pestrého ptáka k hodnotovému tvrzení, že je nejkrásnější."
include_local_figure("tvrzeni_nejkrasnejsi_ptak.png")
```

::: {.text-center .text-bold}
Tento pták je nejkrásnější.
:::
:::

::::

::: {.box-question .text-center .fragment}
Která tvrzení může změnit nové pozorování? U kterého to nedává smysl?
:::

::: {.fragment .takeaway-strip}
[Testovatelné]{.text-hgl-indigo_velvet} neznamená pravděpodobné ani pravdivé. Pozorování jsou naše omezené informace o světě.
:::

::: {.notes}
U labutí stačí jedna spolehlivě určená černá labuť. U holuba je asymetrie: jeden živý jedinec závěr změní, ale když žádného nenajdeme, jistota roste jen pomalu. U nejkrásnějšího ptáka nejde o empirické tvrzení, ale o hodnotový soud.
:::

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

## Od intervalu k nulovému tvrzení

::: {.slide-margin-top-25}
::: {.takeaway-strip .text-center}
Interval ukazuje hodnoty slučitelné s daty. **Jak slučitelná jsou data s jednou konkrétní nulovou hodnotou?**
:::
:::

::: {.notes}
Most z minulé lekce: interval spolehlivosti jsme četli jako rozsah slučitelných efektů. V této lekci se ptáme opačně: vezmeme jednu přesně zadanou hodnotu, nulový sklon, a zjistíme, jak dobře se s ní data snesou.
:::

## Výsledky učení

::: {.slide-margin-top-15}
Po absolvování této přednášky budete schopni:

::: {.incremental}
- rozlišit [biologickou realitu]{.text-hgl-indigo_velvet} od toho, co zachytila konkrétní studie
- interpretovat pozorovaný [efekt a jeho nejistotu]{.text-hgl-indigo_velvet}
- převést biologické tvrzení na [nulovou a alternativní hypotézu]{.text-hgl-indigo_velvet} o sklonu
- vysvětlit, co vyjadřuje [p-hodnota]{.text-hgl-indigo_velvet} a co nevyjadřuje
- rozlišit chybu I. a II. typu a napsat opatrný vědecký závěr
:::
:::

::: {.notes}
Výsledky učení čtu nahlas jen stručně. Zdůrazním pořadí: nejdřív velikost efektu a nejistota, teprve potom p-hodnota.
:::

# Co z reality skutečně pozorujeme?

## Seznamte se: krab houslista

:::: {.columns}

::: {.column width="62%"}
```{r}
#| label: zobrazit-kraba-houslistu
#| echo: false
#| fig-alt: "Fotografie samce kraba houslisty s jedním výrazně zvětšeným klepetem na bahnitém dně slaniska."
include_local_figure("krab_houslista.jpg")
```
:::

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

<br>

::: {.text-size-heading .text-bold}
*Minuca pugnax*
:::

<br>

Samec nese jedno nápadně zvětšené klepeto.

<br>

Žije ve slaniscích podél Atlantiku.
:::

::::

::: {.footer}
Foto: Natalia Agudelo / Smithsonian Environmental Research Center, [Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Uca_pugnax_(I0443)_(14451829642).jpg), [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/).
:::

::: {.notes}
Představím organismus: krab houslista žije v bahnitých slaniscích, samec má jedno obří klepeto. Měříme šířku krunýře, ne klepeto.
:::

## Slaniska podél Atlantiku

```{r}
#| label: pripravit-mapu-lokalit
#| echo: false
#| message: false
#| warning: false
data_lokality <-
  readr::read_csv(
    file = here::here("data", "pie_crab_site_means.csv"),
    show_col_types = FALSE
  )

data_souradnice <-
  data.frame(
    kod_lokality = c(
      "GTM", "SI", "NIB", "ZI", "RC", "VCR", "DB",
      "JC", "CT", "NB", "CC", "BC", "PIE"
    ),
    zemepisna_delka = c(
      -81.327, -81.364, -79.205, -77.944, -76.676,
      -75.942, -75.437, -74.342, -71.981, -71.326,
      -70.068, -70.927, -70.849
    )
  )

data_mapa_lokality <-
  merge(
    x = data_lokality,
    y = data_souradnice,
    by = "kod_lokality"
  )

data_mapa_staty <-
  ggplot2::map_data("state") |>
  dplyr::filter(
    region %in% c(
      "florida", "georgia", "south carolina",
      "north carolina", "virginia", "maryland",
      "delaware", "new jersey", "new york",
      "connecticut", "rhode island", "massachusetts"
    )
  )

plot_mapa_lokalit <-
  ggplot2::ggplot() +
  ggplot2::geom_polygon(
    data = data_mapa_staty,
    mapping = ggplot2::aes(
      x = long,
      y = lat,
      group = group
    ),
    fill = biostat_cols[["amethyst"]],
    alpha = 0.16,
    color = biostat_cols[["grey_olive"]],
    linewidth = 0.45
  ) +
  ggplot2::geom_point(
    data = data_mapa_lokality,
    mapping = ggplot2::aes(
      x = zemepisna_delka,
      y = zemepisna_sirka
    ),
    shape = 21,
    fill = biostat_cols[["orange"]],
    color = biostat_cols[["indigo_velvet"]],
    size = 5,
    stroke = 0.9
  ) +
  ggplot2::coord_quickmap(
    xlim = c(-82.5, -68.5),
    ylim = c(29, 44),
    expand = FALSE
  ) +
  ggplot2::labs(
    x = "Zeměpisná délka",
    y = "Zeměpisná šířka"
  ) +
  theme_biostat(base_size = 16) +
  ggplot2::theme(
    plot.margin = ggplot2::margin(12, 18, 12, 24)
  ) +
  ggview::canvas(
    width = 900,
    height = 900,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_mapa_lokalit,
  file = here::here(path_materials, "mapa_lokalit.png")
)
```

:::: {.columns}

::: {.column width="57%"}
```{r}
#| label: zobrazit-mapu-lokalit
#| echo: false
#| out-width: "88%"
#| fig-alt: "Mapa atlantského pobřeží USA od Floridy po Massachusetts s oranžovými body sledovaných slanisek."
include_local_figure("mapa_lokalit.png")
```
:::

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

<br>

::: {.box-data}
[Co budeme pozorovat]{.panel-title}

- `r nrow(data_lokality)` slanisek od Floridy po Massachusetts
- jeden bod = průměrná šířka krunýře na jedné lokalitě
- zeměpisná šířka a velikost v milimetrech
:::

<br>

::: {.box-question}
Jak se průměrná velikost mění směrem na sever?
:::
:::

::::

::: {.footer}
Data: [LTER `pie_crab`](https://lter.github.io/lterdatasampler/articles/pie_crab_vignette.html), CC0; souřadnice: [Johnson et al. 2019](https://doi.org/10.1002/ece3.5883).
:::

::: {.notes}
Každý bod na mapě je jedno slanisko. Zdůrazním jednotku pozorování: v hlavním modelu pracujeme s průměrem lokality, ne s jednotlivými kraby. Proč, rozvedeme až u hierarchických dat.
:::

## Kterou proměnnou chceme vysvětlit?

::: {.slide-margin-top-15}
::: {.layout-grid-2}

::: {.panel-olive .text-center}
[Zeměpisná šířka]{.panel-title}

Poloha slaniska ve stupních severní šířky
:::

::: {.panel-olive .text-center}
[Průměrná šířka krunýře]{.panel-title}

Velikost samců na lokalitě v milimetrech
:::

:::

<br>
<br>

::: {.box-question .text-center .fragment}
Která proměnná je **prediktor** a která **odezva**?
:::
:::

::: {.notes}
Rychlé hlasování rukou. Prediktorem je zeměpisná šířka, odezvou průměrná šířka krunýře. Zeměpisná šířka sama nic nezpůsobuje; zastupuje teplotu, délku sezóny a další podmínky.
:::

## Bergmannovo pravidlo

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

::: {.column width="45%" .fragment}
::: {.blockquote}
Organismy bývají v chladnějších oblastech větší.
:::

<br>

U krabů to nemusí platit. Je to biologická předpověď, kterou porovnáme s daty.
:::

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

::: {.column width="50%" .fragment}
::: {.box-question .text-center}
Pokud by byli krabi na severu větší, jaký směr vztahu bychom očekávali?
:::

<br>

::: {.layout-grid-2}

::: {.panel-olive .text-center}
Klesající
:::

::: {.panel-olive .text-center}
Rostoucí
:::

:::
:::

::::
:::

::: {.notes}
Bergmannovo pravidlo uvádím jako biologickou předpověď, ne jako fakt. Studenti hlasují směr; správně je rostoucí vztah se zeměpisnou šířkou. Hned dodám, že předpověď ještě nic nedokazuje.
:::

## Co ukazují data?

```{r}
#| label: pripravit-graf-pozorovanych-dat
#| echo: false
#| message: false
#| warning: false
plot_body <-
  ggplot2::ggplot(
    data = data_lokality,
    mapping = ggplot2::aes(
      x = zemepisna_sirka,
      y = prumerna_sirka_mm
    )
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["grey_olive"]],
    size = 5
  ) +
  ggplot2::labs(
    x = "Zeměpisná šířka (° s. š.)",
    y = "Šířka krunýře (mm)"
  ) +
  theme_biostat(base_size = 17) +
  ggplot2::theme(
    plot.margin = ggplot2::margin(12, 18, 12, 30)
  ) +
  ggview::canvas(
    width = 1600,
    height = 850,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_body,
  file = here::here(path_materials, "prumery_bez_primky.png")
)
```

```{r}
#| label: zobrazit-prumery-bez-primky
#| echo: false
#| out-width: "92%"
include_local_figure("prumery_bez_primky.png")
```

::: {.takeaway-strip .fragment}
Popište směr a rozptyl bodů. Co je na obrazu přesvědčivé a co vás zneklidňuje?
:::

::: {.notes}
Necháme studenty popsat graf vlastními slovy, bez přímky. Přesvědčivý je převážně rostoucí směr; znepokojivé je, že bodů je málo a některé lokality vybočují.
:::

## Lineární model

```{r}
#| label: fitovat-model-a-pripravit-primku
#| echo: false
#| message: false
#| warning: false
mod_krabi <-
  lm(
    formula = prumerna_sirka_mm ~ zemepisna_sirka,
    data = data_lokality
  )

model_krabi_tidy <-
  broom::tidy(
    mod_krabi,
    conf.int = TRUE
  )

radek_interceptu_krabi <-
  model_krabi_tidy |>
  dplyr::filter(term == "(Intercept)")

radek_sklonu_krabi <-
  model_krabi_tidy |>
  dplyr::filter(term == "zemepisna_sirka")

odhad_interceptu <-
  radek_interceptu_krabi |>
  dplyr::pull(estimate)

odhad_sklonu <-
  radek_sklonu_krabi |>
  dplyr::pull(estimate)

stopifnot(
  isTRUE(all.equal(
    unname(model_krabi_tidy$estimate),
    unname(coef(mod_krabi))
  ))
)

plot_body_model <-
  plot_body +
  ggplot2::geom_abline(
    intercept = odhad_interceptu,
    slope = odhad_sklonu,
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 1.6
  )

ggview::save_ggplot(
  plot = plot_body_model,
  file = here::here(path_materials, "prumery_s_primkou.png")
)
```

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

::: {.column width="58%"}
```{r}
#| label: zobrazit-prumery-s-primkou
#| echo: false
include_local_figure("prumery_s_primkou.png")
```
:::

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

<br>

```{r}
#| label: ukazat-model-krabu
#| echo: true
#| eval: false
mod_krabi <-
  lm(
    formula = prumerna_sirka_mm ~
      zemepisna_sirka,
    data = data_lokality
  )
```

:::

::::
:::

::: {.notes}
Přímku studenti znají z minulých lekcí. Kód ukazuji jen pro orientaci; důležité je, že fialová přímka je odhad modelu, šedé body jsou data.
:::

## `summary()`

:::: {.columns}

::: {.column width="58%"}
```{r}
#| label: pripomenout-summary
#| echo: true
#| eval: false
summary(mod_krabi)
```

<br>

```{r}
#| label: zobrazit-koeficienty-modelu
#| echo: false
tabulka_summary <-
  model_krabi_tidy |>
  dplyr::transmute(
    Parametr = dplyr::recode(
      term,
      "(Intercept)" = "Intercept",
      "zemepisna_sirka" = "Zeměpisná šířka"
    ),
    Odhad = formatC(estimate, format = "f", digits = 3, decimal.mark = ","),
    `Std. chyba` = formatC(std.error, format = "f", digits = 3, decimal.mark = ","),
    `t` = formatC(statistic, format = "f", digits = 2, decimal.mark = ","),
    `p` = gsub(
      pattern = ".",
      replacement = ",",
      x = format.pval(p.value, digits = 3, eps = 0.001),
      fixed = TRUE
    )
  )

tinytable::tt(tabulka_summary) |>
  tinytable::style_tt(fontsize = 0.75)
```

::: {.panel-result}
[Odhadnutý model]{.panel-title}

Průměrná šířka = `r formatC(odhad_interceptu, format = "f", digits = 3, decimal.mark = ",")` + `r formatC(odhad_sklonu, format = "f", digits = 3, decimal.mark = ",")` × zeměpisná šířka + residuum
:::

:::

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

::: {.panel-data}
[Z minulé lekce]{.panel-title}

**Estimate** = intercept a sklon; **Std. Error** = nejistota odhadu.
:::

<br>

::: {.fragment .panel-question}
**Co znamenají `t value` a `Pr(>|t|)`?**
:::
:::

::::

::: {.notes}
Připomenu Estimate a Std. Error z minulé lekce. Poslední dva sloupce zatím neumíme číst; právě k nim celá přednáška směřuje.
:::

## Je naměřený vztah realita?

:::: {.columns}

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

```{r}
#| label: zobrazit-ilustraci-okno-do-reality
#| echo: false
#| out-width: "100%"
#| fig-alt: !expr 'if (file.exists(here::here(path_materials, "krabi_okno_do_reality.png"))) "Humorná ilustrace kraba houslisty s deskami, který se dívá malým dřevěným oknem terénní stanice na rozlehlé slanisko; vidí jen jeho výsek. Ilustrace vytvořená pomocí AI." else "Bodový graf průměrné šířky krunýře proti zeměpisné šířce s rostoucí fialovou přímkou modelu."'
# Planned illustration 1 (GENERATED_IMAGES.md); until generated, the anchor graph is shown.
include_optional_figure(
  data_source = "krabi_okno_do_reality.png",
  fallback = "prumery_s_primkou.png"
)
```

::: {.text-size-tiny .text-right}
`r ai_disclosure("krabi_okno_do_reality.png")`
:::
:::

::: {.column width="60%"}
::::: {.layout-stack .layout-center-y}
::: {.box-question}
Je fialová přímka skutečný vztah v přírodě, nebo odhad z této studie?
:::

::: {.fragment .panel-question}
Jak často by podobně silný vztah vznikl prostou náhodou ve světě bez systematického trendu?
:::
:::::
:::

::::

::: {.notes}
Obě otázky na tomto slidu nechám chvíli otevřené. Fialová přímka je odhad z jedné studie, ne skutečný vztah v přírodě. Druhá otázka už ukazuje směr celé přednášky: jak často by podobný sklon vznikl i bez skutečného trendu?

Ilustrace (pokud je vložena): krab vidí slanisko jen oknem stanice; i naše studie vidí realitu jen výsekem.
:::

##

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

::: {.column width="35%"}
::: {.panel-indigo .text-center .text-size-large}
[REALITA]{.panel-title}

[?]{.text-size-heading .text-bold .text-color-indigo_velvet}

Skutečný vztah ve všech možných lokalitách přímo nevidíme.
:::
:::

::: {.column width="15%" .text-center}

<br>
<br>

[→]{.text-size-heading .text-bold .text-color-orange}

[výběr, měření, místní rozdíly]{.text-size-smaller}
:::

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

```{r}
#| label: zobrazit-okno-studie
#| echo: false
#| fig-alt: "Graf průměrné šířky krunýře proti zeměpisné šířce s fialovou odhadnutou přímkou jako okno do reality."
include_local_figure("prumery_s_primkou.png")
```

::: {.text-center .text-bold}
NAŠE POZOROVÁNÍ: `r nrow(data_lokality)` lokalit
:::
:::

::::
:::

::: {.notes}
Realita je pro nás neviditelná. Vidíme ji jen přes okno konkrétní studie: vybrané lokality, měření a místní rozdíly mezi nimi.
:::


## Stejná realita, jiné pozorování

```{r}
#| label: pripravit-opakovane-pohledy
#| echo: false
#| message: false
#| warning: false
set.seed(900723)

rezidualni_sd_opakovane <-
  sigma(mod_krabi)

pocet_opakovanych_pohledu <- 200

data_opakovane_kandidati <-
  purrr::map(
    .x = seq_len(pocet_opakovanych_pohledu),
    .f = ~ {
      data_opakovany_pohled <-
        data.frame(
          studie = .x,
          zemepisna_sirka = data_lokality$zemepisna_sirka,
          simulovana_sirka =
            fitted(mod_krabi) +
            rnorm(
              n = nrow(data_lokality),
              mean = 0,
              sd = rezidualni_sd_opakovane
            )
        )

      mod_opakovany_pohled <-
        lm(
          formula = simulovana_sirka ~ zemepisna_sirka,
          data = data_opakovany_pohled
        )

      data_opakovany_pohled |>
        dplyr::mutate(
          intercept = coef(mod_opakovany_pohled)[["(Intercept)"]],
          sklon = coef(mod_opakovany_pohled)[["zemepisna_sirka"]]
        )
    }
  ) |>
  purrr::list_rbind()

vec_vybrane_studie <-
  data_opakovane_kandidati |>
  dplyr::distinct(studie, sklon) |>
  dplyr::arrange(sklon) |>
  dplyr::slice(c(5, 100, 195)) |>
  dplyr::pull(studie)

data_opakovane_pohledy <-
  data_opakovane_kandidati |>
  dplyr::filter(studie %in% vec_vybrane_studie) |>
  dplyr::mutate(
    studie = factor(
      studie,
      levels = vec_vybrane_studie,
      labels = c(1, 2, 3)
    )
  )

list_opakovane_pohledy <-
  data_opakovane_pohledy |>
  dplyr::group_split(studie) |>
  purrr::map2(
    .y = c("Studie A", "Studie B", "Studie C"),
    .f = ~ ggplot2::ggplot(
      data = .x,
      mapping = ggplot2::aes(
        x = zemepisna_sirka,
        y = simulovana_sirka
      )
    ) +
      ggplot2::geom_abline(
        intercept = coef(mod_krabi)[["(Intercept)"]],
        slope = odhad_sklonu,
        color = biostat_cols[["graphite"]],
        linetype = "dashed",
        linewidth = 1.1
      ) +
      ggplot2::geom_point(
        color = biostat_cols[["grey_olive"]],
        size = 3.1
      ) +
      ggplot2::geom_smooth(
        method = "lm",
        formula = y ~ x,
        se = FALSE,
        color = biostat_cols[["indigo_velvet"]],
        linewidth = 1.2
      ) +
      ggplot2::coord_cartesian(
        xlim = range(data_lokality$zemepisna_sirka),
        ylim = range(data_opakovane_pohledy$simulovana_sirka)
      ) +
      ggplot2::labs(
        title = .y,
        x = "Zeměpisná šířka",
        y = "Průměrná velikost (mm)"
      ) +
      theme_biostat(base_size = 13) +
      ggplot2::theme(
        plot.margin = ggplot2::margin(10, 12, 10, 18)
      ) +
      ggview::canvas(
        width = 720,
        height = 650,
        units = "px"
      )
  )

vec_soubory_pohledu <-
  c(
    "pozorovani_a.png",
    "pozorovani_b.png",
    "pozorovani_c.png"
  )

purrr::walk2(
  .x = list_opakovane_pohledy,
  .y = vec_soubory_pohledu,
  .f = ~ ggview::save_ggplot(
    plot = .x,
    file = here::here(path_materials, .y)
  )
)
```

:::: {.columns}

<br>

::: {.column width="32%"}
```{r}
#| label: zobrazit-prvni-pohled
#| echo: false
include_local_figure("pozorovani_a.png")
```
:::

::: {.column width="32%"}
::: {.fragment}
```{r}
#| label: zobrazit-druhy-pohled
#| echo: false
include_local_figure("pozorovani_b.png")
```
:::
:::

::: {.column width="32%"}
::: {.fragment}
```{r}
#| label: zobrazit-treti-pohled
#| echo: false
include_local_figure("pozorovani_c.png")
```
:::
:::

::::

::: {.fragment .takeaway-strip}
Výsledek se změnil, protože se změnila [pozorování]{.text-hgl-orange}; předpokládaný biologický vztah zůstal stejný.
:::

::: {.footer}
Pro názornost jsou z `r pocet_opakovanych_pohledu` simulací vybrány pohledy s nízkým, středním a vysokým odhadnutým sklonem.
:::

::: {.notes}
Tři simulované studie ze stejné reality: šedá čárkovaná přímka je předpokládaný vztah, fialová plná přímka odhad z každé studie. Výsledek se mění, protože se mění pozorování, ne realita.
:::

## Jak široké je naše okno do reality?

```{r}
#| label: pripravit-interval-sklonu
#| echo: false
#| message: false
#| warning: false
interval_sklonu <-
  c(
    radek_sklonu_krabi$conf.low,
    radek_sklonu_krabi$conf.high
  )

data_interval <-
  data.frame(
    odhad = odhad_sklonu,
    dolni = interval_sklonu[[1]],
    horni = interval_sklonu[[2]],
    radek = 1
  )

plot_interval <-
  ggplot2::ggplot(
    data = data_interval,
    mapping = ggplot2::aes(
      x = odhad,
      y = radek
    )
  ) +
  ggplot2::geom_segment(
    mapping = ggplot2::aes(
      x = dolni,
      xend = horni,
      yend = radek
    ),
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 3
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["orange"]],
    size = 6
  ) +
  ggplot2::annotate(
    geom = "text",
    x = odhad_sklonu,
    y = 1.12,
    label = paste0(
      "odhad ",
      formatC(
        odhad_sklonu,
        format = "f",
        digits = 3,
        decimal.mark = ","
      )
    ),
    color = biostat_cols[["orange"]],
    size = 5,
    fontface = "bold"
  ) +
  ggplot2::scale_y_continuous(
    limits = c(0.72, 1.28),
    breaks = NULL
  ) +
  ggplot2::labs(
    x = "Sklon (mm na 1° severněji)",
    y = NULL
  ) +
  theme_biostat(base_size = 17)

plot_interval_velky <-
  plot_interval +
  ggview::canvas(
    width = 1600,
    height = 650,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_interval_velky,
  file = here::here(path_materials, "interval_sklonu_velky.png")
)

```

:::: {.columns}

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

<br>

::: {.text-size-large .text-bold .text-color-indigo_velvet .text-center}
Odhad a 95% interval spolehlivosti
:::

<br>

```{r}
#| label: zobrazit-kartu-nejistoty
#| echo: false
include_local_figure("interval_sklonu_velky.png")
```
:::

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

<br>


::: {.panel-result .fragment}
[Co odhadujeme]{.panel-title}

Sklon: **`r formatC(odhad_sklonu, format = "f", digits = 3, decimal.mark = ",")` mm/°**
:::

<br>

::: {.panel-question .fragment}
[Jak přesně]{.panel-title}

95% CI: **[`r formatC(interval_sklonu[[1]], format = "f", digits = 3, decimal.mark = ",")`; `r formatC(interval_sklonu[[2]], format = "f", digits = 3, decimal.mark = ",")`] mm/°**
:::

<br>

::: {.panel-warning .fragment}
Pouze `r nrow(data_lokality)` lokalit a jednoduchý observační model.
:::
:::

::::

::: {.notes}
Připomenutí z minulé lekce: bodový odhad a 95% interval. Celý interval leží nad nulou, ale je poměrně široký. Upozorním na malý počet lokalit.
:::

## Rychlá kontrola modelu

```{r}
#| label: pripravit-diagnostiku-modelu
#| echo: false
#| message: false
#| warning: false
data_diagnostika <-
  data_lokality |>
  dplyr::mutate(
    odhadnuta_hodnota = fitted(mod_krabi),
    residuum = resid(mod_krabi)
  )

plot_hustota_residui <-
  ggplot2::ggplot(
    data = data_diagnostika,
    mapping = ggplot2::aes(x = residuum)
  ) +
  ggplot2::geom_density(
    fill = biostat_cols[["amethyst"]],
    color = biostat_cols[["indigo_velvet"]],
    alpha = 0.45,
    linewidth = 1
  ) +
  ggplot2::geom_vline(
    xintercept = 0,
    color = biostat_cols[["graphite"]],
    linetype = "dashed"
  ) +
  ggplot2::labs(
    title = "Rozdělení residuí",
    x = "Residuum (mm)",
    y = NULL
  ) +
  theme_biostat(base_size = 12)

plot_residua_odhad <-
  ggplot2::ggplot(
    data = data_diagnostika,
    mapping = ggplot2::aes(
      x = odhadnuta_hodnota,
      y = residuum
    )
  ) +
  ggplot2::geom_hline(
    yintercept = 0,
    color = biostat_cols[["graphite"]],
    linetype = "dashed"
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["grey_olive"]],
    size = 2.7
  ) +
  ggplot2::labs(
    title = "Residua vs. odhady",
    x = "Odhad modelu (mm)",
    y = "Residuum (mm)"
  ) +
  theme_biostat(base_size = 12)

plot_diagnostika_mala <-
  cowplot::plot_grid(
    plot_hustota_residui,
    plot_residua_odhad,
    ncol = 2
  ) +
  ggview::canvas(
    width = 1600,
    height = 720,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_diagnostika_mala,
  file = here::here(path_materials, "diagnostika_modelu.png")
)
```

```{r}
#| label: zobrazit-diagnostiku-modelu
#| echo: false
#| out-width: "88%"
include_local_figure("diagnostika_modelu.png")
```

::: {.takeaway-strip .text-center}
V residuích nevidíme nápadný problém, který by jednoduchý lineární model okamžitě zpochybnil.
:::

::: {.notes}
Kontrolu residuí děláme po každém modelu. Při tak malém počtu bodů posuzujeme tvar rozdělení jen velmi opatrně; hledáme hlavně oblouk nebo trychtýř.
:::

## Co už víme — a co stále nevidíme?

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

::: {.column width="48%"}
::: {.panel-result}
[Co zachytila studie]{.panel-title}

**Kladný pozorovaný sklon**

::: {.incremental}
- jeho velikost v mm/°
- interval slučitelných efektů
- žádný nápadný problém v základní diagnostice
:::
:::
:::

::: {.column width="48%"}
::: {.panel-question .fragment .incremental}
[Co nevidíme přímo]{.panel-title}

- skutečný populační sklon
- výsledek jiné možné studie
- příčinný biologický mechanismus
- zda by pozorovaný vztah nemohl vzniknout prostou náhodou
:::
:::

::::
:::::

::: {.notes}
Poslední bod vpravo je most k další části: co kdyby žádný trend nebyl?
:::

# Co kdyby žádný trend nebyl?

## Co bychom pozorovali bez trendu?

:::: {.columns}

::: {.column width="44%"}
::: {.panel-indigo .text-center}
::: {.text-size-heading .text-bold}
HYPOTETICKÁ REALITA
:::

Skutečný systematický sklon je **přesně 0 mm/°**.

Lokality se přesto biologicky liší.
:::
:::

::: {.column width="52%" .fragment}

<br>

::: {.box-question}
Musí být odhadnutý sklon v každé pozorované studii také přesně nulový?
:::

<br>

::: {.panel-olive}
**A)** Ano, všechny přímky budou vodorovné.
:::

::: {.panel-olive}
[**B)** Ne, sklony se budou náhodně lišit kolem nuly.]{.rn-circle-orange}
:::

::: {.panel-olive}
**C)** Ne, všechny budou kladné.
:::

:::

::::

::: {.notes}
Hlasování A/B/C. Správně je B: i bez trendu vznikají náhodou mírně rostoucí i klesající přímky. Odpověď hned ověříme simulací.
:::

## Jak náhoda vytvoří nenulový sklon?

```{r}
#| label: pripravit-nulovy-svet-s-residui
#| echo: false
#| message: false
#| warning: false
set.seed(900723)

prumer_nuloveho_modelu <-
  mean(data_lokality$prumerna_sirka_mm)

rezidualni_sd_nulovy_svet <-
  sigma(mod_krabi)

data_nulova_prvni <-
  data.frame(
    zemepisna_sirka = data_lokality$zemepisna_sirka,
    simulovana_sirka =
      prumer_nuloveho_modelu +
      rnorm(
        n = nrow(data_lokality),
        mean = 0,
        sd = rezidualni_sd_nulovy_svet
      )
  )

plot_nulova_residua <-
  ggplot2::ggplot(
    data = data_nulova_prvni,
    mapping = ggplot2::aes(
      x = zemepisna_sirka,
      y = simulovana_sirka
    )
  ) +
  ggplot2::geom_hline(
    yintercept = prumer_nuloveho_modelu,
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 1.5
  ) +
  ggplot2::geom_segment(
    mapping = ggplot2::aes(
      xend = zemepisna_sirka,
      y = prumer_nuloveho_modelu,
      yend = simulovana_sirka
    ),
    color = biostat_cols[["orange"]],
    linewidth = 0.9,
    alpha = 0.8
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["grey_olive"]],
    size = 4.1
  ) +
  ggplot2::labs(
    x = "Zeměpisná šířka",
    y = "Šířka (mm)"
  ) +
  theme_biostat(base_size = 14) +
  ggplot2::theme(
    plot.margin = ggplot2::margin(10, 16, 10, 18)
  ) +
  ggview::canvas(
    width = 1600,
    height = 680,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_nulova_residua,
  file = here::here(path_materials, "nulovy_svet_residua.png")
)
```

::: {.text-size-heading .text-bold .text-center}
[pozorovaná velikost]{.text-hgl-graphite} = [základní úroveň + 0 × zeměpisná šířka]{.text-hgl-indigo_velvet} + [náhodné residuum]{.text-hgl-orange}
:::

```{r}
#| label: zobrazit-nulovy-svet-s-residui
#| echo: false
#| out-width: "88%"
include_local_figure("nulovy_svet_residua.png")
```

::: {.takeaway-strip .text-center}
Systematický sklon zůstává nulový. Náhodná residua posouvají jednotlivé body nad a pod vodorovnou přímku.
:::

::: {.notes}
Vysvětlím rovnici barvami: šedá je pozorovaná velikost, fialová systematická část se sklonem nula, oranžová náhodné residuum. Velikost residuí bereme z našeho krabího modelu.
:::

## Nulový trend, různé odhadnuté přímky

```{r}
#| label: pripravit-nulove-studie-male-nasobky
#| echo: false
#| message: false
#| warning: false
set.seed(900723)

data_nulove_ukazky <-
  purrr::map(
    .x = seq_len(12),
    .f = ~ {
      data_nulova_studie <-
        data.frame(
          simulace = factor(.x),
          zemepisna_sirka = data_lokality$zemepisna_sirka,
          simulovana_sirka =
            prumer_nuloveho_modelu +
            rnorm(
              n = nrow(data_lokality),
              mean = 0,
              sd = rezidualni_sd_nulovy_svet
            )
        )

      mod_nulova_studie <-
        lm(
          formula = simulovana_sirka ~ zemepisna_sirka,
          data = data_nulova_studie
        )

      data_nulova_studie |>
        dplyr::mutate(
          intercept = coef(mod_nulova_studie)[["(Intercept)"]],
          sklon = coef(mod_nulova_studie)[["zemepisna_sirka"]]
        )
    }
  ) |>
  purrr::list_rbind()

plot_nulove_studie <-
  ggplot2::ggplot(
    data = data_nulove_ukazky,
    mapping = ggplot2::aes(
      x = zemepisna_sirka,
      y = simulovana_sirka
    )
  ) +
  ggplot2::geom_hline(
    yintercept = prumer_nuloveho_modelu,
    color = biostat_cols[["amethyst"]],
    linetype = "dashed",
    linewidth = 0.7
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["grey_olive"]],
    size = 1.7,
    alpha = 0.82
  ) +
  ggplot2::geom_abline(
    data = data_nulove_ukazky |>
      dplyr::distinct(simulace, intercept, sklon),
    mapping = ggplot2::aes(
      intercept = intercept,
      slope = sklon
    ),
    inherit.aes = FALSE,
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 0.9
  ) +
  ggplot2::facet_wrap(
    facets = ggplot2::vars(simulace),
    ncol = 4
  ) +
  ggplot2::labs(
    x = "Zeměpisná šířka",
    y = "Šířka (mm)"
  ) +
  theme_biostat(base_size = 12) +
  ggplot2::theme(
    plot.margin = ggplot2::margin(8, 12, 8, 16)
  ) +
  ggview::canvas(
    width = 1600,
    height = 900,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_nulove_studie,
  file = here::here(path_materials, "nulove_studie_male_nasobky.png")
)
```

```{r}
#| label: zobrazit-nulove-studie-male-nasobky
#| echo: false
#| out-width: "94%"
include_local_figure("nulove_studie_male_nasobky.png")
```

::: {.takeaway-strip .text-center}
Nulová realita zůstala stejná. Měnila se pozorování, a proto se měnily i odhadnuté sklony.
:::

::: {.notes}
Dvanáct studií ze světa bez trendu. Necháme studenty najít nejstrmější rostoucí a klesající přímku.
:::

## Sledujte cestu jednoho náhodného sklonu

```{r}
#| label: simulovat-nulove-studie-pro-animaci
#| echo: false
#| message: false
#| warning: false
set.seed(900723)

pocet_nulovych_studii_animace <- 500

data_nulove_animace <-
  purrr::map(
    .x = seq_len(pocet_nulovych_studii_animace),
    .f = ~ {
      data_nulova_studie <-
        data.frame(
          simulace = .x,
          zemepisna_sirka = data_lokality$zemepisna_sirka,
          simulovana_sirka =
            prumer_nuloveho_modelu +
            rnorm(
              n = nrow(data_lokality),
              mean = 0,
              sd = rezidualni_sd_nulovy_svet
            )
        )

      mod_nulova_studie <-
        lm(
          formula = simulovana_sirka ~ zemepisna_sirka,
          data = data_nulova_studie
        )

      data_nulova_studie |>
        dplyr::mutate(
          intercept = coef(mod_nulova_studie)[["(Intercept)"]],
          sklon = coef(mod_nulova_studie)[["zemepisna_sirka"]]
        )
    }
  ) |>
  purrr::list_rbind()

data_sklony_animace <-
  data_nulove_animace |>
  dplyr::distinct(simulace, intercept, sklon)

vec_meze_histogramu <-
  seq(
    from = floor(min(data_sklony_animace$sklon) * 100) / 100,
    to = ceiling(max(data_sklony_animace$sklon) * 100) / 100,
    length.out = 25
  )

max_cetnost_animace <-
  max(
    hist(
      x = data_sklony_animace$sklon,
      breaks = vec_meze_histogramu,
      plot = FALSE
    )$counts
  )

vec_indexy_snimku <-
  unique(
    round(
      seq(
        from = 1,
        to = pocet_nulovych_studii_animace,
        length.out = 125
      )
    )
  )
```

```{r}
#| label: vytvorit-snimky-animace-nulovych-sklonu
#| echo: false
#| message: false
#| warning: false
path_frames_nulove <-
  here::here("Temp", "nulovy_svet_frames_500")

# Frames are saved at 90 dpi; align showtext font metrics with that resolution.
showtext::showtext_opts(dpi = 90)

fs::dir_create(path_frames_nulove)

vec_frame_paths_nulove <-
  vec_indexy_snimku |>
  purrr::map_chr(
    .f = ~ {
      data_frame_studie <-
        data_nulove_animace |>
        dplyr::filter(simulace == .x)

      data_frame_sklony <-
        data_sklony_animace |>
        dplyr::filter(simulace <= .x)

      aktualni_sklon <-
        data_frame_studie |>
        dplyr::distinct(sklon) |>
        dplyr::pull(sklon)

      aktualni_intercept <-
        data_frame_studie |>
        dplyr::distinct(intercept) |>
        dplyr::pull(intercept)

      plot_frame_studie <-
        ggplot2::ggplot(
          data = data_frame_studie,
          mapping = ggplot2::aes(
            x = zemepisna_sirka,
            y = simulovana_sirka
          )
        ) +
        ggplot2::geom_hline(
          yintercept = prumer_nuloveho_modelu,
          color = biostat_cols[["amethyst"]],
          linetype = "dashed",
          linewidth = 1
        ) +
        ggplot2::geom_point(
          color = biostat_cols[["grey_olive"]],
          size = 3.2
        ) +
        ggplot2::geom_abline(
          intercept = aktualni_intercept,
          slope = aktualni_sklon,
          color = biostat_cols[["orange"]],
          linewidth = 1.2
        ) +
        ggplot2::coord_cartesian(
          xlim = range(data_lokality$zemepisna_sirka),
          ylim = range(data_nulove_animace$simulovana_sirka)
        ) +
        ggplot2::labs(
          title = paste0("Studie ", .x, "/", pocet_nulovych_studii_animace),
          subtitle = paste0(
            "odhad sklonu = ",
            formatC(
              aktualni_sklon,
              format = "f",
              digits = 3,
              decimal.mark = ","
            )
          ),
          x = "Zeměpisná šířka",
          y = NULL
        ) +
        theme_biostat(base_size = 24) +
        ggplot2::theme(
          plot.title = ggplot2::element_text(size = 30),
          plot.subtitle = ggplot2::element_text(size = 22),
          axis.title = ggplot2::element_text(size = 24),
          axis.title.x = ggplot2::element_text(margin = ggplot2::margin(t = 8)),
          axis.title.y = ggplot2::element_text(margin = ggplot2::margin(r = 8)),
          axis.text = ggplot2::element_text(size = 20),
          plot.margin = ggplot2::margin(8, 10, 12, 30)
        )

      plot_frame_histogram <-
        ggplot2::ggplot(
          data = data_frame_sklony,
          mapping = ggplot2::aes(x = sklon)
        ) +
        ggplot2::geom_histogram(
          breaks = vec_meze_histogramu,
          fill = biostat_cols[["amethyst"]],
          color = "white",
          alpha = 0.8
        ) +
        ggplot2::geom_vline(
          xintercept = aktualni_sklon,
          color = biostat_cols[["orange"]],
          linewidth = 1.2
        ) +
        ggplot2::coord_cartesian(
          xlim = range(vec_meze_histogramu),
          ylim = c(0, max_cetnost_animace + 1)
        ) +
        ggplot2::labs(
          title = paste0("Sklony ", .x, "/", pocet_nulovych_studii_animace),
          subtitle = if (.x < pocet_nulovych_studii_animace) "histogram se postupně plní" else NULL,
          x = "Odhadnutý sklon (mm/°)",
          y = "Počet"
        ) +
        theme_biostat(base_size = 24) +
        ggplot2::theme(
          plot.title = ggplot2::element_text(size = 30),
          plot.subtitle = ggplot2::element_text(size = 22),
          axis.title = ggplot2::element_text(size = 24),
          axis.title.x = ggplot2::element_text(margin = ggplot2::margin(t = 8)),
          axis.title.y = ggplot2::element_text(margin = ggplot2::margin(r = 8)),
          axis.text = ggplot2::element_text(size = 20),
          plot.margin = ggplot2::margin(8, 14, 12, 10)
        )

      plot_frame_nulovy <-
        cowplot::plot_grid(
          plot_frame_studie,
          plot_frame_histogram,
          ncol = 2,
          rel_widths = c(1, 1)
        )

      path_frame_nulovy <-
        fs::path(
          path_frames_nulove,
          paste0(
            "frame_",
            formatC(.x, width = 3, flag = "0"),
            ".png"
          )
        )

      ggplot2::ggsave(
        filename = path_frame_nulovy,
        plot = plot_frame_nulovy,
        width = 14,
        height = 7,
        units = "in",
        dpi = 90,
        bg = biostat_cols[["parchment"]]
      )

      path_frame_nulovy
    }
  )

showtext::showtext_opts(dpi = 300)
```

```{r}
#| label: slozit-animaci-nulovych-sklonu
#| echo: false
#| message: false
#| warning: false
vec_animacni_soubory_nulove <-
  c(
    rep(vec_frame_paths_nulove[[1]], times = 8),
    vec_frame_paths_nulove,
    rep(vec_frame_paths_nulove[[length(vec_frame_paths_nulove)]], times = 16)
  )

image_animace_nulove <-
  vec_animacni_soubory_nulove |>
  magick::image_read() |>
  magick::image_animate(
    fps = 10,
    loop = 0
  )

magick::image_write(
  image = image_animace_nulove,
  path = here::here(path_materials, "nulovy_sklon_do_histogramu.gif"),
  format = "gif"
)

fs::file_copy(
  path = vec_frame_paths_nulove[[length(vec_frame_paths_nulove)]],
  new_path = here::here(path_materials, "nulovy_sklon_histogram_final.png"),
  overwrite = TRUE
)
```

```{r}
#| label: zobrazit-animaci-nulovych-sklonu
#| echo: false
include_local_figure("nulovy_sklon_do_histogramu.gif")
```

::: {.strip-amethyst .text-center}
Nová náhodná residua → nový soubor bodů → nový sklon → další část histogramu.
:::

::: {.notes}
Animaci nechám proběhnout jednou celou. Vlevo jedna studie, vpravo se z jejích sklonů postupně staví histogram.
:::

## Po `r pocet_nulovych_studii_animace` nulových studiích

```{r}
#| label: zobrazit-finalni-histogram-nulovych-sklonu
#| echo: false
include_local_figure("nulovy_sklon_histogram_final.png")
```

::: {.box-question .text-center .fragment}
Kolem které hodnoty se sklony shlukují? Kam byste umístili náš pozorovaný sklon?
:::

::: {.notes}
Statický konec animace. Sklony se shlukují kolem nuly. Studenti odhadnou, kam by patřil náš sklon, ještě než ho ukážeme.
:::

## Stejný nulový svět, ale s naším pozorováním

```{r}
#| label: pripravit-pozorovani-proti-nulovym-sklonum
#| echo: false
#| message: false
#| warning: false
set.seed(900723)

pocet_nulovych_studii <- 5000

vec_nulove_sklony <-
  purrr::map_dbl(
    .x = seq_len(pocet_nulovych_studii),
    .f = ~ {
      data_nulovy_vyber <-
        data_lokality |>
        dplyr::mutate(
          simulovana_sirka =
            prumer_nuloveho_modelu +
            rnorm(
              n = nrow(data_lokality),
              mean = 0,
              sd = rezidualni_sd_nulovy_svet
            )
        )

      mod_nulovy <-
        lm(
          formula = simulovana_sirka ~ zemepisna_sirka,
          data = data_nulovy_vyber
        )

      coef(mod_nulovy)[["zemepisna_sirka"]]
    }
  )

data_nulove_sklony <-
  data.frame(sklon = vec_nulove_sklony)

plot_nulove_sklony <-
  ggplot2::ggplot(
    data = data_nulove_sklony,
    mapping = ggplot2::aes(x = sklon)
  ) +
  ggplot2::geom_histogram(
    bins = 55,
    fill = biostat_cols[["amethyst"]],
    color = "white",
    linewidth = 0.2,
    alpha = 0.8
  ) +
  ggplot2::geom_vline(
    xintercept = 0,
    color = biostat_cols[["graphite"]],
    linetype = "dashed",
    linewidth = 1.2
  ) +
  ggplot2::geom_vline(
    xintercept = odhad_sklonu,
    color = biostat_cols[["orange"]],
    linewidth = 1.7
  ) +
  ggplot2::annotate(
    geom = "text",
    x = odhad_sklonu,
    y = Inf,
    label = "náš sklon",
    vjust = 1.6,
    hjust = 1.05,
    color = biostat_cols[["orange"]],
    size = 4.2,
    fontface = "bold"
  ) +
  ggplot2::coord_cartesian(
    xlim = c(
      min(data_nulove_sklony$sklon),
      odhad_sklonu + 0.07
    )
  ) +
  ggplot2::labs(
    title = paste0(
      format(
        pocet_nulovych_studii,
        big.mark = " "
      ),
      " nulových studií"
    ),
    x = "Odhadnutý sklon (mm/°)",
    y = "Počet"
  ) +
  theme_biostat(base_size = 10) +
  ggplot2::theme(
    plot.title = ggplot2::element_text(size = 10),
    axis.title = ggplot2::element_text(size = 8),
    axis.text = ggplot2::element_text(size = 7),
    plot.margin = ggplot2::margin(8, 14, 12, 10)
  )

plot_pozorovana_studie <-
  plot_body +
  ggplot2::geom_abline(
    intercept = odhad_interceptu,
    slope = odhad_sklonu,
    color = biostat_cols[["orange"]],
    linewidth = 1.6
  ) +
  ggplot2::labs(
    title = "Naše studie",
    subtitle = paste0(
      "pozorovaný sklon = ",
      formatC(
        odhad_sklonu,
        format = "f",
        digits = 3,
        decimal.mark = ","
      ),
      " mm/°"
    ),
    x = "Zeměpisná šířka",
    y = "Šířka (mm)"
  ) +
  ggplot2::theme(
    plot.title = ggplot2::element_text(size = 10),
    plot.subtitle = ggplot2::element_text(size = 8),
    axis.title = ggplot2::element_text(size = 8),
    axis.text = ggplot2::element_text(size = 7),
    plot.margin = ggplot2::margin(8, 10, 12, 14)
  )

plot_pozorovani_proti_nule <-
  cowplot::plot_grid(
    plot_pozorovana_studie,
    plot_nulove_sklony,
    ncol = 2,
    rel_widths = c(1, 1)
  ) +
  ggview::canvas(
    width = 1600,
    height = 760,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_pozorovani_proti_nule,
  file = here::here(path_materials, "pozorovani_proti_nulovym_sklonum.png")
)
```

```{r}
#| label: zobrazit-pozorovani-proti-nulovym-sklonum
#| echo: false
include_local_figure("pozorovani_proti_nulovym_sklonum.png")
```

::: {.panel-result .text-center .fragment}
Nenulové sklony vznikají v nulovém světě běžně. Sklon tak velký jako náš je však mimořádně daleko od většiny simulací.
:::

::: {.notes}
Náš sklon leží úplně mimo většinu nulových simulací. Abychom řekli, jak daleko, potřebujeme měřítko: standardní chybu.
:::

## Jak vzdálené je naše pozorování od nuly?

```{r}
#| label: odvodit-testove-statistiky-sklonu
#| echo: false
#| message: false
#| warning: false
standardni_chyba_sklonu <-
  radek_sklonu_krabi |>
  dplyr::pull(std.error)
```

<br>

:::: {.columns}

::: {.column width="58%"}
| | Hodnota |
|---|---:|
| Pozorovaný efekt | `r formatC(odhad_sklonu, format = "f", digits = 3, decimal.mark = ",")` mm/° |
| Efekt v nulovém světě | 0 mm/° |
| Rozdíl | `r formatC(odhad_sklonu, format = "f", digits = 3, decimal.mark = ",")` mm/° |
| Standardní chyba odhadu | `r formatC(standardni_chyba_sklonu, format = "f", digits = 4, decimal.mark = ",")` mm/° |
:::

::: {.column width="40%"}
```{r}
#| label: zobrazit-ilustraci-mereni-v-se
#| echo: false
#| fig-alt: "Humorná ilustrace dvou krabů houslistů, kteří na bahnité pláži odměřují vzdálenost od tmavého kolíku k oranžovému praporku stejně dlouhými fialovými tyčkami. Ilustrace vytvořená pomocí AI."
# Planned illustration 2 (GENERATED_IMAGES.md); the slot stays empty until generated.
include_optional_figure(data_source = "krabi_mereni_v_se.png")
```

::: {.text-size-tiny .text-right}
`r ai_disclosure("krabi_mereni_v_se.png")`
:::
:::

::::

<br>

::: {.box-question .text-center .fragment}
Kolikrát se standardní chyba vejde do rozdílu mezi pozorovaným a nulovým sklonem?
:::

::: {.notes}
Nechám studenty spočítat na kalkulačce nebo odhadnout zpaměti: rozdíl děleno standardní chybou.

Ilustrace (pokud je vložena): krabi měří vzdálenost od nuly stejně dlouhými fialovými tyčkami; každá tyčka je jedna standardní chyba.
:::

## Vzdálenost ve standardních chybách

```{r}
#| label: spocitat-t-statistiku
#| echo: false
#| message: false
#| warning: false
t_pozorovane <-
  radek_sklonu_krabi |>
  dplyr::pull(statistic)
```

::: {.box-rule .text-center}
**Vzdálenost v jednotkách standardní chyby (SE)** = rozdíl mezi pozorovaným a nulovým sklonem ÷ standardní chyba (SE) sklonu
:::

::: {.fragment}
$$
\frac{
`r format_cz_math(odhad_sklonu, digits = 3, nsmall = 3)`-0
}{
`r format_cz_math(standardni_chyba_sklonu, digits = 4, nsmall = 4)`
}
=`r format_cz_math(t_pozorovane, digits = 2, nsmall = 2)`
$$
:::

::: {.fragment .box-result .text-center}
$$
t=
\frac{\text{pozorovaný sklon}-\text{nulový sklon}}
{\text{standardní chyba (SE) sklonu}}
\approx `r format_cz_math(t_pozorovane, digits = 2, nsmall = 2)`
$$

Této standardizované vzdálenosti říkáme [t-statistika]{.text-hgl-indigo_velvet}.

<br>

Naše pozorování leží přibližně **`r formatC(t_pozorovane, format = "f", digits = 2, decimal.mark = ",")` standardních chyb od nuly**.
:::

::: {.notes}
Pojmenování přichází až po výpočtu. t-statistika je vzdálenost od nuly měřená ve standardních chybách; není to velikost biologického efektu.
:::

## Kolik plochy zůstává za $|t|$?

```{r}
#| label: pripravit-p-hodnotu-pozorovani
#| echo: false
#| message: false
#| warning: false
stupne_volnosti <-
  df.residual(mod_krabi)

p_hodnota <-
  radek_sklonu_krabi |>
  dplyr::pull(p.value)

data_p_krivka <-
  data.frame(
    t = seq(
      from = -7,
      to = 7,
      length.out = 5000
    )
  ) |>
  dplyr::mutate(
    hustota = dt(
      x = t,
      df = stupne_volnosti
    ),
    chvost = abs(t) >= abs(t_pozorovane),
    strana = ifelse(t < 0, "levá", "pravá")
  )

plot_p_hodnota <-
  ggplot2::ggplot(
    data = data_p_krivka,
    mapping = ggplot2::aes(
      x = t,
      y = hustota
    )
  ) +
  ggplot2::annotate(
    geom = "rect",
    xmin = c(-7, abs(t_pozorovane)),
    xmax = c(-abs(t_pozorovane), 7),
    ymin = -Inf,
    ymax = Inf,
    fill = biostat_cols[["amethyst"]],
    alpha = 0.14
  ) +
  ggplot2::geom_area(
    data = data_p_krivka |>
      dplyr::filter(chvost),
    mapping = ggplot2::aes(group = strana),
    fill = biostat_cols[["amethyst"]],
    alpha = 0.95
  ) +
  ggplot2::geom_line(
    color = biostat_cols[["graphite"]],
    linewidth = 1.2
  ) +
  ggplot2::geom_vline(
    xintercept = c(-abs(t_pozorovane), abs(t_pozorovane)),
    color = biostat_cols[["orange"]],
    linetype = "dashed",
    linewidth = 1.1
  ) +
  ggplot2::labs(
    x = "t-statistika v nulovém světě",
    y = "Hustota"
  ) +
  theme_biostat(base_size = 17) +
  ggplot2::theme(
    plot.margin = ggplot2::margin(12, 18, 12, 28)
  ) +
  ggview::canvas(
    width = 1600,
    height = 760,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_p_hodnota,
  file = here::here(path_materials, "p_hodnota_chvosty.png")
)
```

```{r}
#| label: zobrazit-p-hodnotu
#| echo: false
#| out-width: "50%"
include_local_figure("p_hodnota_chvosty.png")
```

::: {.takeaway-strip .text-center}
Křivka je [t-rozdělení]{.text-hgl-indigo_velvet}: hodnoty $t$, které by vznikaly v nulovém světě. Celá plocha pod ní je 1.
:::

::: {.box-rule .fragment}
[P-hodnota]{.card-title}

Pravděpodobnost získat v nulovém světě $t$ alespoň tak vzdálené od nuly jako naše. U krabů $p=`r format_cz_math(p_hodnota, digits = 6)`$.
:::

::: {.notes}
Křivka je referenční t-rozdělení: hodnoty t, které by vznikaly v nulovém světě. Fialová plocha za oběma hranicemi je p-hodnota. U nás je tak malá, že ji v grafu skoro nevidíme.
:::

## Co udělá větší hodnota $|t|$?

```{r}
#| label: pripravit-vliv-t-na-plochu
#| echo: false
#| message: false
#| warning: false
data_scenare_t <-
  data.frame(
    t_hodnota = c(1, 1.5, 3)
  ) |>
  dplyr::mutate(
    popisek = paste0(
      "|t| = ",
      format(
        t_hodnota,
        decimal.mark = ",",
        drop0trailing = TRUE,
        trim = TRUE
      )
    )
  ) |>
  dplyr::mutate(
    p_hodnota_scenare = 2 * pt(
      q = -abs(t_hodnota),
      df = stupne_volnosti
    ),
    p_text = dplyr::if_else(
      p_hodnota_scenare < 0.001,
      "p < 0,001",
      paste0(
        "p = ",
        formatC(
          p_hodnota_scenare,
          format = "f",
          digits = 3,
          decimal.mark = ","
        )
      )
    ),
    popisek = factor(
      paste0(as.character(popisek), "\n", p_text),
      levels = paste0(as.character(popisek), "\n", p_text)
    )
  )

data_t_hodnoty <-
  tidyr::crossing(
    data_scenare_t,
    t = seq(
      from = -5,
      to = 5,
      length.out = 2400
    )
  ) |>
  dplyr::mutate(
    hustota = dt(
      x = t,
      df = stupne_volnosti
    ),
    chvost = abs(t) >= t_hodnota,
    strana = ifelse(t < 0, "levá", "pravá")
  )

plot_t_hodnoty <-
  ggplot2::ggplot(
    data = data_t_hodnoty,
    mapping = ggplot2::aes(
      x = t,
      y = hustota
    )
  ) +
  ggplot2::geom_area(
    data = data_t_hodnoty |>
      dplyr::filter(chvost),
    mapping = ggplot2::aes(group = strana),
    fill = biostat_cols[["amethyst"]],
    alpha = 0.75
  ) +
  ggplot2::geom_line(
    color = biostat_cols[["graphite"]],
    linewidth = 1
  ) +
  ggplot2::facet_wrap(
    facets = ggplot2::vars(popisek),
    nrow = 1
  ) +
  ggplot2::labs(
    x = "t-statistika",
    y = "Hustota",
    caption = paste0(
      "Ve všech třech panelech stejný počet lokalit jako u krabů (",
      nrow(data_lokality),
      ")"
    )
  ) +
  theme_biostat(base_size = 11) +
  ggplot2::theme(
    strip.text = ggplot2::element_text(size = 11),
    axis.title = ggplot2::element_text(size = 10),
    axis.text = ggplot2::element_text(size = 8),
    plot.caption = ggplot2::element_text(
      size = 9,
      hjust = 0.5
    )
  ) +
  ggview::canvas(
    width = 1600,
    height = 620,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_t_hodnoty,
  file = here::here(path_materials, "t_hodnota_a_plocha.png")
)
```

```{r}
#| label: zobrazit-vliv-t-na-plochu
#| echo: false
#| out-width: "80%"
include_local_figure("t_hodnota_a_plocha.png")
```

::: {.box-question .text-center .fragment}
Když se $|t|$ vzdaluje od nuly, co se stane s fialovou plochou?
:::

::: {.fragment .takeaway-strip .text-center}
Čím dál leží $t$ od nuly, tím menší část nulového rozdělení zůstává stejně daleko nebo ještě dál. Tím menší je p-hodnota.
:::

::: {.notes}
Tři ilustrační hodnoty t při stejném df jako u krabů. Nejsou to krabí výsledky.
:::

## Více lokalit při stejném $|t|$

```{r}
#| label: pripravit-vliv-poctu-lokalit-na-plochu
#| echo: false
#| message: false
#| warning: false
t_ilustracni <- 2.5

data_scenare_df <-
  data.frame(
    n = c(3, nrow(data_lokality), 100)
  ) |>
  dplyr::mutate(
    df = n - 2,
    p_hodnota_scenare = 2 * pt(
      q = -t_ilustracni,
      df = df
    ),
    p_text = dplyr::if_else(
      p_hodnota_scenare < 0.001,
      "p < 0,001",
      paste0(
        "p = ",
        formatC(
          p_hodnota_scenare,
          format = "f",
          digits = 3,
          decimal.mark = ","
        )
      )
    ),
    popisek = factor(
      paste0(
        n,
        dplyr::if_else(n < 5, " lokality", " lokalit"),
        "\ndf = ",
        df,
        "\n",
        p_text
      ),
      levels = paste0(
        n,
        dplyr::if_else(n < 5, " lokality", " lokalit"),
        "\ndf = ",
        df,
        "\n",
        p_text
      )
    )
  )

data_df_krivky <-
  tidyr::crossing(
    data_scenare_df,
    t = seq(
      from = -5,
      to = 5,
      length.out = 2400
    )
  ) |>
  dplyr::mutate(
    hustota = dt(
      x = t,
      df = df
    ),
    chvost = abs(t) >= t_ilustracni,
    strana = ifelse(t < 0, "levá", "pravá")
  )

plot_df_krivky <-
  ggplot2::ggplot(
    data = data_df_krivky,
    mapping = ggplot2::aes(
      x = t,
      y = hustota
    )
  ) +
  ggplot2::geom_area(
    data = data_df_krivky |>
      dplyr::filter(chvost),
    mapping = ggplot2::aes(group = strana),
    fill = biostat_cols[["amethyst"]],
    alpha = 0.75
  ) +
  ggplot2::geom_line(
    color = biostat_cols[["graphite"]],
    linewidth = 1
  ) +
  ggplot2::facet_wrap(
    facets = ggplot2::vars(popisek),
    nrow = 1
  ) +
  ggplot2::labs(
    x = NULL,
    y = NULL,
    caption = paste0(
      "Ve všech třech panelech držíme |t| = ",
      format(
        t_ilustracni,
        decimal.mark = ","
      )
    )
  ) +
  theme_biostat(base_size = 11) +
  ggplot2::theme(
    strip.text = ggplot2::element_text(size = 11),
    axis.title = ggplot2::element_text(size = 10),
    axis.text = ggplot2::element_text(size = 8),
    plot.caption = ggplot2::element_text(
      size = 9,
      hjust = 0.5
    )
  ) +
  ggview::canvas(
    width = 1600,
    height = 620,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_df_krivky,
  file = here::here(path_materials, "df_a_plocha.png")
)
```

```{r}
#| label: zobrazit-vliv-df-na-plochu
#| echo: false
#| out-width: "75%"
include_local_figure("df_a_plocha.png")
```

::: {.box-question .text-center .fragment}
Při stejném $|t|=`r format_cz_math(t_ilustracni, digits = 1)`$: ve které studii zůstane ve chvostech nejméně plochy?
:::

::: {.fragment .takeaway-strip .text-center}
Přímka odhaduje dva koeficienty, intercept a sklon, a proto platí $df=n-2$, u krabů **$`r nrow(data_lokality)`-2=`r stupne_volnosti`$**. Více nezávislých pozorování znamená tenčí chvosty a menší p-hodnotu.
:::

::: {.notes}
Stupně volnosti vysvětlím slovně: z průměrů slanisek jsme dva stupně volnosti spotřebovali na odhad interceptu a sklonu. Podrobněji je to rozvedeno ve skriptech na příkladu se Sudoku.
:::

## Která věta čte p-hodnotu správně?

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

::: {.column width="31%"}
::: {.panel-olive}
**A)** Pravděpodobnost, že skutečný sklon je nulový, je `r formatC(p_hodnota, format = "f", digits = 6, decimal.mark = ",")`.
:::
:::

::: {.column width="31%"}
::: {.panel-olive}
[**B)** V nulovém světě by výsledek alespoň tak extrémní jako náš byl velmi neobvyklý.]{.rn-circle-orange}
:::
:::

::: {.column width="31%"}
::: {.panel-olive}
**C)** Biologický efekt má velikost `r formatC(p_hodnota, format = "f", digits = 6, decimal.mark = ",")`.
:::
:::

::::

<br>

::: {.takeaway-strip}
Přesvědčte souseda, proč jste vybrali svou možnost.
:::
:::

::: {.notes}
Nejdřív individuální volba, pak přesvědčování souseda. Správně je B. A zaměňuje p-hodnotu za pravděpodobnost hypotézy, C ji zaměňuje za velikost efektu.
:::

## Co nám malá p-hodnota řekne — a co ne?

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

::: {.column width="48%"}
::: {.panel-result .fragment}
[Co říká]{.panel-title}

Naše pozorování je velmi obtížně slučitelné s přesně nulovým systematickým sklonem a zvoleným modelem.
:::
:::

::: {.column width="48%"}
::: {.panel-warning .fragment .incremental}
[Co neříká]{.panel-title}

- že je biologická hypotéza pravdivá
- že je efekt velký nebo důležitý
- že model nemá omezení
- jaký mechanismus vztah vytváří
:::
:::

::::

<br>

::: {.takeaway-strip .fragment}
P-hodnota hodnotí [pozorování v jednom hypotetickém světě]{.text-hgl-orange}. Není to stroj na pravdu.
:::
:::

::: {.notes}
Shrnutí misconception: malá p-hodnota neříká, že je hypotéza pravdivá, ani že je efekt velký.
:::

## Nulová hypotéza pojmenuje nulový svět

::::: {.columns}

::: {.column width="48%"}
```{r}
#| label: zobrazit-ilustraci-skepticka-kolegyne
#| echo: false
#| out-width: "80%"
#| fig-alt: !expr 'if (file.exists(here::here(path_materials, "volavka_skepticka_kolegyne.png"))) "Humorná ilustrace volavky v laboratorním plášti, která s pozvednutým obočím pokrčuje křídly nad deskami krabího týmu; krab houslista jí ukazuje rostoucí řadu teček. Ilustrace vytvořená pomocí AI." else "Simulovaný svět bez trendu: šedé body kolem fialové vodorovné přímky, oranžové úsečky ukazují náhodná residua."'
# Planned illustration 3 (GENERATED_IMAGES.md); until generated, the null-world figure is shown.
include_optional_figure(
  data_source = "volavka_skepticka_kolegyne.png",
  fallback = "nulovy_svet_residua.png"
)
```

::: {.text-size-tiny .text-right}
`r ai_disclosure("volavka_skepticka_kolegyne.png")`
:::
:::

::: {.column width="48%"}
::: {.box-rule}
[$H_0$: nulová hypotéza]{.card-title}

Pro kraby říká:

$$
H_0:\ \text{systematický sklon}=0\ \text{mm/°}
$$
:::

::: {.panel-question .fragment}
[$H_A$: alternativní hypotéza]{.panel-title}

$$
H_A:\ \text{systematický sklon}\neq0\ \text{mm/°}
$$
:::

::: {.panel-data .fragment}
Nulová hypotéza netvrdí, že se lokality neliší. Tvrdí jen, že se průměrná velikost se zeměpisnou šířkou systematicky lineárně nemění.
:::
:::

:::::

::: {.notes}
Nulový svět, se kterým jsme celou dobu pracovali, teď dostává jméno. Alternativní hypotéza je oboustranná: připouští růst i pokles. Zdůrazním, že lokality se i podle H0 mohou lišit místními podmínkami.

Ilustrace (pokud je vložena): skeptická kolegyně volavka zastupuje nulovou hypotézu; není to obvinění, ale přesně popsaná soupeřící možnost.
:::

# Kdy musíme udělat rozhodnutí?

## Někdy nestačí popisovat — musíme jednat

:::: {.slide-margin-top-15}
::: {.text-center .text-size-heading .text-bold}
Monitoring zachytil jednoho jedince možného [invazního druhu]{.text-hgl-orange}.
:::

::: {.box-question .text-center .fragment}
Zasáhnout, nebo pokračovat v pozorování? Jak velké riziko falešného poplachu jsme ochotni přijmout?
:::

:::: {.columns}
::: {.column width="31%"}
:::
::: {.column width="36%"}
```{r}
#| label: zobrazit-ilustraci-invazni-past
#| echo: false
#| out-width: "100%"
#| fig-alt: "Humorná ilustrace dvou krabů houslistů u monitorovací pasti, ve které sedí jeden zelený krab; jeden houslista drží píšťalku na poplach, druhý dalekohled a gestem naznačuje počkat. Ilustrace vytvořená pomocí AI."
# Planned illustration 4 (GENERATED_IMAGES.md); the slot stays empty until generated.
include_optional_figure(data_source = "krabi_invazni_past.png")
```
:::
::: {.column width="31%"}
:::
::::

::: {.text-size-tiny .text-right}
`r ai_disclosure("krabi_invazni_past.png")`
:::
::::

::: {.notes}
Krátká diskuze: zásah stojí peníze a čas, přehlédnutá invaze může být nevratná. Rozhodnutí potřebuje pravidlo zvolené předem.

Ilustrace (pokud je vložena): v pasti je jeden krab zelený, invazní druh na atlantském pobřeží; dva strážci se neshodnou, zda hned zasáhnout.
:::

## Kolik falešných poplachů jsme ochotni připustit?

::::: {.columns}

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

<br>

::: {.box-question .text-center}
Kdyby nulová hypotéza platila, jak často jsme ochotni ji **omylem** zamítnout?
:::
:::

::: {.column width="48%"}
::: {.box-rule .fragment}
[$\alpha$: hladina významnosti]{.card-title}

Předem zvolená přijatelná míra chyby.

**$\alpha=0{,}05$** znamená 5 %.
:::
:::

:::::

<br>

::: {.takeaway-strip .fragment}
Pět procent je běžná konvence. Podle důsledků chyby můžeme zvolit i přísnější pravidlo.
:::

::: {.notes}
Hladina významnosti je dlouhodobé riziko falešného zamítnutí pravdivé H0, které jsme ochotni přijmout. Volí se před pohledem na data.
:::

## Kde začíná krajních 5 % nulového světa?

```{r}
#| label: pripravit-kriticke-hodnoty-t
#| echo: false
#| message: false
#| warning: false
alfa <- 0.05

kriticke_t_graf <-
  qt(
    p = 1 - alfa / 2,
    df = stupne_volnosti
  )

data_kriticke_t <-
  tibble::tibble(
    t = seq(
      from = -7,
      to = 7,
      length.out = 5000
    )
  ) |>
  dplyr::mutate(
    hustota = dt(
      x = t,
      df = stupne_volnosti
    ),
    kriticky_chvost = abs(t) >= kriticke_t_graf,
    strana = dplyr::if_else(t < 0, "levá", "pravá")
  )

plot_kriticke_hodnoty_t <-
  ggplot2::ggplot(
    data = data_kriticke_t,
    mapping = ggplot2::aes(
      x = t,
      y = hustota
    )
  ) +
  ggplot2::geom_area(
    data = data_kriticke_t |>
      dplyr::filter(kriticky_chvost),
    mapping = ggplot2::aes(group = strana),
    fill = biostat_cols[["amethyst"]],
    alpha = 0.42
  ) +
  ggplot2::geom_line(
    color = biostat_cols[["graphite"]],
    linewidth = 1.2
  ) +
  ggplot2::geom_vline(
    xintercept = c(-kriticke_t_graf, kriticke_t_graf),
    color = biostat_cols[["amethyst"]],
    linetype = 2,
    linewidth = 1.1
  ) +
  ggplot2::geom_vline(
    xintercept = t_pozorovane,
    color = biostat_cols[["orange"]],
    linewidth = 1.3
  ) +
  ggplot2::geom_vline(
    xintercept = -abs(t_pozorovane),
    color = biostat_cols[["orange"]],
    linetype = 2,
    linewidth = 1.3
  ) +
  ggplot2::annotate(
    geom = "label",
    x = 3.5,
    y = 0.31,
    label = paste0(
      "kritické hranice\n= ±",
      formatC(
        kriticke_t_graf,
        format = "f",
        digits = 2,
        decimal.mark = ","
      )
    ),
    hjust = 0.5,
    color = biostat_cols[["amethyst"]],
    fill = "white",
    linewidth = 0.2,
    size = 3.8,
    lineheight = 0.9
  ) +
  ggplot2::annotate(
    geom = "label",
    x = t_pozorovane,
    y = 0.18,
    label = paste0(
      "pozorované t\n= +",
      formatC(
        t_pozorovane,
        format = "f",
        digits = 2,
        decimal.mark = ","
      )
    ),
    hjust = 1.05,
    color = biostat_cols[["orange"]],
    fill = "white",
    linewidth = 0.2,
    size = 3.8,
    lineheight = 0.9
  ) +
  ggplot2::annotate(
    geom = "label",
    x = -abs(t_pozorovane),
    y = 0.10,
    label = paste0(
      "zrcadlové −|t|\n= -",
      formatC(
        abs(t_pozorovane),
        format = "f",
        digits = 2,
        decimal.mark = ","
      )
    ),
    hjust = -0.05,
    color = biostat_cols[["orange"]],
    fill = "white",
    linewidth = 0.2,
    size = 3.8,
    lineheight = 0.9
  ) +
  ggplot2::labs(
    x = "t-statistika v nulovém světě",
    y = "Hustota"
  ) +
  theme_biostat(base_size = 17) +
  ggplot2::theme(
    plot.margin = ggplot2::margin(12, 18, 12, 28)
  ) +
  ggview::canvas(
    width = 1600,
    height = 720,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_kriticke_hodnoty_t,
  file = here::here(path_materials, "kriticke_hodnoty_t.png")
)
```

```{r}
#| label: zobrazit-kriticke-hodnoty-t
#| echo: false
#| out-width: "76%"
#| fig-alt: !expr paste0("Nulové t-rozdělení s fialovými kritickými hranicemi minus a plus ", formatC(kriticke_t_graf, format = "f", digits = 2, decimal.mark = ","), " pro ", stupne_volnosti, " stupňů volnosti, oranžovou pozorovanou hodnotou t rovnou plus ", formatC(t_pozorovane, format = "f", digits = 2, decimal.mark = ","), " a čárkovanou oranžovou zrcadlovou hranicí.")
include_local_figure("kriticke_hodnoty_t.png")
```

::: {.takeaway-strip}
Pro $df=`r stupne_volnosti`$ fialové hranice oddělují prostředních 95 % od chvostů o celkové ploše $\alpha=0{,}05$. Naše $|t|=`r format_cz_math(abs(t_pozorovane), digits = 2, nsmall = 2)`$ leží daleko za nimi.
:::

::: {.notes}
Před počítači se kritická hodnota hledala v tištěných tabulkách podle df a hladiny alfa. Pozorované t leží daleko za kritickou hranicí.
:::

## Rozhodovací pravidlo volíme předem

:::: {.slide-margin-top-15}
::: {.box-rule}
[Rozhodovací pravidlo]{.card-title}

Porovnáme p-hodnotu s předem zvolenou hladinou $\alpha$.
:::

:::: {.columns .align-top}

<br>

::: {.column width="48%"}
::: {.panel-question .fragment}
[Když $p > \alpha$]{.panel-title}

Nulovou hypotézu zamítnout **nemůžeme**.
:::
:::

::: {.column width="48%"}
::: {.panel-result .fragment}
[Když $p \leq \alpha$]{.panel-title}

Nulovou hypotézu zamítneme.

Výsledek nazveme **statisticky významný** neboli **statisticky signifikantní**.
:::
:::
::::
::::

::: {.footer}
Před počítači: $|t|$ vs. kritická hodnota z tabulky pro dané $df$. V R: `t value` a `Pr(>|t|)`.
:::

::: {.notes}
Rozhodovací pravidlo je jednoduché, důležité je jeho slovní vyjádření: nezamítnout H0 neznamená dokázat nulový efekt.
:::

## Co když se spleteme?

:::: {.columns}

::: {.column width="49%" .fragment}

[Chyba I. typu]{.text-bold}

```{r}
#| label: zobrazit-falesne-pozitivni
#| echo: false
#| fig-alt: "Úmyslně absurdní ilustrace: zjevně netěhotný muž překvapeně drží pozitivní těhotenský test."
include_local_figure("chyba_i_falesne_pozitivni.jpg")
```

**Falešně pozitivní:** zamítneme $H_0$, přestože platí.
:::

::: {.column width="49%" .fragment}

[Chyba II. typu]{.text-bold}

```{r}
#| label: zobrazit-falesne-negativni
#| echo: false
#| fig-alt: "Úmyslně absurdní ilustrace: zjevně těhotná žena překvapeně drží negativní těhotenský test."
include_local_figure("chyba_ii_falesne_negativni.jpg")
```

**Falešně negativní:** nezamítneme $H_0$, přestože neplatí.
:::

::::

::: {.notes}
Paměťová pomůcka: nulový stav je „těhotenství není přítomno“. Vlevo test hlásí stav, který není; vpravo stav přehlédne. Skutečná definice vždy závisí na tom, jak jsme zvolili H0.
:::


## Invazní druh: která chyba je která?

$$
H_0:\ \text{invazní druh v oblasti není přítomen}
$$

| Realita | Průzkum: „nepřítomen“ | Průzkum: „přítomen“ |
|---|---|---|
| Druh není přítomen | správné rozhodnutí | **A: zbytečný zásah** |
| Druh je přítomen | **B: přehlédnutá invaze** | správné rozhodnutí |

<br>

::: {.box-question .fragment}
Zařaďte A a B jako chybu I. nebo II. typu. Která může být závažnější?
:::

::: {.fragment .box-result}
**A = chyba I. typu.**

**B = chyba II. typu.**

Závažnost závisí na biologických a praktických důsledcích.
:::

::: {.notes}
Žádná chyba není vždy horší. U invazního druhu může být přehlédnutá invaze nevratná, zbytečný zásah naopak stojí zdroje.
:::

# Co tedy můžeme tvrdit?

## „p < 0,05, proto je hypotéza pravdivá“ {.text-center}

:::: {.slide-margin-top-15}
::: {.text-center .text-size-heading .text-bold}
Co je na této větě špatně?
:::

<br>

:::: {.columns}

::: {.column width="48%"}
::: {.box-warning .fragment}
[Co tvrdí neprávem]{.card-title}

P-hodnota neudává pravděpodobnost pravdy a test hypotézu nedokazuje.
:::
:::

::: {.column width="48%"}
::: {.panel-question .fragment}
[Co ve větě chybí]{.panel-title}

Efekt, jednotky, biologický význam, nejistota a omezení.
:::
:::

::::
::::

::: {.notes}
Studenti nejdřív sami najdou, co je na větě špatně. Pak odkryju obě strany.
:::

## Ke stejné nule se můžeme vrátit intervalem

```{r}
#| label: pripravit-interval-proti-nule
#| echo: false
#| message: false
#| warning: false
plot_interval_nula <-
  ggplot2::ggplot(
    data = data_interval,
    mapping = ggplot2::aes(
      x = odhad,
      y = radek
    )
  ) +
  ggplot2::geom_vline(
    xintercept = 0,
    color = biostat_cols[["graphite"]],
    linetype = "dashed",
    linewidth = 1.2
  ) +
  ggplot2::geom_segment(
    mapping = ggplot2::aes(
      x = dolni,
      xend = horni,
      yend = radek
    ),
    color = biostat_cols[["indigo_velvet"]],
    linewidth = 3
  ) +
  ggplot2::geom_point(
    color = biostat_cols[["orange"]],
    size = 6
  ) +
  ggplot2::annotate(
    geom = "text",
    x = 0,
    y = 1.16,
    label = "nulový sklon",
    hjust = -0.08,
    color = biostat_cols[["graphite"]],
    size = 5
  ) +
  ggplot2::scale_x_continuous(
    limits = c(-0.1, 0.75)
  ) +
  ggplot2::scale_y_continuous(
    limits = c(0.78, 1.22),
    breaks = NULL
  ) +
  ggplot2::labs(
    x = "Sklon (mm na 1° severněji)",
    y = NULL
  ) +
  theme_biostat(base_size = 18) +
  ggview::canvas(
    width = 1600,
    height = 650,
    units = "px"
  )

ggview::save_ggplot(
  plot = plot_interval_nula,
  file = here::here(path_materials, "interval_proti_nule.png")
)
```

```{r}
#| label: zobrazit-interval-proti-nule
#| echo: false
#| out-width: "90%"
include_local_figure("interval_proti_nule.png")
```

::: {.panel-result .fragment}
95% interval **[`r formatC(interval_sklonu[[1]], format = "f", digits = 3, decimal.mark = ",")`; `r formatC(interval_sklonu[[2]], format = "f", digits = 3, decimal.mark = ",")`] mm/°** neobsahuje nulu. Při $\alpha=0{,}05$ proto vede ke stejnému rozhodnutí jako p-hodnota a navíc ukazuje slučitelné velikosti efektu.
:::

::: {.notes}
Interval a test u oboustranné hladiny 5 % vedou ke stejnému rozhodnutí. Interval ale navíc říká, jak velké efekty jsou s daty slučitelné.
:::


## Napište výsledek pro biologa

:::: {.columns .align-top}

<br>

::: {.column width="42%"}
::: {.box-question}
Napište 4–6 vět. Začněte tím, **co se mění a o kolik**. Poslední větou uveďte jednu důležitou limitaci studie.
:::

::: {.takeaway-strip}
Přesvědčte souseda, že vaše pořadí důkazů dává smysl.
:::
:::

::: {.column width="54%"}
::: {.box-data}
[Karta důkazů]{.panel-title}

- `r nrow(data_lokality)` slanisek
- pozorovaný sklon `r formatC(odhad_sklonu, format = "f", digits = 3, decimal.mark = ",")` mm/°
- 95% CI [`r formatC(interval_sklonu[[1]], format = "f", digits = 3, decimal.mark = ",")`; `r formatC(interval_sklonu[[2]], format = "f", digits = 3, decimal.mark = ",")`] mm/°
- $t=`r format_cz_math(t_pozorovane, digits = 2, nsmall = 2)`$, $df=`r stupne_volnosti`$, $p=`r format_cz_math(p_hodnota, digits = 6, nsmall = 6)`$
- observační studie a jednoduchý lineární model
- možné místní a prostorové rozdíly mezi lokalitami
:::
:::

::::

::: {.notes}
Tři až čtyři minuty psaní, pak výměna se sousedem. Hlídám pořadí: efekt, nejistota, test, omezení.
:::

## Jedna možná odpověď

::: {.slide-margin-top-15}
::: {.box-result}
**Efekt:** Na `r nrow(data_lokality)` sledovaných slaniskách se průměrná šířka krunýře směrem k severu zvětšovala asi o **`r formatC(odhad_sklonu, format = "f", digits = 3, decimal.mark = ",")` mm na 1°**.

**Nejistota:** 95% interval spolehlivosti byl **[`r formatC(interval_sklonu[[1]], format = "f", digits = 3, decimal.mark = ",")`; `r formatC(interval_sklonu[[2]], format = "f", digits = 3, decimal.mark = ",")`] mm/°**.

**Biologický význam:** Přes celé sledované pobřeží to odpovídá změně asi `r formatC(odhad_sklonu * diff(range(data_lokality$zemepisna_sirka)), format = "f", digits = 1, decimal.mark = ",")` mm, tedy znatelnému rozdílu ve velikosti krabů.

**Statistická významnost:** Výsledek je při $\alpha=0{,}05$ statisticky významný ($t=`r format_cz_math(t_pozorovane, digits = 2, nsmall = 2)`$, $df=`r stupne_volnosti`$, $p=`r format_cz_math(p_hodnota, digits = 6, nsmall = 6)`$).

**Limitace:** Studie podporuje kladný vztah na sledovaných lokalitách, ale sama neodhaluje příčinu ani přesný vztah v celé populaci.
:::
:::

::: {.notes}
Jedna z mnoha možných správných odpovědí. Porovnáme ji s tím, co studenti napsali.
:::

## Co nám studie ukázala?

:::: {.columns}

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

<br>

::: {.panel-result}
[Hlavní závěr]{.panel-title}

Na `r nrow(data_lokality)` sledovaných slaniskách byli krabi směrem na sever v průměru větší. Odhadnutý vztah činil **`r formatC(odhad_sklonu, format = "f", digits = 3, decimal.mark = ",")` mm na 1°** a kladný trend směrem k severu je statisticky významný.
:::
:::

::: {.column width="39%"}
::: {.panel-question .fragment}
[Co zůstává otevřené]{.panel-title}

- přesná velikost vztahu v dalších lokalitách
- příčinný biologický mechanismus
- vliv místních a prostorových podmínek
:::
:::

::::

```{r}
#| label: zobrazit-ilustraci-prezentace-zaveru
#| echo: false
#| out-width: "38%"
#| fig-alt: "Humorná ilustrace krabího týmu, který na malé konferenci na pláži ukazuje plakát s několika tečkami a fialovým pásem; v publiku sedí zvědavá volavka a další živočichové. Ilustrace vytvořená pomocí AI."
# Planned illustration 5, optional (GENERATED_IMAGES.md); the slot stays empty until generated.
include_optional_figure(data_source = "krabi_prezentace_zaveru.png")
```

::: {.text-size-tiny .text-right}
`r ai_disclosure("krabi_prezentace_zaveru.png")`
:::

::: {.takeaway-strip .text-center .fragment}
Nejistota neznamená, že studie nic neukázala. Vymezuje, jak daleko může náš závěr bezpečně sahat.
:::

::: {.notes}
Návrat k hlavní otázce: co jsme o krabech zjistili a co zůstává otevřené.
:::

## A co sýrový Měsíc?

:::: {.columns}

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

<br>

```{r}
#| label: znovu-zobrazit-mesic-ze-syra
#| echo: false
#| fig-alt: "Humorná ilustrace Měsíce tvořeného sýrem připomíná, že vědecký závěr zůstává otevřený novým důkazům."
include_local_figure("mesic_ze_syra.png")
```
:::

::: {.column width="52%"}
<br>
<br>

:::: {.layout-stack}
::: {.box-question .text-center}
Prokázal by statistický test, že Měsíc není ze sýra?
:::

::: {.fragment .box-result .text-center}
Ne. Ukázal by, jak slučitelná jsou pozorování s jedním přesně popsaným sýrovým světem.
:::
::::
:::

::::

::: {.notes}
Uzavírám oblouk ze začátku přednášky. Test nikdy nedokazuje pravdu; posuzuje slučitelnost dat s jedním přesně popsaným tvrzením.
:::

# Závěr

## Platí stejná logika i pro dvě skupiny?

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

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

Číselný prediktor: zeměpisná šířka.

Efekt: **sklon**.
:::
:::

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

Kategoriální prediktor: například kontrola a zásah.

Efekt: **rozdíl mezi skupinami**.
:::
:::

::::

<br>

::: {.takeaway-strip}
Co z této logiky zůstane stejné, když místo trendu budeme porovnávat dvě biologické skupiny?
:::
:::

::: {.notes}
Most k následující lekci: stejný postup efekt, nejistota, test a omezení použijeme pro rozdíl dvou skupin.
:::

## Shrnutí

::: {.slide-margin-top-15}
::: {.blockquote}
::: {.incremental}
- Studie zachycuje omezené [pozorování reality]{.text-hgl-graphite}.
- Výsledek začíná [velikostí efektu a jeho nejistotou]{.text-hgl-indigo_velvet}.
- [Nulová hypotéza]{.text-hgl-indigo_velvet} popisuje jeden přesně zadaný svět; t-statistika měří vzdálenost od něj ve standardních chybách.
- P-hodnota popisuje, jak neobvyklá jsou data v nulovém světě, ne pravděpodobnost hypotézy.
- Rozhodnutí může být chybné: chyba I. a II. typu.
:::
:::

::: {.takeaway-strip .text-center .fragment}
Efekt → biologický význam → nejistota → p-hodnota → limitace závěru
:::
:::

::: {.notes}
Shrnutí prochází výsledky učení: realita a studie, efekt a nejistota, nulová hypotéza a t, p-hodnota, chyby a opatrný závěr.
:::

## Co potřebujete vidět, než napíšete „p < 0,05, takže severní krabi jsou větší“? {.text-center}

<br>

::: {.text-size-large .text-bold .text-center}
Jaké tři otázky položíte autorovi, který vám ukáže jen tento titulek?
:::

<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 milimetrů na stupeň a je to biologicky hodně? Jak široký je interval? Kolik lokalit a jak byly vybrány? Sedí přímka k datům? Tvrdí autor příčinu, nebo jen souvislost?
:::
