4. Annex on non-stunning interventions

Author

Sagar Shah, Rethink Priorities

Published

March 18, 2024

About this file

This file contains cost-effectiveness analysis of non-slaughter intervention contained within Annex 2 of the report.

Generic prep

Code
rm(list=ls())
library(tidyverse)
library(scales)
library(rlang)
library(gt)
library(RColorBrewer)
library(forcats)
library(magrittr)
library(webshot2)

Run code to load useful montecarlo simulation functions and general seabream seabass assumptions

Code
# Load functions and assumptions
source("a_functions.R")
source("b_fish_assumptions.R") 
source("c_model_assumptions.R") 

Modelling assumptions

Define parameters over which to calculate share of simulation results. Definition of xvar provided in the table below.

Approach Meaning of ‘xvar’ variable means in context of calculations
Moral Value Moral value of improving fish welfare for 1 year through intervention relative to averting 1 DALY
Welfare Range Welfare gain from intervention - expressed as % of entire fish welfare range (negative to positive
Code
# Share of fish life affected by welfare intervention
  fishlifeshare_values <- c(0.01,0.02,0.05,0.10,0.15,0.25,0.35,0.50)
  
# Moral value points
  mv_table_values <- c(0.01,0.05,0.1,0.25,0.5,0.75,1,5,10,25)
  
# Moral value points
  wr_table_values <- c(0.001,0.01,0.025,0.5,0.1,0.15,0.35,0.5,0.75,0.9,1)

Calculations

Helper functions

Write helper functions to call object/vectors

Code
consumption <- function(country,species)  obtain(species,country,"tons")
mshare <- function(country) obtain("mshare_welfare",country)
psuccess <- function() get("psuccess_welfare")
weight <- function(species) obtain("weight",species)
lifexp <- function(species) obtain("lifexp",species)
cost <- function() get("cost_welfare")
stun_share <- function(species) obtain(species,"stunned")

Number of fish affected/$ and associated lifespan

Core calculation functions

Calculate number of fish affected per dollar spent

Code
# Number of fish affected per dollar
no_fish_affected <- function(country,species) {
consumption(country,species)*1E3/
  weight(species)*
  mshare(country)*
  psuccess()*
  stun_share(species)*
  years_credit*
  implementation_discount*
  fish_grocery
}

Life span of affected fish

Code
# Fish years of affected fish}
lifespan_affected_fish <- function(country,species) {
no_fish_affected(country,species)*lifexp(species)/12
}

Execution functions

Produce a table that produces every possible combination of country and species, and a list of functions over which to calculate results.

Code
no_of_countries <- length(country_list)
country_species <- expand.grid(country=country_list,species=species_list) 
measure_list <- c("lifespan_affected_fish","no_fish_affected")

I now write a function that calculates number of fish / lifespan affected per country/species pair, sums across all the country/species pairs, and then divides by costs across all countries.

Code
output_per_dollar <- function(fish_function) {

      pmap(                           # Allows repeated calcs across different input vectors
          country_species,                # Input vector 1: countries to run function over
          get(fish_function)            # Calculation function (no of fish or minutes)
                ) %>%
       as.data.frame() %>%                  # Convert to data.frame
       mutate(
         total=rowSums(.)) %>%              # Work out sum of all country and species combinations
       pull(total)/(no_of_countries*cost()) # Divide by costs across all countries

}

Run calculations

I then produce tables with montecarlo simulation results for each measure in both wide and long format.

Code
impact_per_dollar_wide <- map(measure_list,output_per_dollar) %>%                            
                              set_names(measure_list) %>%
                              as.data.frame() 
                      
impact_per_dollar_long <-  impact_per_dollar_wide %>% 
                            pivot_longer(
                                cols=1:length(measure_list),
                                names_to="description",
                                values_to="number")       

Finally I produce a vector called fypd, that calculates the lifespan of affected fish, which is needed in the $/DALY and share of simulation results.

Code
fypd <- output_per_dollar("lifespan_affected_fish")

$/DALY results

Core calculation functions

Code
results_dollar_per_daly <-
   1/(
    fypd*
    salmon_wr*
    interventionlifesshare*
    fish_welfarerange_impact/
    DALY_share_of_welfare_range) %>%
    tibble() %>%
    set_names("dollars_per_daly")

Share of simulations beating $$/DALY benchmark

Core calculation functions

Code
#Moral value approach
share_mv <- function(xvar,fishlifeshare,bar) {
  mean(bar>(1/(fypd*fishlifeshare*xvar)))
} 

# Welfare range approach
share_wr <- function(xvar,fishlifeshare,bar) {
  mean(bar>
      (1/
        (xvar*
        fypd*
        fishlifeshare*
        salmon_wr/
        DALY_share_of_welfare_range
        )))
}

Calculations

Define xvar (moral value or welfare range) values for calculating share of simulations beating a particular $/DALY bar and create combinations of xvar values, bar values and, lifeshare values over which to calculate results.

Code
 chart_values<- 10^seq(-4,4,0.01)
  xvar_values <- c(chart_values,mv_table_values,wr_table_values)
  
share_sims_calculation_grid <-   expand_grid(
                                    xvar=xvar_values,
                                    bar=bar_values,
                                    fishlifeshare=fishlifeshare_values)

Calculate results

Code
share_sims_results_table <- 
# Generate one row for unique combination of xvar_values and scenario lists
  share_sims_calculation_grid %>%
# Core calcualtions using share_mv and share_wr calculation functions
    rowwise() %>%
    mutate(
      moral_value=share_mv(xvar,fishlifeshare,bar),
      welfare_range=share_wr(xvar,fishlifeshare,bar)
    ) 

Format results table

Code
share_sims_results_table %<>%
# Convert pivot into longer format to make results easier to plot
  pivot_longer(
    cols=c(moral_value,welfare_range),
    names_to="approach",
    values_to="share_of_simulations") %>%
# Change descriptions of variables to make results easier to interpert
  mutate(
    approach=str_to_sentence(str_replace_all(approach,"_"," ")),
    bar_factor=factor(bar,levels=bar_values,labels=c("50","1K","70K")),
    fishlifeshare_factor=factor(fishlifeshare,levels=rev(fishlifeshare_values),labels=paste0(rev(fishlifeshare_values)*100,"%")))

Results tables/charts production functions

Impact per dollar density plots

Code
# Code to create impact per dollar density plot 

impact_density_plot <- function(desired_filter,named_description) { 
  impact_per_dollar_long %>%
  filter(description==desired_filter) %>%
  ggplot(
    aes(
      x=number
    )
  ) + 
  geom_density() +
  theme_light() +
  scale_x_log10(labels = scales::comma_format(drop0trailing = TRUE),n.breaks=8) +
    labs(
    title=named_description,
    y="Probability density",
    x=paste0(named_description," (log scale)"))
}

Share of simulations

Chart labels

Code
xlab_wr="
    Welfare gain from intervention as a % of total fish welfare range"

xlab_mv="Moral value of improving a fish life year via intervention
relative to averting a human DALY"

Chart function

Code
share_sims_chart <- function (
                        chart_approach,
                        xvar_lower_lim=0,
                        xvar_upper_lim=max(xvar_values),
                        xlab_des,
                        bar_value=50
                        ) {
  
share_sims_results_table %>%
    filter(
    approach==chart_approach,
    xvar<=xvar_upper_lim,
    xvar>=xvar_lower_lim,
    bar==bar_value
    ) %>%
  ggplot(
    aes(
      x=xvar,
      y=share_of_simulations,
      color=fishlifeshare_factor))+
  geom_line()+
  scale_color_brewer(palette = "Dark2") +
  theme_light()+
  labs(
    subtitle = str_to_title(paste0(chart_approach," approach")),
    title=paste0("Share of simulations where intervention beats ",bar_value,"$/DALY benchmark"),
    y="Share of simulations",
    x=xlab_des,
    linetype="$/DALY Benchmark",
    color="Share of fish \nlifespan affected \nby intervention",
    caption= "Note log scale on x-axis")
}

Table function

Code
share_beating_bar_table <- function(values,chart_approach,bar_value) {

share_sims_results_table %>%
  filter(
      xvar %in% values,
      fishlifeshare %in% fishlifeshare_values,
      bar==bar_value,
      approach==chart_approach) %>%
      select(xvar,share_of_simulations,fishlifeshare_factor) %>%
      distinct() %>%
      pivot_wider(id_cols=xvar,names_from=fishlifeshare_factor,values_from=share_of_simulations) %>%
      arrange(xvar) %>%
      gt() %>%
      tab_header(title = paste0("Share of simulations beating $",bar_value,"/DALY bar")) %>%
      tab_spanner(label="Share of fish lifespan affected by intervention",columns=paste0(fishlifeshare_values*100,"%"))
}

wr_bar_table <- function(bar_value) {
  share_beating_bar_table(wr_table_values,"Welfare range",bar_value) %>%
  fmt_percent(decimals=1) %>%  
  fmt_percent(columns=xvar,decimals=0) %>%
  cols_label(xvar=xlab_wr) 
}

mv_bar_table <- function(bar_value) {
  share_beating_bar_table(mv_table_values,"Moral value",bar_value) %>%
  fmt_percent(decimals=1) %>%  
  fmt_number(columns=xvar,drop_trailing_zeros=TRUE) %>%
  cols_label(xvar=xlab_mv) 
}

Outputs

Impact per dollar

Density plot: number of fish affected

Code
impact_density_plot("no_fish_affected","Number of fish affected per dollar")

Density plot: lifespan of fish affected

Code
impact_density_plot("lifespan_affected_fish","Lifespan of affected fish per dollar")

Results table

Code
tab_a22_impact_per_dollar_nonstunning <- summarystats(impact_per_dollar_wide)
tab_a22_impact_per_dollar_nonstunning
statistic lifespan_affected_fish no_fish_affected
mean 0.973 0.748
sd 1.15 0.892
median 0.607 0.468
p5 0.0795 0.0608
p10 0.127 0.0972
p25 0.280 0.214
p75 1.24 0.949
p90 2.19 1.69
p95 3.08 2.41

$/DALY approach

Summary stats

Code
summarystats(results_dollar_per_daly)
statistic dollars_per_daly
mean 66.7M
sd 2.21B
median 2.41K
p5 88.6
p10 158
p25 507
p75 18.1K
p90 218K
p95 1.23M

Density plot

Code
fig_a21_dollars_per_daly_nonstunning <- densplotv(results_dollar_per_daly$dollars_per_daly)+
    scale_x_log10(
      limits=c(1,1E12),
      labels = scales::label_number_si(),
      n.breaks=15)+
    labs(
      title="Density plot - $/DALY distribution",
      y="",
      x="$/DALY (log scale)")

fig_a21_dollars_per_daly_nonstunning 

Share beating bar

Code
share_below_bar <- function(bar_value) (mean(results_dollar_per_daly<bar_value))

tibble(
  `$/DALY bar`=bar_values,
  `Share beating bar`=map_vec(bar_values,share_below_bar)) %>% 
  gt() %>%
  fmt_percent(columns=`Share beating bar`,decimals =1 )
$/DALY bar Share beating bar
50 2.0%
1000 35.9%
70000 84.6%

Share of simulations beating bar

Share of simulation chart: welfare range

Code
fig_a22_50benchmark_wv_nonstunning <- 
share_sims_chart("Welfare range",bar_value=50,xvar_lower_lim=0.01,xvar_upper_lim=1,xlab_des=xlab_wr)+
  scale_x_log10(labels = scales::percent_format(drop0trailing = TRUE),n.breaks=10)+
  scale_y_continuous(limits=c(0,0.75),n.breaks=10,labels = scales::percent_format(accuracy = 1))

Share of simulation chart: moral value

Code
fig_a23_50benchmark_mv_nonstunning <- 
  share_sims_chart("Moral value",bar_value=50,xvar_lower_lim=0.001,xvar_upper_lim=30,xlab_des=xlab_mv)+
  scale_x_log10(labels = scales::label_number_si(drop0trailing = TRUE),n.breaks=11)+
  scale_y_continuous(limits=c(0,1),n.breaks=10,labels = scales::percent_format(accuracy = 1))

Share of simulation results tables: $50/DALY benchmark - welfare range

Code
wr_bar_table(50)
Share of simulations beating $50/DALY bar
Welfare gain from intervention as a % of total fish welfare range Share of fish lifespan affected by intervention
1% 2% 5% 10% 15% 25% 35% 50%
0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0%
1% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.2% 0.4%
2% 0.0% 0.0% 0.0% 0.0% 0.2% 0.7% 1.4% 2.8%
10% 0.0% 0.0% 0.4% 1.8% 4.0% 8.2% 12.1% 17.0%
15% 0.0% 0.1% 1.0% 4.0% 7.2% 13.0% 17.8% 23.3%
35% 0.2% 0.9% 5.0% 12.1% 17.8% 25.9% 31.2% 37.3%
50% 0.4% 1.8% 8.2% 17.0% 23.3% 31.4% 37.3% 43.8%
75% 1.0% 4.0% 13.0% 23.3% 29.8% 38.6% 44.6% 50.5%
90% 1.5% 5.3% 15.6% 26.3% 32.7% 41.7% 47.5% 53.4%
100% 1.8% 6.2% 17.0% 28.1% 34.6% 43.8% 49.3% 55.0%

Share of simulation results tables: $50/DALY benchmark - moral value

Code
mv_bar_table(50)
Share of simulations beating $50/DALY bar
Moral value of improving a fish life year via intervention relative to averting a human DALY Share of fish lifespan affected by intervention
1% 2% 5% 10% 15% 25% 35% 50%
0.01 0.0% 0.0% 0.0% 0.0% 0.0% 0.2% 0.9% 2.8%
0.05 0.0% 0.0% 0.2% 2.8% 6.9% 17.5% 27.8% 40.0%
0.1 0.0% 0.1% 2.8% 11.8% 22.6% 40.0% 52.2% 64.3%
0.25 0.2% 2.8% 17.5% 40.0% 54.8% 71.6% 79.7% 86.5%
0.5 2.8% 11.8% 40.0% 64.3% 76.2% 86.5% 91.4% 95.0%
0.75 6.9% 22.6% 54.8% 76.2% 84.6% 92.2% 95.2% 97.3%
1 11.8% 32.5% 64.3% 82.6% 89.2% 95.0% 96.9% 98.3%
5 64.3% 82.6% 95.0% 98.3% 99.2% 99.6% 99.8% 99.9%
10 82.6% 92.8% 98.3% 99.5% 99.7% 99.9% 99.9% 100.0%
25 95.0% 98.3% 99.6% 99.9% 99.9% 100.0% 100.0% 100.0%

Share of simulations - other results (not published in the main document)

Code
mv_bar_table(1000)
Share of simulations beating $1000/DALY bar
Moral value of improving a fish life year via intervention relative to averting a human DALY Share of fish lifespan affected by intervention
1% 2% 5% 10% 15% 25% 35% 50%
0.01 0.1% 1.4% 11.8% 32.5% 46.7% 64.3% 74.5% 82.6%
0.05 11.8% 32.5% 64.3% 82.6% 89.2% 95.0% 96.9% 98.3%
0.1 32.5% 56.9% 82.6% 92.8% 96.2% 98.3% 99.1% 99.5%
0.25 64.3% 82.6% 95.0% 98.3% 99.2% 99.6% 99.8% 99.9%
0.5 82.6% 92.8% 98.3% 99.5% 99.7% 99.9% 99.9% 100.0%
0.75 89.2% 96.2% 99.2% 99.7% 99.8% 99.9% 100.0% 100.0%
1 92.8% 97.6% 99.5% 99.8% 99.9% 100.0% 100.0% 100.0%
5 99.5% 99.8% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
10 99.8% 99.9% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
25 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
Code
mv_bar_table(70000)
Share of simulations beating $70000/DALY bar
Moral value of improving a fish life year via intervention relative to averting a human DALY Share of fish lifespan affected by intervention
1% 2% 5% 10% 15% 25% 35% 50%
0.01 88.2% 95.8% 99.1% 99.7% 99.8% 99.9% 100.0% 100.0%
0.05 99.1% 99.7% 99.9% 100.0% 100.0% 100.0% 100.0% 100.0%
0.1 99.7% 99.9% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
0.25 99.9% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
0.5 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
0.75 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
1 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
5 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
10 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
25 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0%
Code
wr_bar_table(1000)
Share of simulations beating $1000/DALY bar
Welfare gain from intervention as a % of total fish welfare range Share of fish lifespan affected by intervention
1% 2% 5% 10% 15% 25% 35% 50%
0% 0.0% 0.0% 0.0% 0.0% 0.1% 0.4% 0.9% 1.8%
1% 0.0% 0.2% 1.8% 6.2% 10.3% 17.0% 22.3% 28.1%
2% 0.4% 1.8% 8.2% 17.0% 23.3% 31.4% 37.3% 43.8%
10% 6.2% 14.0% 28.1% 39.5% 46.9% 55.0% 60.0% 64.5%
15% 10.3% 19.9% 34.6% 46.9% 53.4% 60.9% 65.2% 69.3%
35% 22.3% 33.5% 49.3% 60.0% 65.2% 71.1% 74.4% 77.6%
50% 28.1% 39.5% 55.0% 64.5% 69.3% 74.6% 77.6% 80.4%
75% 34.6% 46.9% 60.9% 69.3% 73.6% 78.1% 80.8% 83.1%
90% 37.9% 49.9% 63.2% 71.4% 75.2% 79.6% 81.9% 84.1%
100% 39.5% 51.4% 64.5% 72.5% 76.1% 80.4% 82.6% 84.7%
Code
wr_bar_table(70000)
Share of simulations beating $70000/DALY bar
Welfare gain from intervention as a % of total fish welfare range Share of fish lifespan affected by intervention
1% 2% 5% 10% 15% 25% 35% 50%
0% 3.6% 9.5% 22.3% 33.5% 40.4% 49.3% 54.7% 60.0%
1% 33.5% 45.7% 60.0% 68.7% 72.8% 77.6% 80.3% 82.6%
2% 49.3% 60.0% 71.1% 77.6% 80.8% 84.0% 85.8% 87.5%
10% 68.7% 75.5% 82.6% 86.5% 88.5% 90.5% 91.6% 92.8%
15% 72.8% 79.0% 84.9% 88.5% 90.2% 91.9% 92.9% 93.9%
35% 80.3% 84.5% 89.1% 91.6% 92.9% 94.2% 94.8% 95.5%
50% 82.6% 86.5% 90.5% 92.8% 93.9% 94.9% 95.5% 96.1%
75% 84.9% 88.5% 91.9% 93.9% 94.7% 95.6% 96.2% 96.6%
90% 86.0% 89.2% 92.5% 94.2% 95.1% 96.0% 96.4% 96.8%
100% 86.5% 89.7% 92.8% 94.4% 95.2% 96.1% 96.5% 96.9%

Export charts for main report

Code
tab_a22_impact_per_dollar_nonstunning
statistic lifespan_affected_fish no_fish_affected
mean 0.973 0.748
sd 1.15 0.892
median 0.607 0.468
p5 0.0795 0.0608
p10 0.127 0.0972
p25 0.280 0.214
p75 1.24 0.949
p90 2.19 1.69
p95 3.08 2.41
Code
fig_a21_dollars_per_daly_nonstunning 

Code
fig_a22_50benchmark_wv_nonstunning

Code
fig_a23_50benchmark_mv_nonstunning

Code
save_chart("fig_a21_dollars_per_daly_nonstunning .png",fig_a21_dollars_per_daly_nonstunning )
save_chart("fig_a22_50benchmark_wv_nonstunning.png",fig_a22_50benchmark_wv_nonstunning)
save_chart("fig_a23_50benchmark_mv_nonstunning.png",fig_a23_50benchmark_mv_nonstunning)
save_table(tab_a22_impact_per_dollar_nonstunning,"tab_a22_impact_per_dollar_nonstunning.html")

Sensitivity to DALY share of welfare range assumption

I now run a sensitivity analysis to see how the results might differ if:

  • Fish welfare range (relative to humans) was double that used in the baseline analysis

  • Averting a DALY would be equivalent to raising human welfare by 10% of human welfare range for a year (rather than 50%, as per baseline analysis).

Core calculation code

Code
share_wr_alt <- function(xvar,fishlifeshare,bar) {
  mean(bar>
      (1/
        (xvar*
        fypd*
        fishlifeshare*
        salmon_wr_alt/
        DALY_share_of_welfare_range_alt
        )))
}

Combinations over which to run analysis

Code
share_sims_calculation_grid_alt <-  expand_grid(
                                    xvar=wr_table_values,
                                    bar=50,
                                    fishlifeshare=fishlifeshare_values)

Run calculations

Code
share_sims_results_table_alt <- 
# Generate one row for unique combination of xvar_values and scenario lists
  share_sims_calculation_grid_alt %>%
# Core calcualtions using share_mv and share_wr calculation functions
    rowwise() %>%
    mutate(
      base=share_wr(xvar,fishlifeshare,bar),
      alt=share_wr_alt(xvar,fishlifeshare,bar)
    ) %>%
  distinct() %>%
  mutate(
    fishlifeshare=factor(fishlifeshare,labels=paste0(fishlifeshare*100,"%"))) %>%
  select(-bar) %>%
  pivot_longer(
    cols=c(base,alt),
    names_to="daly_assumption",
    values_to="share_of_sims")

Format output

Code
alt_table_comparison <- function(assumption) {
share_sims_results_table_alt %>% 
 filter(daly_assumption==assumption) %>%
 select(-daly_assumption) %>%
  pivot_wider(
    id_cols=xvar,
    names_from=c(fishlifeshare),
    values_from=share_of_sims) %>%
  arrange(xvar) %>%
  gt() %>%
  fmt_percent(decimals=1) %>%
  cols_label(
    xvar="Welfare gain from intervention as a share of fish welfare range") %>%
  tab_spanner(
    label="Share of fish lifespan affected by intervention",
    columns=-1
      )
}

Generate output tables

Code
alt_table_comparison("base") %>%
  tab_header(title="Share of simulations beating $50/DALY - baseline assumptions")
Share of simulations beating $50/DALY - baseline assumptions
Welfare gain from intervention as a share of fish welfare range Share of fish lifespan affected by intervention
1% 2% 5% 10% 15% 25% 35% 50%
0.1% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0%
1.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.2% 0.4%
2.5% 0.0% 0.0% 0.0% 0.0% 0.2% 0.7% 1.4% 2.8%
10.0% 0.0% 0.0% 0.4% 1.8% 4.0% 8.2% 12.1% 17.0%
15.0% 0.0% 0.1% 1.0% 4.0% 7.2% 13.0% 17.8% 23.3%
35.0% 0.2% 0.9% 5.0% 12.1% 17.8% 25.9% 31.2% 37.3%
50.0% 0.4% 1.8% 8.2% 17.0% 23.3% 31.4% 37.3% 43.8%
75.0% 1.0% 4.0% 13.0% 23.3% 29.8% 38.6% 44.6% 50.5%
90.0% 1.5% 5.3% 15.6% 26.3% 32.7% 41.7% 47.5% 53.4%
100.0% 1.8% 6.2% 17.0% 28.1% 34.6% 43.8% 49.3% 55.0%
Code
alt_table_comparison("alt") %>%
  tab_header(title="Share of simulations beating $50/DALY - alternative assumptions")
Share of simulations beating $50/DALY - alternative assumptions
Welfare gain from intervention as a share of fish welfare range Share of fish lifespan affected by intervention
1% 2% 5% 10% 15% 25% 35% 50%
0.1% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.2% 0.4%
1.0% 0.0% 0.0% 0.4% 1.8% 4.0% 8.2% 12.1% 17.0%
2.5% 0.0% 0.4% 2.8% 8.2% 13.0% 20.6% 25.9% 31.4%
10.0% 1.8% 6.2% 17.0% 28.1% 34.6% 43.8% 49.3% 55.0%
15.0% 4.0% 10.3% 23.3% 34.6% 41.7% 50.5% 55.9% 60.9%
35.0% 12.1% 22.3% 37.3% 49.3% 55.9% 62.9% 67.2% 71.1%
50.0% 17.0% 28.1% 43.8% 55.0% 60.9% 67.5% 71.1% 74.6%
75.0% 23.3% 34.6% 50.5% 60.9% 66.1% 71.9% 75.0% 78.1%
90.0% 26.3% 37.9% 53.4% 63.2% 68.3% 73.6% 76.6% 79.6%
100.0% 28.1% 39.5% 55.0% 64.5% 69.3% 74.6% 77.6% 80.4%