9.2 Solution methods for implementation of tailored policies and elimination of infeasible interventions

We demonstrate how the tailored and universal blood safety portfolio problems can be solved, using the solution methods described in Sections 3.1 and 3.2 of the paper. We include an implementation in R, for which we use the following packages and source files:

The file portfolio_functions.R contains the expected cost function for the optimal portfolio model.

cost_portfolio_main(z_i, M_li, A_ji, 
                    c_k, P_ik, d_i, w_i, n_i, c_test_j, R_jk, Q_jk, 
                    g, c_mod_l, H_lk, 
                    full_output = 0)

The first three function parameters for this R function are the decision variables:

  • z_i (\(\textbf{z}\)), a vector whose entries indicate whether donor group \(i\) is defered (0) or accepted (1).
  • M_li (\(\textbf{M}\)), a matrix whose entries indicate whether modification \(l\) is applied to donor group \(i\) (1 if applied).
  • A_ji (\(\textbf{A}\)), a matrix whose entries indicate whether test \(j\) is applied to donor group \(i\) (1 if applied).

The next 11 function parameters are model parameters:

  • c_k (\(\textbf{c}\)), a matrix whose entries indicate the expected net present monetary cost of releasing a donation infectious with disease \(k\).
  • P_ik (\(\textbf{P}\)), a matrix whose entries indicate the prevalence of disease \(k\) among donors from group \(i\).
  • d_i (\(\textbf{d}\)), a vector whose entries indicate the cost of replacing a deferred donor from group \(i\).
  • w_i (\(\textbf{w}\)), a vector whose entries indicate the cost of processing a donation from donor group \(i\).
  • n_i (\(\textbf{n}\)), a vector whose entries indicate the number of donors in donor group \(i\).
  • c_test_j (\(\boldsymbol\phi\)), a vector whose entries indicate the per-donation cost of applying test \(j\).
  • R_jk (\(\textbf{R}\)), a matrix whose entries indicate the sensitivity of test \(j\) for disease \(k\) (set to 0 if test \(j\) cannot detect disease \(k\)).
  • Q_jk (\(\textbf{Q}\)), a matrix whose entries indicate the specificity of test \(j\) for disease \(k\) (set to 1 if test \(j\) cannot detect disease \(k\)).
  • g (\(g\)) the cost of removing a donation that tests positive, including confirmatory testing and donor notification costs.
  • c_mod_l (\(\boldsymbol\psi\)), a vector whose entries indicate the per-donation cost of applying modification \(l\).
  • H_lk (\(\textbf{H}\)), a matrix whose entries indicate the risk-reducing multiplier for modification \(l\) on disease \(k\) (set to 1 if modification \(l\) does not reduce risk for disease \(k\)).

Finally, the function parameter full_output can be set to 1 if the user wishes to return 5 additional performance metrics in addition to the value of the cost function. Those are the testing cost, modification cost, net monetary cost of released infectious donations, and the average residual risk of releasing infectious donations. The last two metrics are reported separately for each disease and are returned as \(1 \times K\) vectors.

9.2.1 Example problem

To demonstrate the solution methods, we construct an example problem with hypothetical donor groups, diseases, tests, and modifications:

As an example, we can calculate the expected cost function (and related performance metrics) with no intervention:

x
obj_cost 1.467311e+06
yield 1.000000e+04
test_cost 0.000000e+00
mod_cost 0.000000e+00
downstream_net_mon_cost 1.267311e+06
avg_resid_risk1 2.342000e-04
avg_resid_risk2 1.360000e-05
avg_resid_risk3 1.624200e-03
avg_resid_risk4 1.400000e-06
avg_resid_risk5 1.010000e-05

We can calculate the same performance metrics for a policy of using all tests and modifications:

x
obj_cost 3.776313e+06
yield 7.877982e+03
test_cost 3.000000e+05
mod_cost 2.950000e+06
downstream_net_mon_cost 1.023505e+04
avg_resid_risk1 7.000000e-06
avg_resid_risk2 4.000000e-07
avg_resid_risk3 2.300000e-06
avg_resid_risk4 0.000000e+00
avg_resid_risk5 4.000000e-07

Comparing these two strategies, we see that ‘All tests and modifications’ decreases the yield, leads to high test and modification costs, and reduces the downstream net monetary cost by 99.2%, by reducing the residual risk for each of the diseases. However, the combined test and modification costs exceed $3 million, leading to a higher overall objective cost. Most likely, the optimal portfolio uses a more limited combination of deferrals, testing, and modifications.

We consider two classes of the optimal portfolio problem. In the tailored portfolios problem, policymakers are willing to apply a different set of tests and/or modifications to each of the donor groups that are not deferred. The number of feasible policies can be calculated as \(\sum_{i=0}^I \binom{I}{i} 2^{i(L+J)}\):

## [1] "75418890624 policies to evaluate"

Policymakers may prefer not to deal with the complexity of differential testing by donor group. In that case, we can solve the problem as a uniform test/modification policy problem, and the number of feasible policies can be calculated as \(1+\sum_{i=1}^I \binom{I}{i} 2^{(L+J)}\)

## [1] "4033 policies to evaluate"


9.2.2 Reducing solution space for tailored policies

When tailored policies are allowed, we can take advantage of the fact that each donor group can be linearly separated in the objective function. To do so, we solve the problem for each donor group separately and then take the best policy from each group. Doing this allows us to evaluate just \(I (1+ 2^{L+J})\) policies:

## [1] "390 policies to evaluate"


9.2.3 Eliminating infeasible interventions

We can reduce the search space further by eliminating some tests or modifications from consideration before running the binary integer program. To do so, we calculate \(\gamma_{ji}^{test}\) and \(\gamma_{li}^{mod}\) as described in Section A above. We define the functions inc_obj_cost_single_test and inc_obj_cost_single_mod to calculate \(\gamma^\text{test}_{j,i}\) and \(\gamma^\text{mod}_{l,i}\), respectively:

Next, we use these functions to calculate \(\gamma^\text{test}_{j,i}\) and \(\gamma^\text{mod}_{l,i}\) for our example problem:

## [1] "Test 1 lowers costs in 0 of 6 donor groups. Can eliminate test 1."
## [1] "Test 2 lowers costs in 2 of 6 donor groups."
## [1] "Test 3 lowers costs in 6 of 6 donor groups."
## [1] "Test 4 lowers costs in 6 of 6 donor groups."
## [1] "Mod 1 lowers costs in 0 of 6 donor groups. Can eliminate mod 1."
## [1] "Mod 2 lowers costs in 1 of 6 donor groups."

We obtain the following values for \(\gamma^\text{test}_{ji}\):

Group 1 Group 2 Group 3 Group 4 Group 5 Group 6
Test 1 11.8 11.8 11.4 11.8 11.8 11.8
Test 2 7.6 -32.4 7.3 -177.6 7.6 7.6
Test 3 -49.4 -49.4 -49.4 -477.4 -210.6 -49.4
Test 4 -46.9 -46.9 -46.9 -493.6 -215.3 -46.9


and for \(\gamma^{\text{mod}}_{li}\):

Group 1 Group 2 Group 3 Group 4 Group 5 Group 6
Mod 1 203.1 183.4 203.1 15.9 167.1 182.1
Mod 2 75.0 75.0 75.0 75.0 75.0 -4.8


We see that test 1 and modification 1 can be eliminated for all donor groups. Additionally, for the tailored portfolio problem, we can eliminate all policies that use test 2 in donor groups 1, 3, 5, and 6, and we can eliminate policies that use modification 2 in all donor groups but group 6.

If the number of donor groups is large relative to the number of tests and modifications, one can construct a hypothetical ‘maximum prevalence’ donor group by taking the maximum prevalence for each disease across each donor group (i.e., \(\textbf{p}^{\tilde{i}}_k = \max_i \textbf{P}_{i, k}\)) and assessing each intervention on this hypothetical donor group. The advantage is that this computes in \(L+J\) iterations intead of \(I(L+J)\), but the disadvantage is that it may fail to eliminate some interventions that impact risk for multiple diseases (multiplex tests, pathogen reduction).

In our example problem, we were able to eliminate two infeasible interventions (test 1 and modification 1), decreasing our search space by approximately a factor of 4 (from 390 to 102 tailored policies if assessed for each donor group separately; from 4033 to 1009 uniform policies).


9.2.4 Solving the example portfolio problem

We start by solving the tailored portfolio problem where we allow each non-deferred donor group to receive a unique combination of tests and modifications. We construct a matrix whose rows correspond to each possible policy for a single donor group:

z_i a1 a2 a3 a4 m1 m2
1 0 0 0 0 0 0
1 0 1 0 0 0 0
1 0 0 1 0 0 0
1 0 1 1 0 0 0
1 0 0 0 1 0 0
1 0 1 0 1 0 0
1 0 0 1 1 0 0
1 0 1 1 1 0 0
1 0 0 0 0 0 1
1 0 1 0 0 0 1
1 0 0 1 0 0 1
1 0 1 1 0 0 1
1 0 0 0 1 0 1
1 0 1 0 1 0 1
1 0 0 1 1 0 1
1 0 1 1 1 0 1
0 0 0 0 0 0 0

We iterate over each donor group, evaluating our objective function for each policy and identifying the universal portfolio policy that minimizes our objective function.

i z_i a1 a2 a3 a4 m1 m2
1 1 0 0 1 0 0 0
2 1 0 1 1 0 0 0
3 1 0 0 1 0 0 0
4 1 0 1 1 1 0 0
5 1 0 0 0 1 0 0
6 0 0 0 0 0 0 0

From this we conclude that the optimal tailored policy is to use test 2 in donor groups 2 and 4; test 3 in donor groups 1, 2, 3, and 4; test 4 in donor groups 4 and 5, and to defer donor group 6.

Next we assess the optimal universal policy, where any donor group not deferred receives the same set of tests and modifications. Again we start by creating a list of all feasible donor groups:

z1 z2 z3 z4 z5 z6 a1 a2 a3 a4 m1 m2
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0 1 0 0 0
## [1] 1009

Next, we iterate over each policy to identify the policy that minimizes the objective function value:

z1 z2 z3 z4 z5 z6 a1 a2 a3 a4 m1 m2
323 1 0 1 0 1 0 0 0 1 0 0 0

We conclude from this that the optimal universal policy is to defer donor groups 2, 4, and 6 and to apply test 3 to all collected donations.

Finally, we can compare performance metrics for our optimal tailored and universal portfolio to the two benchmark policies we created above: the ‘all tests and modifications’ scenario, and ‘no intervention scenario’:

pol obj_cost yield test_cost mod_cost downstream_net_mon_cost
No intervention 1467311.1 10000.000 0 0 1267311.11
All test/mods 3776312.8 7877.982 300000 2950000 10235.05
Opt. universal 499825.4 8623.510 34880 0 162694.08
Opt. tailored 473016.2 9579.677 55882 0 166346.65

Compared to the optimal universal policy, the optimal tailored policy has a lower objective function value, a higher donation yield (because no donor groups are deferred), a slightly higher test cost, and a higher net monetary cost due to released infectious donations. For both portfolios, the objective function value is a fraction of the objective function value from either of the benchmarks.