Skip to content

Province estimates ​

This page gives the province estimates from the joint model, whose methods are on the Methods page. The national estimates are the sum of the provinces here. The per-province forecast is on the province forecasts page and its scoring is in the forecast by province.

This page is generated from docs/pages/estimates/province.jl. The model code it calls is in src/. See aim and origins and limitations.

Load packages, data and fitted chains
julia
# Shared setup: packages, observations and the fit registry. See
# `docs/pages/_setup.jl`.
using BVDOutbreakSize
include(joinpath(pkgdir(BVDOutbreakSize), "docs", "pages", "_setup.jl"))
validation_forecast_from (generic function with 1 method)
julia
# The fits this page reads, loaded from the cache here.
chn_joint = load_fit("joint");

Last updated: 23 October 2026.

Data as of: 20 October 2026.

Summary ​

Compute the weekly cases and reproduction number by province
julia
# The provincial Rt trajectories, rebuilt on the same grid as the
# reproduction number by province figure further down.
province_summary_rt = reconstruct_patch_rt(
    chn_joint;
    n = obs.n, breakpoint = _BREAKPOINT, n_patches = N_PATCHES,
    rt_start = _rt_start_plot,
    rt_walk_start = clamp(_BREAKPOINT - RT_WALK_LEAD, _rt_start_plot, obs.n),
    ramp = RT_INTERVENTION_RAMP
);
# The week-ahead province forecast, read from the same draws as the
# province forecasts page.
province_summary_forecast = forecast_provinces(
    fit_forecast("joint"); horizon = 7, n_patches = N_PATCHES
);
province_cases_rt = cases_rt_table(
    province_summary_rt, province_cases.days, province_cases.increments;
    cutoff = obs.cutoff, n = obs.n, forecast = province_summary_forecast
);
province_cases_rt_fig = plot_cases_rt(province_cases_rt);

Each province's confirmed cases over the most recent week against its reproduction number, with the week before and the forecast week ahead. Faint bars span the 90% credible interval of the reproduction number, and the forecast also carries a bar across its 90% interval for cases.
Compute the province comparison
julia
province_headline_md = patch_headline(chn_joint, N_PATCHES)
province_headline = Markdown.parse(province_headline_md);
ProvinceShare of infections (%)R at the cut-offP(R > 1)CFR (%)Relative ascertainment
Ituri64–720.71–1.5260%36.0–60.70.89–1.23
Nord-Kivu22–300.72–1.5864%39.1–63.80.76–1.08
Haut-Uele4–50.6–1.6752%36.1–60.40.89–1.23
Sud-Kivu0–00.49–1.5742%36.4–60.80.76–1.23
Tshopo1–10.78–1.8879%36.4–61.00.85–1.25
Bas-Uele0–00.63–1.7160%36.2–61.00.83–1.3
Sud-Ubangi0–00.62–1.760%36.4–61.00.76–1.25
Nord-Ubangi0–00.82–2.7286%36.5–61.10.78–1.28

Ituri has the most infections with probability over 99%, and 7 of 8 provinces are more likely than not to be growing. Infections imported from another province make up 0.2–2.8% of infections to date.

The provinces compared from the joint posterior, as equal-tailed 90% credible intervals, with shares and probabilities computed draw by draw. The reproduction number and the relative case ascertainment are identified only as a product, and the per-province deaths break the tie.

Maps ​

Maps of infections, reproduction number and ascertainment
julia
# The infections panel is also drawn alone for the summary page.
province_infections_panel = (;
    values = province_map_summary(chn_joint, :C_T_patch, N_PATCHES).values,
    title = "Infections to date", scale = log10,
    colorbar_label = "Infections (median)",
)
province_map_fig = plot_province_map(
    [
        province_infections_panel,
        (;
            province_map_summary(chn_joint, :R_T_patch, N_PATCHES)...,
            title = "Reproduction number at the cut-off",
            diverging_at = 1.0, colorbar_label = "R (median)",
        ),
        (;
            province_map_summary(
                chn_joint, :province_ascertainment, N_PATCHES
            )...,
            title = "Relative case ascertainment", diverging_at = 1.0,
            scale = log10, colorbar_label = "Relative to national (median)",
        ),
    ]
);

Each province is shaded by its posterior median. The reproduction number at the cut-off and the relative case ascertainment are centred on one, and a province whose 90% credible interval spans one is washed out.

Detail by province ​

Each province's case-fatality ratio is in the case-fatality ratio by province.

Compute the per-province tables and figure
julia
# The tables below and the pair-plot dropdowns further down name the
# provinces in this order.
@assert PROVINCE_LABELS[1:N_PATCHES] == [
    "Ituri", "Nord-Kivu", "Haut-Uele",
    "Sud-Kivu", "Tshopo", "Bas-Uele", "Sud-Ubangi", "Nord-Ubangi",
]
province_detail_tables = [
    patch_summary_table(chn_joint, N_PATCHES; patch = p) for p in 1:N_PATCHES
];
province_detail_fig = plot_patch_summary(chn_joint, N_PATCHES);

Each province's estimates as medians with 30%, 60% and 90% credible intervals, repeated in the tables below. The log-Rt deviation is from the national trend, the drift is the deviation's walk scale and the contrast is against Ituri.

Ituri ​

7×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Cumulative infections10008.012086.013528.016272.018172.022365.0
2Reproduction number0.710.870.971.131.251.52
3Daily infections at cut-off42.059.071.098.0117.0166.0
4log-Rt deviation from trend-0.31-0.18-0.110.010.090.23
5log-Rt vs primary patch0.00.00.00.00.00.0
6Rt deviation innovation sd0.0530.0710.0820.1040.120.154
7Relative case ascertainment0.890.961.01.051.111.23

Nord-Kivu ​

7×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Cumulative infections3697.04510.05047.06217.06943.08606.0
2Reproduction number0.720.890.991.171.31.58
3Daily infections at cut-off33.047.057.079.094.0137.0
4log-Rt deviation from trend-0.32-0.15-0.070.040.110.26
5log-Rt vs primary patch-0.38-0.16-0.050.120.230.42
6Rt deviation innovation sd0.0470.0660.0780.1050.1260.16
7Relative case ascertainment0.760.850.90.981.011.08

Haut-Uele ​

7×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Cumulative infections627.0769.0872.01070.01205.01498.0
2Reproduction number0.60.780.91.151.311.67
3Daily infections at cut-off4.05.07.010.013.020.0
4log-Rt deviation from trend-0.51-0.3-0.170.030.140.35
5log-Rt vs primary patch-0.54-0.29-0.140.090.220.49
6Rt deviation innovation sd0.1010.1230.1370.1650.1830.22
7Relative case ascertainment0.890.971.01.061.11.23

Sud-Kivu ​

7×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Cumulative infections2.04.05.08.010.016.0
2Reproduction number0.490.690.821.061.231.57
3Daily infections at cut-off0.00.00.00.00.00.0
4log-Rt deviation from trend-0.75-0.42-0.26-0.050.060.28
5log-Rt vs primary patch-0.75-0.39-0.230.010.130.38
6Rt deviation innovation sd0.0680.0940.1110.1410.1640.203
7Relative case ascertainment0.760.910.971.021.071.23

Tshopo ​

7×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Cumulative infections129.0163.0186.0238.0272.0353.0
2Reproduction number0.780.991.11.341.491.88
3Daily infections at cut-off2.03.04.06.07.011.0
4log-Rt deviation from trend-0.23-0.060.030.170.260.44
5log-Rt vs primary patch-0.33-0.080.050.250.380.62
6Rt deviation innovation sd0.0590.0770.090.1130.1310.162
7Relative case ascertainment0.850.950.991.041.091.25

Bas-Uele ​

7×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Cumulative infections16.022.026.035.042.057.0
2Reproduction number0.630.840.971.191.341.71
3Daily infections at cut-off0.00.00.01.01.01.0
4log-Rt deviation from trend-0.45-0.21-0.10.060.140.33
5log-Rt vs primary patch-0.53-0.23-0.090.130.260.52
6Rt deviation innovation sd0.0570.0780.0920.120.1380.177
7Relative case ascertainment0.830.940.981.041.11.3

Sud-Ubangi ​

7×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Cumulative infections2.03.05.07.010.015.0
2Reproduction number0.620.830.961.191.351.7
3Daily infections at cut-off0.00.00.00.00.00.0
4log-Rt deviation from trend-0.46-0.22-0.110.060.150.34
5log-Rt vs primary patch-0.55-0.23-0.090.130.260.53
6Rt deviation innovation sd0.0550.0750.0890.1190.1380.174
7Relative case ascertainment0.760.920.971.021.081.25

Nord-Ubangi ​

7×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Cumulative infections4.06.08.014.019.034.0
2Reproduction number0.821.091.251.651.992.72
3Daily infections at cut-off0.00.00.00.01.02.0
4log-Rt deviation from trend-0.160.030.150.370.530.85
5log-Rt vs primary patch-0.240.030.180.440.631.0
6Rt deviation innovation sd0.0660.0930.1090.1390.1610.206
7Relative case ascertainment0.780.920.971.021.091.28

Isolation beds ​

Province bed table
julia
province_bed_overview = province_bed_table(chn_joint, N_PATCHES);
8×6 DataFrame
RowProvinceBedsBed demandOccupied bedsUtilisation (%)Shortfall
StringStringStringStringStringString
1Ituri1074 (705–1553)647 (576–722)645 (569–720)60.3 (40.7–93.6)0 (0–0)
2Nord-Kivu302 (196–439)399 (347–450)302 (196–403)100.0 (88.7–100.0)96 (0–217)
3Haut-Uele147 (95–212)72 (53–92)71 (53–92)49.1 (29.9–80.6)0 (0–0)
4Sud-Kivu28 (17–43)24 (17–34)23 (16–30)88.3 (50.8–100.0)0 (0–10)
5Tshopo31 (20–46)22 (16–28)21 (16–28)69.1 (41.7–100.0)0 (0–3)
6Bas-Uele5 (2–10)13 (9–18)5 (2–10)100.0 (100.0–100.0)8 (2–14)
7Sud-Ubangi9 (4–17)1 (0–2)1 (0–2)9.8 (3.0–31.3)0 (0–0)
8Nord-Ubangi1 (0–9)1 (0–3)1 (0–2)100.0 (13.2–100.0)0 (0–1)
Beds, bed demand, occupied beds, utilisation and shortfall by province at the cut-off, from the occupancy and bed counts in the situation reports. Occupied beds are the modelled demand capped at the beds, and the shortfall is the demand above them.

Size and infections ​

Modelled infections by province
julia
province_infections_fig = plot_infections_patches(
    chn_joint;
    n = obs.n, seeding = obs.seeding, n_patches = N_PATCHES
);

Modelled infections by province, daily (top) and cumulative (bottom).

The provinces are coupled by the gravity kernel in the mixing and importation Methods section. The distances between the patches' population centres run from 191 km between Sud-Ubangi and Nord-Ubangi to 1 220 km between Sud-Kivu and Sud-Ubangi. Ituri is 324 km from Nord-Kivu and 216 km from Haut-Uele. About half of what leaves Nord-Kivu lands in Sud-Kivu, 260 km away and the second most populous of the eight. Nord-Ubangi sends about a third of its exports to Sud-Ubangi, its nearest neighbour.

Importation intensity and imports by province
julia
importation_table = summary_table(
    chn_joint, [:importation_epsilon];
    digits = 4,
    labels = Dict(:importation_epsilon => "Importation intensity")
);

province_imports_fig = plot_imports_patches(
    chn_joint;
    n = obs.n, seeding = obs.seeding, n_patches = N_PATCHES
);
1×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Importation intensity0.00250.00610.00880.01420.01830.0265

Imported infections by province. Every arrival is debited from its origin on the same day, so the figure shows where infection occurred rather than extra infection.

Point prevalence ​

Point prevalence is the number of people infected at the cut-off who have not yet died, recovered or been detected as a suspected case. We split it into people infected but not yet symptomatic and people with symptoms who have not yet been detected. Together they are the infections in the community. The point prevalence section of the Methods gives the calculation. The table gives each rate per 100,000 residents and the number of people in the community, as medians with 90% credible intervals.

Compute point prevalence by province
julia
province_prevalence = prevalence_overview(
    patch_prevalence(chn_joint, N_PATCHES),
    PROVINCE_POPULATIONS[1:N_PATCHES];
    labels = PROVINCE_LABELS[1:N_PATCHES], patch = collect(1:N_PATCHES)
);
province_prevalence_fig = plot_prevalence_ranking(
    province_prevalence; title = "Point prevalence by province"
);
ProvincePopulationInfected but not yet symptomatic per 100,000Symptomatic, undetected per 100,000In the community per 100,000Number in the community
Ituri400800013.1 (7.0–24.1)15.1 (5.4–32.9)28.4 (13.3–55.7)1140 (532–2231)
Nord-Kivu75740005.5 (2.9–10.4)6.7 (2.7–13.9)12.2 (6.0–23.4)923 (454–1773)
Haut-Uele20460002.6 (1.2–5.7)3.1 (0.9–7.0)5.8 (2.4–12.4)118 (49–253)
Tshopo25820001.1 (0.5–2.4)1.1 (0.3–2.6)2.1 (0.9–5.0)55 (23–128)
Bas-Uele12500000.2 (0.1–0.6)0.2 (0.1–0.7)0.5 (0.2–1.3)6 (2–17)
Nord-Ubangi14250000.1 (0.0–0.8)0.1 (0.0–0.6)0.2 (0.1–1.4)3 (1–19)
Sud-Ubangi27550000.0 (0.0–0.1)0.0 (0.0–0.1)0.0 (0.0–0.2)1 (0–4)
Sud-Kivu65650000.0 (0.0–0.0)0.0 (0.0–0.0)0.0 (0.0–0.1)1 (0–3)

A province rate is an average over zones with different levels of transmission. The health-zone estimates give the same rates zone by zone.

Reproduction number by province ​

The national reproduction number is in reproduction number over time.

Reproduction number by province
julia
province_rt_fig = plot_rt_patches(
    chn_joint;
    n = obs.n, breakpoint = _BREAKPOINT,
    n_patches = N_PATCHES,
    rt_start = _rt_start_plot,
    rt_walk_start = clamp(_BREAKPOINT - RT_WALK_LEAD, _rt_start_plot, obs.n),
    display_start = _rt_start_plot,
    as_of_date = string(obs.cutoff), seeding = obs.seeding,
    ramp = RT_INTERVENTION_RAMP
);

The reproduction number of each province, with the national trajectory in grey. The deviations sum to zero, so the grey band is the incidence-weighted middle of the panels rather than any one province. Sud-Kivu, Tshopo, Bas-Uele, Sud-Ubangi and Nord-Ubangi hold few confirmed cases, so their panels are carried mostly by the deviation prior and their widths are not measurements.

The spread of the provinces' log-Rt deviations is the spatial diagnostic. Its prior gives a 26% probability that the Ituri to Nord-Kivu ratio moves by more than 25% over the window. With eight patches and five of them carrying little signal, the cross-province correlation is not identified and tracks its prior.

Spatial hyperparameter summary table
julia
# Labels for the spatial hyperparameters, shared by this table and the pair
# plot against their prior below.
spatial_labels = Dict(
    :region_sd => "Rt deviation spread",
    :region_halflife => "Rt deviation half-life (days)",
    :region_corr_primary_secondary => "Ituri-N.Kivu Rt correlation",
    :province_ascertainment_sd => "Ascertainment spread",
    :importation_epsilon => "Importation intensity",
    :importation_destination_sd => "Importation destination spread",
    :importation_origin_destination_correlation =>
        "Origin-destination correlation",
    :importation_flow_sd => "Importation flow spread",
    :importation_reciprocity => "Importation reciprocity",
    :province_cfr_sd => "Lethality spread (logit)",
    :province_death_ascertainment_sd => "Death-confirmation spread"
)
spatial_hyper_table = summary_table(
    chn_joint,
    [
        :region_sd, :region_halflife, :region_corr_primary_secondary,
        :province_ascertainment_sd,
    ];
    digits = 3, labels = spatial_labels
);
4×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Rt deviation spread0.0070.0330.0650.1370.1870.294
2Rt deviation half-life (days)25.71636.64944.29763.73980.475120.579
3Ituri-N.Kivu Rt correlation-0.727-0.489-0.3090.0280.2260.523
4Ascertainment spread0.0140.0470.0780.1540.2040.338
The spatial hyperparameters of the province deviations. The correlation is between deviation innovations that sum to zero, so it leans negative, and with equal spreads each province's correlations with the other seven average −1/7.

Case-fatality ratio by province ​

The case-fatality ratio of each province is set against the national ratios in the confirmed case-fatality ratio. Only the product of a province's lethality and death confirmation is identified, and the province compositions Methods section says how the priors split it.

Province case-fatality spread
julia
province_cfr_spread = summary_table(
    chn_joint,
    [:province_cfr_sd, :province_death_ascertainment_sd];
    digits = 3, labels = spatial_labels
);
2×7 DataFrame
RowQuantityLower 90%Lower 60%Lower 30%Upper 30%Upper 60%Upper 90%
StringFloat64Float64Float64Float64Float64Float64
1Lethality spread (logit)0.0110.0460.0780.150.20.294
2Death-confirmation spread0.0080.030.0520.10.1330.189
Province case-fatality table
julia
confirmed_cfr = delay_corrected_confirmed_cfr(
    chn_joint;
    obs_confirmed = obs.confirmed_cases,
    obs_confirmed_deaths = obs.confirmed_deaths
);
province_cfr = province_cfr_table(
    chn_joint, confirmed_cfr;
    province_cases = vec(sum(province_cases.increments; dims = 2)),
    province_deaths = vec(sum(province_deaths.increments; dims = 2)),
    n_patches = N_PATCHES
);
8×4 DataFrame
RowProvinceNaive observed confirmed ratioDelay-corrected confirmed CFRStructural (infection-based) CFR
StringStringStringString
1Ituri46.5%43.6% (36.5–52.1%)48.1% (36.0–60.7%)
2Nord-Kivu55.9%56.4% (47.4–67.9%)50.9% (39.1–63.8%)
3Haut-Uele43.6%43.9% (36.2–52.8%)48.5% (36.1–60.4%)
4Sud-Kivu33.3%46.9% (34.3–65.3%)48.9% (36.4–60.8%)
5Tshopo35.5%45.6% (34.9–58.3%)48.7% (36.4–61.0%)
6Bas-Uele30.8%45.6% (32.8–61.2%)48.8% (36.2–61.0%)
7Sud-Ubangi50.0%47.4% (34.5–65.2%)49.2% (36.4–61.0%)
8Nord-Ubangi33.3%46.7% (33.2–63.8%)48.8% (36.5–61.1%)

Province parameters against their priors ​

The pair plots below set the province parameters against their prior, drawn from the province model.

Draw from the patch model's prior
julia
prior_patch_chn = patch_prior_draws(obs);
Spatial hyperparameter pair plot (prior overlaid)
julia
spatial_pair_fig = plot_pair(
    chn_joint,
    [
        :region_sd, :region_halflife, :region_corr_primary_secondary,
        :province_ascertainment_sd, :importation_epsilon,
        :importation_destination_sd,
        :importation_origin_destination_correlation, :importation_flow_sd,
        :importation_reciprocity, :province_cfr_sd,
        :province_death_ascertainment_sd,
    ];
    prior = prior_patch_chn, labels = spatial_labels
);

Joint posterior of the spatial hyperparameters, with the prior overlaid. These are the spread, half-life and correlation of the Rt deviations, the spread of case ascertainment, the importation intensity, its destination and flow spreads and their correlations, and the spreads of lethality and death confirmation.

Each province's pair plot sets the reproduction number at the cut-off against the relative case ascertainment, the case-fatality ratio against the relative death confirmation, and the importation intensity against the export weight relative to Ituri. Each pair is identified only as a product, so a ridge between the two is expected and the prior sets the position along it.

Compute the per-province pair plots
julia
province_pair_labels = Dict(
    :R_T_patch => "Reproduction number",
    :province_ascertainment => "Case ascertainment",
    :CFR_patch => "Case-fatality ratio",
    :province_death_ascertainment => "Death confirmation",
    :importation_epsilon_patch => "Importation intensity",
    :export_weight => "Export weight"
)
# Ituri is the export reference, its weight fixed at one, so its pair plot
# leaves the weight out.
province_pair_figs = [
    plot_pair(
        chn_joint,
        [
            :R_T_patch, :province_ascertainment,
            :CFR_patch, :province_death_ascertainment,
            :importation_epsilon_patch,
            (p == 1 ? () : (:export_weight,))...,
        ];
        patch = p, prior = prior_patch_chn, labels = province_pair_labels
    )
        for p in 1:N_PATCHES
];
Ituri pair plot (prior overlaid)

Nord-Kivu pair plot (prior overlaid)

Haut-Uele pair plot (prior overlaid)

Sud-Kivu pair plot (prior overlaid)

Tshopo pair plot (prior overlaid)

Bas-Uele pair plot (prior overlaid)

Sud-Ubangi pair plot (prior overlaid)

Nord-Ubangi pair plot (prior overlaid)

Composition checks ​

Whether the model reproduces each province's observed share of the national total is on the in-sample checks page.

Data currency ​

The province blocks are the provincial tables of the situation reports: confirmed cases, confirmed deaths and the 24-hour laboratory volumes. A block that stops updating shows its last date before the cut-off rather than a flat series.

Province block currency
julia
# Every province block whose last vintage falls before the cut-off, from
# the shared stream registry rather than a per-page list of dates. The
# grace the national table allows is not applied here: one vintage behind
# is already worth reading.
province_currency = let
    status = stream_report_status(obs; stratum = :province)
    behind = status[[ismissing(d) || d > 0 for d in status.days_since], :]
    isempty(behind) ?
        Markdown.parse(
            "Every province block reports to the cut-off, $(obs.cutoff)."
        ) :
        MarkdownTable(
            DataFrame(
                "Block" => behind.label,
                "Last reported" => [
                    ismissing(d) ? "never" : string(d)
                    for d in behind.last_date
                ],
                "Days before cut-off" => [
                    ismissing(d) ? "-" : string(d)
                    for d in behind.days_since
                ]
            )
        )
end;

Every province block reports to the cut-off, 2026-10-20.

Province fit diagnostics ​

The national fit diagnostics summarise the same joint fit as a whole, and its breakdown by parameter covers every parameter.

Province-level parameter diagnostics
julia
# The quantities the sections above hold one per province: the
# reproduction number and infections to date from the renewal equation,
# the case-fatality ratio and the two ascertainment ratios the province
# compositions identify, and the importation intensity and export weight
# the per-province pair plots show.
province_diagnostic_quantities = [
    :R_T_patch, :C_T_patch, :CFR_patch, :province_ascertainment,
    :province_death_ascertainment, :importation_epsilon_patch, :export_weight,
]
province_diagnostics_labels = merge(
    province_pair_labels, Dict(:C_T_patch => "Infections to date")
)
province_diagnostics_frame = let df = parameter_diagnostics(chn_joint)
    df[in.(Symbol.(df.parameter), Ref(province_diagnostic_quantities)), :]
end
province_diagnostics_table = MarkdownTable(
    family_diagnostics_table(
        province_diagnostics_frame;
        n = length(province_diagnostic_quantities),
        labels = province_diagnostics_labels
    )
);
parameterelementsmax_rhatmin_ess_bulkabove_1.1
Importation intensity81.0062820
Infections to date81.0065540
Reproduction number81.0066060
Case-fatality ratio81.0096660
Death confirmation81.0038870
Case ascertainment81.0039580
Export weight71.00115860
Sampler diagnostics for the province-level parameters of the joint fit: the reproduction number, infections to date, case-fatality ratio, case and death ascertainment ratios, importation intensity and export weight.

Saving province assets ​

The summary dashboard shows the province comparison, the province map, the reproduction number by province and the weekly cases against the reproduction number, so they are written here.

Write the province dashboard assets
julia
dashboard_dir = joinpath(
    pkgdir(BVDOutbreakSize), "docs", "src", "summary_assets"
)
mkpath(dashboard_dir)
CairoMakie.save(joinpath(dashboard_dir, "rt_provinces.png"), province_rt_fig)
# The summary's cases against R figure is drawn at the page width with
# larger labels.
CairoMakie.save(
    joinpath(dashboard_dir, "cases_rt_provinces.png"),
    plot_cases_rt(province_cases_rt; size = (680, 560), fontsize = 13)
)
# The summary's province map: infections to date alone.
CairoMakie.save(
    joinpath(dashboard_dir, "province_map.png"),
    plot_province_map(
        [province_infections_panel]; ncols = 1, panel_size = (680, 500)
    )
)
open(joinpath(dashboard_dir, "provinces.md"), "w") do io
    print(io, province_headline_md)
end
# The summary's compact province table: infections to date, R at the
# cut-off and the confirmed cases over the latest week of reports, the
# same week the cases against R figure ends on.
province_recent_cases = let last_day = min(last(province_cases.days), obs.n)
    weekly_count_table(
        province_cases.days, province_cases.increments[1:N_PATCHES, :],
        PROVINCE_LABELS[1:N_PATCHES];
        cutoff = obs.cutoff - Day(obs.n - last_day), n = last_day, weeks = 1
    ).count
end
open(joinpath(dashboard_dir, "provinces_summary.md"), "w") do io
    print(
        io,
        province_summary_table(
            chn_joint, N_PATCHES; recent_cases = province_recent_cases
        )
    )
end

The full analysis code, data and model definitions are in the epiforecasts/BVDOutbreakSize repository.