End of production

Harvest

Here, we are evaluating any collection method that does not kill the shrimp before removing them from the ponds or tanks nor pumps them directly to slaughter. This includes cast nets or seine nets, scoop nets, draining shrimp out of the pond into a net, and mechanically pumping shrimp out of the pond.

Prevalence

All shrimp who make it to slaughter age are harvested. Some intensive and super-intensive farms use pumps that pump shrimp directly into the ice slurry slaughter, so these do not apply to this welfare threat. Therefore, we use ranges between 99 to 100% and 95 to 100%, respectively.

Extensive and semi-intensive farms probably only use collection methods of the type considered here, so we set these to 100%.

Our prevalence estimates are:

Extensive Semi-intensive Intensive Super-intensive
100% 100% 99–100% 95–100%
find_good_sd_binary(mean_val=0.995, tol=1e-6, sd_val=0.01,
                   fifth_percentile=0.99, ninety_fifth_percentile=1)
find_good_sd_binary(mean_val=0.975, tol=1e-6, sd_val=0.01,
                   fifth_percentile=0.95, ninety_fifth_percentile=1)
[1] 0.003744034
[1] 0.01852459

Sampling from beta distribution:

prev_harvest_stat <- data.frame(FarmType = c(
  "Extensive", "Semi-Intensive","Intensive","Super-Intensive"),
                               mean = c(0.99999, 0.999999, 0.995, 0.975),
                               sd = c(0.0000001, 0.0000001, 0.003744034, 0.01852459))
prev_harvest_dist<-mapply(sample_beta, prev_harvest_stat$mean, prev_harvest_stat$sd)
colnames(prev_harvest_dist)<-prev_harvest_stat$FarmType
prev_harvest_dist[,1:2] <- 1

prev_harvest_unadjusted<-as.data.frame(prev_harvest_dist)
prev_harvest<-prev_harvest_unadjusted*stage_probabilities[,3] # weighting by the probability a shrimp makes it to slaughter age

Pain-Tracks

Our hypothesized pain category allocations are as follows:

We think the duration of harvest varies by farm type so we construct a Pain-Track for each farm type. However, we use the same pain intensity attributions for each.

dur_harvest_ext<-runif(n, 1/3, 1) 
dur_harvest_semi<-runif(n, 1/3, 1)
dur_harvest_int<-runif(n, 1/6, 0.75)
dur_harvest_super<-runif(n, 1/12, 1/3)

pain_harvest<-data.frame(sample_dirichlet(1, 20, 69, 10)) %>%
  `colnames<-`(paincategories)

Combine the intensity and duration information

paintrack_harvest_ext<-(dur_harvest_ext * pain_harvest)

paintrack_harvest_semi<-(dur_harvest_semi * pain_harvest)

paintrack_harvest_int<-(dur_harvest_int * pain_harvest)

paintrack_harvest_super<-(dur_harvest_super * pain_harvest)

Farmer’s often lower the level of water in the pond then use a dragnet to collect shrimp. Shrimp are sometimes taken out of the dragnet in smaller groups (e.g. see this video). In these cases, shrimp left in the dragnet may be experience long periods before being collected out of the ponds. Shrimp Welfare Project’s (2022, p.15) India Scoping Report states that “once shrimp are taken from the water via a dragnet, they are placed in crates and left for several minutes before being weighed.”

Additionally, some shrimp will be taken out of the pond and then discarded in the sorting process (e.g. due to discoloration). These shrimp likely die from air exposure. Even shrimp who are not discarded may die during this evaluation period, as death from oxidative stress only takes a bit longer than 30 minutes for P. vannamei (Liu et al., 2015). We attempt to account for these instances by estimating a maximum harvest length of an hour.

Shrimp who are collected out of the ponds experience prolonged air exposure, which could cause death by suffocation. They may also be crushed by other shrimp or by farm workers. We, therefore, assign most pain to ‘hurtful’ and ‘disabling’.

Weight the pain tracks by prevalence estimations and proportion of farming attributable to each farm type.

harvest_farms<-data.frame(
  ext = paintrack_harvest_ext*prev_harvest$Extensive*prop_sample$Ext,
  semi = paintrack_harvest_semi*prev_harvest$`Semi-Intensive`*prop_sample$Semi,
  int = paintrack_harvest_int*prev_harvest$Intensive*prop_sample$Int,
  super = paintrack_harvest_super*prev_harvest$`Super-Intensive`*prop_sample$Super)

Add the pain categories across farm types and calculate the disabling-equivalent pain hours.

harvest<-harvest_farms %>%
  mutate(allfarms.Annoying = ext.Annoying + semi.Annoying + int.Annoying + super.Annoying,
         allfarms.Hurtful = ext.Hurtful + semi.Hurtful + int.Hurtful + super.Hurtful,
         allfarms.Disabling = ext.Disabling + semi.Disabling + int.Disabling + super.Disabling,
         allfarms.Excruciating = ext.Excruciating + semi.Excruciating + int.Excruciating + super.Excruciating,)

average_hours_harvest <- harvest %>%
  select(starts_with("allfarms"))

average_hours_harvest$Disabling_Equivalent<- (
  average_hours_harvest$allfarms.Annoying*Annoying_Weight) + (
    average_hours_harvest$allfarms.Hurtful*Hurtful_Weight) +(
      average_hours_harvest$allfarms.Disabling*Disabling_Weight)+(
        average_hours_harvest$allfarms.Excruciating*Excruciating_Weight)

harvest_summary<-cbind(round(rbind(
  (quantile(x =average_hours_harvest$allfarms.Annoying, probs = c(.05, .50, .95))), 
  (quantile(x =average_hours_harvest$allfarms.Hurtful, probs = c(.05, .50, .95))), 
  (quantile(x =average_hours_harvest$allfarms.Disabling, probs = c(.05, .50, .95))),
  (quantile(x =average_hours_harvest$allfarms.Excruciating, probs = c(.05, .50, .95))),
  (quantile(x =average_hours_harvest$Disabling_Equivalent, probs = c(.05, .50, .95)))), 10),
  "Mean" = colMeans(average_hours_harvest))
row.names(harvest_summary)<-c(
  "Annoying_harvest","Hurtful_harvest","Disabling_harvest", "Excruciating_harvest", "Disabling-Equivalent_Harvest")
show_table(harvest_summary)
5% 50% 95% Mean
Annoying_harvest 0.0128554 0.0319189 0.0625832 0.0340299
Hurtful_harvest 0.1148507 0.2319090 0.3655179 0.2347488
Disabling_harvest 0.0296953 0.0655724 0.1148003 0.0680293
Excruciating_harvest 0.0001429 0.0022085 0.0107088 0.0033801
Disabling-Equivalent_Harvest 0.1149168 0.9550166 6.3192196 1.7883996

Slaughter

Here, we are evaluating the ice slurry method of slaughter.

Prevalence

All shrimp who are slaughtered are slaughtered using ice slurry, bar those on farms that the Shrimp Welfare Project has provided electrical stunners to. SWP currently estimate they have helped 1.2 billion shrimp by providing electrical stunners—that’s 0.3% of the number of penaeids slaughtered per year:

slaughtered_samp<-read.csv(file="../data/slaughtered_samples.csv") # from Guesstimate model
slaughtered_samp<-slaughtered_samp[,1:3] # keep only penaeids

# sum across rows
slaughtered_samp_totals<-slaughtered_samp %>% 
  mutate(total=vannamei + monodon + other_pen)

(1200000000/mean(slaughtered_samp_totals$total))*100
[1] 0.2990682

Shrimp who are sold live are not slaughtered so we must account for this in our estimations. We use the same estimate for the proportion of shrimp sold live as in the Waterless transport section, that between 1% and 2% of shrimp are sold live and, therefore, are not slaughtered during the farming cycle. Thus, we weight our estimations by between 0.99 and 0.98. We then account for the fact that only shrimp who make it slaughter age and do not die during collection are slaughtered. To do this, we weight by the relevant life-stage proportions, and by our estimate that between 0% and 50% of shrimp die during collection, before slaughter.

Our prevalence estimates are:

Extensive Semi-intensive Intensive Super-intensive
Prevalence of using ice slurry 50–90% 60–95% 98–100% 100%
Die before slaughter on farms that use ice 0–50% 0–50% 0–25% 0%

First, we draw from the beta distribution for the prevalence of using ice slurry:

find_good_sd_binary(mean_val=0.7, tol=1e-6,
                   fifth_percentile=0.5, ninety_fifth_percentile=0.9)
find_good_sd_binary(mean_val=0.775, tol=1e-6,
                   fifth_percentile=0.6, ninety_fifth_percentile=0.95)
find_good_sd_binary(mean_val=0.9885, tol=1e-6, sd_val=0.1,
                   fifth_percentile=0.98, ninety_fifth_percentile=0.997)
[1] 0.1243683
[1] 0.1120429
[1] 0.005626181

Sampling from beta distribution:

prev_iceslurry_stat <- data.frame(FarmType = c(
  "Extensive", "Semi-Intensive","Intensive","Super-Intensive"),
                               mean = c(0.7, 0.775, 0.9885, 0.99999),
                               sd = c(0.1243683, 0.1120429, 0.005626181, 0.00001))
prev_iceslurry_dist<-mapply(sample_beta, prev_iceslurry_stat$mean, prev_iceslurry_stat$sd)
colnames(prev_iceslurry_dist)<-prev_iceslurry_stat$FarmType
prev_iceslurry_dist[,4]<-1

Then, the prevalence of shrimp that die after harvest, before slaughter.

find_good_sd_binary(mean_val=0.25, tol=1e-6,
                   fifth_percentile=0, ninety_fifth_percentile=0.5)
find_good_sd_binary(mean_val=0.125, tol=1e-6,
                   fifth_percentile=0, ninety_fifth_percentile=0.25)
[1] 0.1729832
[1] 0.08962196
prev_slaught_stat <- data.frame(FarmType = c(
  "Extensive", "Semi-Intensive","Intensive","Super-Intensive"), mean = c(0.25, 0.25, 0.125, 0.00001),
  sd = c(0.1729832, 0.1729832, 0.08962196, 0.00001))
prev_slaught_dist<-mapply(sample_beta, prev_slaught_stat$mean, prev_slaught_stat$sd)
colnames(prev_slaught_dist)<-prev_slaught_stat$FarmType
prev_slaught_dist[,4]<-1 # as we are multiplying with the ice slurry prevalences, we cannot set this to 0, as the calculation would not work. Since we just want the super-intensive prevalence to be 1, we set it to 1 here. 

prev_slaught_unadjusted<-as.data.frame((1-prev_slaught_dist)*prev_iceslurry_dist)

# adjust for the fact that only shrimp who don't die pre-slaughter are slaughtered
slaughter_population_proportion <- stage_probabilities[,3]

# adjust for shrimp slaughtered by electrical stunners provided by SWP
electrical_stunning<-1-(1200000000/mean(slaughtered_samp_totals$total))

# also adjust for shrimp sold live
prev_slaught<-prev_slaught_unadjusted*slaughter_population_proportion*electrical_stunning*(1-sold_live)

Pain-Tracks

We expect that the duration and intensity of ice slurry slaughter is roughly the same across farms types, so we use only one pain track here.

dur_slaught<-rtruncnorm(n, 0.008, 0.16, mean=0.06, sd=0.015)

pain_slaught<-data.frame(sample_dirichlet(20, 79, 1, 0), Annoying=0) %>%
  `colnames<-`(paincategories)

Combine the intensity and duration information

paintrack_slaught_ext<-(dur_slaught * pain_slaught)

paintrack_slaught_semi<-(dur_slaught * pain_slaught)

paintrack_slaught_int<-(dur_slaught * pain_slaught)

paintrack_slaught_super<-(dur_slaught * pain_slaught)

Weineck et al. (2018) found that shrimp show no heart rate after around four minutes in ice slurry. We increase the maximum time it could take to seven minutes to account for the fact that ice used on farms may be slightly warmer than in laboratory conditions.

Whether shrimp feel pain during ice slurry slaughter is highly uncertain. P. vannamei shrimp tail-flick vigorously after being submerged in the ice slurry (Weineck et al., 2018). Tail-flicking is a reflex—when shrimp’ abdomens are removed from the rest of their body, they still show tail-flicking activity (Weineck et al., 2018). As such, it is unlikely to be, by itself, a reliable indicator of pain. However, that does not necessarily mean that the individual cannot consciously experience it.

The salinity of ice slurry is also likely to be different from that of the pond. Given that shrimp can detect cold (Tani & Kuramoto, 1998) and are likely to be stressed from being out of the pond and in an environment of different temperature and salinity, we assign most pain to ‘hurtful’ and ‘disabling’.

Finally, we combine the prevalence, intensity, and duration estimates.

slaught_farms<-data.frame(
  ext = paintrack_slaught_ext*prev_slaught$Extensive*prop_sample$Ext,
  semi = paintrack_slaught_semi*prev_slaught$`Semi-Intensive`*prop_sample$Semi,
  int = paintrack_slaught_int*prev_slaught$Intensive*prop_sample$Int,
  super = paintrack_slaught_super*prev_slaught$`Super-Intensive`*prop_sample$Super)

Add the pain categories across farm types and calculate the disabling-equivalent pain hours.

slaught<-slaught_farms %>%
  mutate(allfarms.Annoying = ext.Annoying + semi.Annoying + int.Annoying + super.Annoying,
         allfarms.Hurtful = ext.Hurtful + semi.Hurtful + int.Hurtful + super.Hurtful,
         allfarms.Disabling = ext.Disabling + semi.Disabling + int.Disabling + super.Disabling,
         allfarms.Excruciating = ext.Excruciating + semi.Excruciating + int.Excruciating + super.Excruciating,)

average_hours_slaught <- slaught %>%
  select(starts_with("allfarms"))

average_hours_slaught$Disabling_Equivalent<- (
  average_hours_slaught$allfarms.Annoying*Annoying_Weight) + (
    average_hours_slaught$allfarms.Hurtful*Hurtful_Weight) +(
      average_hours_slaught$allfarms.Disabling*Disabling_Weight)+(
        average_hours_slaught$allfarms.Excruciating*Excruciating_Weight)

slaught_summary<-cbind(round(rbind(
  (quantile(x =average_hours_slaught$allfarms.Annoying, probs = c(.05, .50, .95))), 
  (quantile(x =average_hours_slaught$allfarms.Hurtful, probs = c(.05, .50, .95))), 
  (quantile(x =average_hours_slaught$allfarms.Disabling, probs = c(.05, .50, .95))),
  (quantile(x =average_hours_slaught$allfarms.Excruciating, probs = c(.05, .50, .95))),
  (quantile(x =average_hours_slaught$Disabling_Equivalent, probs = c(.05, .50, .95)))), 10),
  "Mean" = colMeans(average_hours_slaught))
row.names(slaught_summary)<-c(
  "Annoying_slaught","Hurtful_slaught","Disabling_slaught", "Excruciating_slaught", "Disabling-Equivalent_Ice-slurry_slaughter")
show_table(slaught_summary)
5% 50% 95% Mean
Annoying_slaught 0.0000000 0.0000000 0.0000000 0.0000000
Hurtful_slaught 0.0000124 0.0001939 0.0009612 0.0003025
Disabling_slaught 0.0106834 0.0236873 0.0377748 0.0238985
Excruciating_slaught 0.0024501 0.0058400 0.0103551 0.0060433
Disabling-Equivalent_Ice-slurry_slaughter 0.2658441 2.6654759 7.2117464 3.0488984