The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
When point estimates of basic-event probabilities are uncertain, you
can simulate rates or probabilities, evaluate the top
event for each draw with quantify(..., prob = TRUE),
and summarize the resulting distribution. This follows the IT security
workflow in the tidyfault paper.
it_security_probs
holds point estimates at \(t =
10{,}000\) hours.library(tidyfault)
library(dplyr)
library(tidyr)
data("it_security_nodes")
data("it_security_edges")
data("it_security_probs")
f <- formulate(equate(curate(it_security_nodes, it_security_edges)))Outline:
pexp().quantify() once on the full
matrix of simulated probabilities (vectorized over rows).set.seed(7)
t_horizon <- 10000
cv <- 0.2
n_draws <- 2500
batch_probs <- it_security_probs |>
pivot_longer(everything(), names_to = "event", values_to = "prob") |>
mutate(
lambda = -log(1 - prob) / t_horizon,
lambda_se = lambda * cv
) |>
group_by(event) |>
reframe(
prob = pexp(
q = t_horizon,
rate = rnorm(n = n_draws, mean = lambda, sd = lambda_se)
),
scenario = seq_len(n_draws)
) |>
ungroup() |>
pivot_wider(id_cols = scenario, names_from = event, values_from = prob)
event_cols <- setdiff(names(batch_probs), "scenario")
sim_probs <- batch_probs
sim_probs$outcome <- quantify(
f,
newdata = sim_probs[, event_cols, drop = FALSE],
prob = TRUE
)
knitr::kable(head(sim_probs, 3), digits = 4)| scenario | DA | EP | IM | LR | MN | PC | PM | PO | VS | WB | outcome |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0.3038 | 0.1884 | 0.0732 | 0.1237 | 0.1680 | 0.1923 | 0.1579 | 0.1612 | 0.0951 | 0.1665 | 0.0144 |
| 2 | 0.1722 | 0.1382 | 0.0733 | 0.1105 | 0.2018 | 0.2375 | 0.1557 | 0.1502 | 0.1042 | 0.1418 | 0.0140 |
| 3 | 0.1926 | 0.1363 | 0.0522 | 0.0849 | 0.2360 | 0.1464 | 0.1621 | 0.1850 | 0.1196 | 0.1662 | 0.0134 |
sim_probs |>
summarize(
estimate = mean(outcome),
lower = quantile(outcome, 0.025),
upper = quantile(outcome, 0.975)
) |>
knitr::kable(digits = 4)| estimate | lower | upper |
|---|---|---|
| 0.0157 | 0.0101 | 0.0223 |
cv,
n_draws, or the distributional assumption on \(\lambda\).For deterministic probability scenarios, see quantify()-ing probabilities.
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.