Separate state, signal, and action
In a fictional migration, an unknown adverse condition can cause a loss of one hundred thousand euros. For this exercise, its prior probability is 20%. A response costs twenty thousand and eliminates that specific loss; we assign no other effects to it. Without more information, responding costs twenty thousand and not responding has the same expected loss. Now add a test arriving before the choice. The test does not fix the condition: it produces a signal that can be wrong. Identify three distinct elements in the decision worksheet: actual state, observed result, and chosen action. In an APS project, first check whether the rehearsal represents the window’s version, volume, permissions, and calendar. Do not import the exercise probability into a real service. The model practices conditional calculation, not a claim that technology eliminates every risk.
Build the joint table
The signal is positive in 75% of adverse conditions and 10% of normal conditions. These are conditional rates, not the chance of a problem after a positive. Multiply each rate by its corresponding state probability: adverse and positive gives 0.20 × 0.75 = 0.15; normal and positive gives 0.80 × 0.10 = 0.08. The remaining branches are 0.05 and 0.72. All four sum to one. Thus positive-signal probability is 0.23 and adverse-condition probability given positive is 0.15 / 0.23, about 65.2%. After a negative it is 0.05 / 0.77, about 6.5%. Draw the four branches before dividing. In a report, always identify the denominator: all trials, only positives, or only adverse conditions answer different questions.
Choose within each branch and deduct testing cost
After a positive signal, expected loss without response exceeds twenty thousand, so the model selects response. After a negative, expected loss without response is about 6.49 thousand, below response cost. Before observing the test, the policy has expected cost 0.23 × 20 + 0.05 × 100 = 9.6 thousand. Do not use 65.2% as the chance of receiving the signal; that percentage is already conditional on a positive. Gross improvement over the initial twenty thousand is 10.4 thousand. If testing costs three thousand, expected total is 12.6 thousand and net improvement is 7.4 thousand. Include waiting costs or lost options where applicable. A technically accurate test can have little value for this choice if it arrives late or does not change the admissible action.
Review limits and deliver a recommendation
Perfect information in this model would allow response only in the 20% adverse states: expected cost four thousand. Maximum gross improvement would be sixteen thousand. Imperfect testing cannot exceed that bound with the same actions and consequences; different values indicate an error or a model change. This comparison uses expected cost alone. A mandatory per-event loss limit can exclude nonresponse even after a negative. For the workshop, submit the joint table, decision after each signal, total cost, assumptions, and one condition changing the recommendation. Ask a colleague to check denominators and whether action remains available in time. Executing the code confirms arithmetic, not empirical validity of the rates or authority to accept exposure. Record unresolved questions and who will validate them.
// Original fictional model. Values in thousands of euros; response removes only the specified loss.
function informationModel({prior,sensitivity,falsePositive,loss,responseCost,testCost}){
if(![prior,sensitivity,falsePositive].every(x=>Number.isFinite(x)&&x>=0&&x<=1)||![loss,responseCost,testCost].every(x=>Number.isFinite(x)&&x>=0))throw Error('Invalid model inputs');
const positive={adverse:prior*sensitivity,normal:(1-prior)*falsePositive};
const negative={adverse:prior*(1-sensitivity),normal:(1-prior)*(1-falsePositive)};
const round=x=>Math.round(x*1e10)/1e10;
function branch(x){const p=x.adverse+x.normal;if(p===0)return{probability:0,posterior:null,action:'unreachable',weightedCost:0};const risk=x.adverse/p;return{probability:round(p),posterior:round(risk),action:responseCost<risk*loss?'respond':responseCost===risk*loss?'tie':'do-not-respond',weightedCost:Math.min(p*responseCost,x.adverse*loss)};}
const plus=branch(positive),minus=branch(negative),base=Math.min(responseCost,prior*loss),policy=plus.weightedCost+minus.weightedCost,perfect=prior*Math.min(responseCost,loss);
return {positive:{...plus,weightedCost:round(plus.weightedCost)},negative:{...minus,weightedCost:round(minus.weightedCost)},baseline:round(base),beforeTestCost:round(policy),withTestCost:round(policy+testCost),grossValue:round(base-policy),netValue:round(base-policy-testCost),perfectInformationValue:round(base-perfect)};
}
const inputs={prior:.2,sensitivity:.75,falsePositive:.1,loss:100,responseCost:20,testCost:3};
console.log(JSON.stringify(informationModel(inputs)))Testing costs three thousand and arrives before the decision. The policy responds to positives and not to negatives, with expected total cost 12.6 thousand under the supplied assumptions. It is not a guarantee about one migration’s loss.
Common pitfalls
Reversing conditional probabilities, treating a negative as no risk, omitting test cost or delay, and confusing an informative signal with a response changing the event.
Related topics: Compare options and size reserves · Quantitative decisions and value of information · Analyze evidence and priorities
Calculate the joint distribution first and then the best action in each branch. Information improves this choice only if timely and capable of supporting a useful decision within agreed criteria.
Reference: Concerns of project managers: decision analysis approaches · PMI-RMP five-domain ECO, updated-2024 public document