Use nice illustration of the effect of increasing the mean on increasing average scores
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Documentazione
- Chiarezza
- Da chiarire
- Stato di attività
- Ferma
- Stack tecnologico
- r
- Ambito
- data-visualization, documentation
Direzione di ricerca
Inizia esaminando la issue correlata #929 e i riferimenti del manoscritto all’illustrazione. Ispeziona il codice mostrato per la simulazione e il plotting e i file presenti in inst/manuscript/output, inclusi illustration-effect-scale.png e relation-to-scale-example.rds. Il lavoro è completo quando il progetto ha preso una decisione chiara sul mantenimento o la rimozione dell’illustrazione e dei relativi asset inutilizzati del manoscritto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
We have this visualisation:
generated by this code:
library(data.table)
library(dplyr)
library(scoringutils)
library(ggplot2)
library(tidyr)
library(patchwork)
## Real Data
ex <- example_sample_continuous |>
filter(model == "EuroCOVIDhub-ensemble")
scores <- ex |>
score()
setnames(scores, old = c("dss", "crps", "log_score"),
new = c("DSS", "CRPS", "Log score"))
df <- ex[sample_id == 1] |>
merge(scores) |>
melt(measure.vars = c("DSS", "CRPS", "Log score"),
variable.name = "Scoring rule", value.name = "Score")
df[, `Scoring rule` := factor(`Scoring rule`, levels = c("CRPS", "DSS", "Log score"))]
p_true <- df |>
filter(horizon == 3, location == "DE") |>
ggplot(aes(x = observed, y = Score, ,group = `Scoring rule`,
colour = `Scoring rule`)) +
geom_line() +
scale_color_discrete(type = c("#E69F00", "#56B4E9", "#009E73")) +
scale_y_log10() +
scale_x_log10() +
labs(x = "Observed value") +
theme_scoringutils() +
theme(legend.position = "bottom")
# ------------------------------------------------------------------------------
# illustration:
# in this we see that the mean as well as the variance of the scores scale
# for crps, while the variance stays constant for dss and log score
library(tidyr)
simulate <- function(n_samples = 5e3,
n_replicates = 1e3,
true_value = 100,
scale_mean = 1,
scale_sd = scale_mean) {
pred <- rnorm(n_replicates * n_samples,
mean = true_value * scale_mean,
sd = true_value * scale_sd)
df <- data.table(
observed = true_value * scale_mean,
predicted = pred,
sample_id = 1:n_samples,
id = paste0("id", rep(1:n_replicates, each = n_samples)),
model = paste0("mean_", scale_mean, "_sd_", scale_sd)
) |>
as_forecast_sample()
scores <- score_simulation(df, scale_mean = scale_mean, scale_sd = scale_sd)
return(scores)
}
score_simulation <- function(df, scale_mean = 1, scale_sd = scale_mean) {
scores <- score(
df,
metrics = get_metrics(df, select = c("dss", "crps", "log_score"))
)
m <- summarise_scores(scores, by = "model", fun = mean) |>
melt(id.vars = "model", value.name = "mean", variable.name = "score")
s <- summarise_scores(scores, by = "model", fun = stats::sd) |>
melt(id.vars = "model", value.name = "sd", variable.name = "score")
out <- merge(m, s, by = c("model", "score")) |>
melt(id.vars = c("model", "score"), variable.name = "type")
return(out[])
}
scales_mean <- scales_sd <- c(1, 2, 5, 10)
grid <- expand.grid(
scale_mean = scales_mean,
scale_sd = scales_sd
) |>
setDT()
if (!file.exists("inst/manuscript/output/relation-to-scale-example.rds")) {
res <- grid |>
rowwise() |>
mutate(simulation := list(simulate(scale_mean = scale_mean, scale_sd = scale_sd)))
saveRDS(res, file = "inst/manuscript/output/relation-to-scale-example.rds")
} else {
res2 <- readRDS("inst/manuscript/output/relation-to-scale-example.rds")
}
df <- res |>
tidyr::unnest(cols = "simulation")
df <- df |>
rename(`Scoring rule` = score) |>
mutate(type = ifelse(type == "mean", "Mean score", "Sd score")) |>
mutate(`Scoring rule` = ifelse(`Scoring rule` == "dss",
"DSS",
ifelse(`Scoring rule` == "crps", "CRPS", "Log score")))
p1 <- df |>
filter(scale_mean == 1,
scale_sd < 20) |>
ggplot(aes(y = value, x = scale_sd,
group = `Scoring rule`, color = `Scoring rule`)) +
geom_line() +
facet_wrap(~ type, scales = "free") +
scale_y_log10() +
scale_color_discrete(type = c("#E69F00", "#56B4E9", "#009E73")) +
scale_x_log10() +
theme_scoringutils() +
labs(y = "Score", x = "Sd of F and G (mean constant)")
p2 <- df |>
filter(scale_sd == 1,
scale_mean < 20) |>
ggplot(aes(y = value, x = scale_mean,
group = `Scoring rule`, color = `Scoring rule`)) +
geom_line() +
facet_wrap(~ type, scales = "free") +
scale_y_log10() +
scale_x_log10() +
scale_color_discrete(type = c("#E69F00", "#56B4E9", "#009E73")) +
theme_scoringutils() +
labs(y = "Score", x = "Mean of F and G (sd constant)")
layout <- "
AAACC
BBBCC
"
p2 + p1 + p_true +
plot_layout(guides = "collect", design = layout) &
theme(legend.position = "bottom") &
plot_annotation(tag_levels = 'A')
ggsave("inst/manuscript/output/illustration-effect-scale.png",
height = 4.3, width = 8)
It was previously in the manuscript, but we're not using it anymore. But maybe we don't want it at all anymore...
Related: #929
- Lingua principale
- R
- Stelle
- 65
- Fork
- 24
- Merge medio
- 1h 24m
- PR unite (30g)
- 2
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di epiforecasts/scoringutils
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
epiforecasts/scoringutils#1264 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
epiforecasts/scoringutils#1265 ·
I maintainer di solito rispondono entro 1 giorno
-
Non-randomised PIT for integer forecasts drops forecasts whose observation exceeds all samplesAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
epiforecasts/scoringutils#1260 ·
I maintainer di solito rispondono entro 1 giorno
-
Incorrect guidance in `NEWS.md` re `add_relative_skill()`?Forse già presa @nikosbosse l’ha presa 3 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
epiforecasts/scoringutils#1226 · 1 commento · 2 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
get_pit_histogram(): unsorted breaks produce negative densities; num_bins = 1 returns an empty tableForse già presa @nikosbosse l’ha presa 3 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
epiforecasts/scoringutils#1219 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di epiforecasts/scoringutils
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
waldronlab/bugphyzz#301 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
r-lib/tree-sitter-r#209 ·
-
Suggest rmoriebricklayerAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 67/100
-
Suggest rmoriebricklayerAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 79/100
cran-task-views/CausalInference#52 · 1 commento ·