|
| 1 | +#' Analyze simulation results |
| 2 | +#' |
| 3 | +#' @param data a [tibble::tbl_df] with columns: |
| 4 | +#' * `lambda.sim`, |
| 5 | +#' * `incidence.rate`, |
| 6 | +#' * `SE`, |
| 7 | +#' * `CI.lwr`, |
| 8 | +#' * `CI.upr` |
| 9 | +#' for example, as produced by [summary.seroincidence.by()] with |
| 10 | +#' `lambda.sim` as a stratifying variable |
| 11 | +#' |
| 12 | +#' @returns a `sim_results` object (extends [tibble::tbl_df]) |
| 13 | +#' @export |
| 14 | +#' |
| 15 | +#' @example inst/examples/exm-analyze_sims.R |
| 16 | +#' |
| 17 | +analyze_sims <- function( |
| 18 | + data) { |
| 19 | + |
| 20 | + to_return <- |
| 21 | + data |> |
| 22 | + split( |
| 23 | + f = ~ sample_size + lambda.sim |
| 24 | + ) |> |
| 25 | + lapply(FUN = analyze_sims_one_stratum) |> |
| 26 | + bind_rows() |
| 27 | + |
| 28 | + class(to_return) <- union("sim_results", class(to_return)) |
| 29 | + |
| 30 | + return(to_return) |
| 31 | +} |
| 32 | + |
| 33 | +analyze_sims_one_stratum <- function( |
| 34 | + data, |
| 35 | + true_lambda = data$lambda.sim, |
| 36 | + sample_size = data$sample_size) { |
| 37 | + |
| 38 | + # Filter out rows where CI.lwr or CI.upr is Inf or NaN |
| 39 | + data <- data |> |
| 40 | + filter(is.finite(.data$CI.lwr) & is.finite(.data$CI.upr)) |
| 41 | + |
| 42 | + # Compute Bias |
| 43 | + bias <- mean(data$incidence.rate - true_lambda, na.rm = TRUE) |
| 44 | + |
| 45 | + # Standard Error (Mean of reported standard errors) |
| 46 | + standard_error <- mean(data$SE, na.rm = TRUE) |
| 47 | + |
| 48 | + # RMSE (Root Mean Square Error) |
| 49 | + rmse <- mean((data$incidence.rate - true_lambda)^2, na.rm = TRUE) |> sqrt() |
| 50 | + |
| 51 | + # Confidence Interval Width (Mean of Upper - Lower bounds, without Inf values) |
| 52 | + ci_width <- mean(data$CI.upr - data$CI.lwr, na.rm = TRUE) |
| 53 | + |
| 54 | + coverage_prop <- |
| 55 | + mean(data$CI.lwr <= true_lambda & data$CI.upr >= true_lambda, na.rm = TRUE) |
| 56 | + |
| 57 | + to_return <- tibble( |
| 58 | + lambda.sim = mean(true_lambda), |
| 59 | + sample_size = mean(sample_size), |
| 60 | + Bias = bias, |
| 61 | + Mean_Est_SE = standard_error, |
| 62 | + Empirical_SE = stats::sd(data$incidence.rate, na.rm = TRUE), |
| 63 | + RMSE = rmse, |
| 64 | + Mean_CI_Width = ci_width, |
| 65 | + CI_Coverage = coverage_prop |
| 66 | + ) |
| 67 | + # Return computed statistics as a list |
| 68 | + return(to_return) |
| 69 | +} |
0 commit comments