# eviSimulation: Expected Value of Information (EVI) Simulation. In decisionSupport: Quantitative Support of Decision Making under Uncertainty

## Description

The Expected Value of Information (EVI) is calculated based on a Monte Carlo simulation of the expected welfare (or values or benefits) of two different decision alternatives. The expected welfare is calculated for the current estimate of variables determining welfare and a prospective estimate of these variables. The prospective estimate resembles an improvement in information.

## Usage

 ```1 2 3``` ```eviSimulation(welfare, currentEstimate, prospectiveEstimate, numberOfModelRuns, randomMethod = "calculate", functionSyntax = "data.frameNames", relativeTolerance = 0.05, verbosity = 0) ```

## Arguments

 `welfare` either a `function` or a `list` with two `functions`, i.e. `list(p1,p2)`. In the first case the function is the net benefit (or welfare) of project approval (PA) vs. the status quo (SQ). In the second case the element `p1` is the function valuing the first project and the element `p2` valuing the second project, viz. the welfare function of `p1` and `p2` respectively. `currentEstimate` `estimate`: describing the distribution of the input variables as currently being estimated. `prospectiveEstimate` `estimate` or `list` of `estimate` objects: describing the prospective distribution of the input variables which could hypothetically be achieved by collecting more information, viz. improving the measurement. `numberOfModelRuns` `integer`: The number of running the welfare model for the underlying Monte Carlo simulation. `randomMethod` `character`: The method to be used to sample the distribution representing the input estimate. For details see option `method` in `random.estimate`. `functionSyntax` `character`: function syntax used in the welfare function(s). For details see `mcSimulation`. `relativeTolerance` `numeric`: the relative tolerance level of deviation of the generated confidence interval from the specified interval. If this deviation is greater than `relativeTolerance` a warning is given. `verbosity` `integer`: if `0` the function is silent; the larger the value the more verbose is output information.

## Details

#### The Expected Value of Information (EVI)

The Expected Value of Information is the decrease in the EOL for an information improvement from the current (ρ_X_current) to a better prospective (hypothetical) information (ρ_X_prospective):

EVI := EOL(ρ_X_current) - EOL(ρ_X_prospective).

## Value

An object of class `eviSimulation` with the following elements:

`\$current`

`welfareDecisionAnalysis` object for `currentEstimate`

`\$prospective`

`welfareDecisionAnalysis` object for single `prospectiveEstimate` or a list of `welfareDecisionAnalysis` objects for `prospectiveEstimate` being a list of `estimate`s.

`\$evi`

Expected Value of Information(s) (EVI)(s) gained by the prospective estimate(s) w.r.t. the current estimate.

## References

Hubbard, Douglas W., How to Measure Anything? - Finding the Value of "Intangibles" in Business, John Wiley & Sons, Hoboken, New Jersey, 2014, 3rd Ed, http://www.howtomeasureanything.com/.

Gravelle, Hugh and Ray Rees, Microeconomics, Pearson Education Limited, 3rd edition, 2004.

`welfareDecisionAnalysis`, `mcSimulation`, `estimate`, `summary.eviSimulation`
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142``` ```############################################################# # Example 1 Only one prospective estimate: ############################################################# numberOfModelRuns=10000 # Create the estimate object: variable=c("revenue","costs") distribution=c("posnorm","posnorm") lower=c(10000, 5000) upper=c(100000, 50000) currentEstimate<-as.estimate(variable, distribution, lower, upper) prospectiveEstimate<-currentEstimate revenueConst<-mean(c(currentEstimate\$marginal["revenue","lower"], currentEstimate\$marginal["revenue","upper"])) prospectiveEstimate\$marginal["revenue","distribution"]<-"const" prospectiveEstimate\$marginal["revenue","lower"]<-revenueConst prospectiveEstimate\$marginal["revenue","upper"]<-revenueConst # (a) Define the welfare function without name for the return value: profit<-function(x){ x\$revenue-x\$costs } # Calculate the Expected Value of Information: eviSimulationResult<-eviSimulation(welfare=profit, currentEstimate=currentEstimate, prospectiveEstimate=prospectiveEstimate, numberOfModelRuns=numberOfModelRuns, functionSyntax="data.frameNames") # Show the simulation results: print(summary(eviSimulationResult)) ############################################################# # (b) Define the welfare function with a name for the return value: profit<-function(x){ list(Profit=x\$revenue-x\$costs) } # Calculate the Expected Value of Information: eviSimulationResult<-eviSimulation(welfare=profit, currentEstimate=currentEstimate, prospectiveEstimate=prospectiveEstimate, numberOfModelRuns=numberOfModelRuns, functionSyntax="data.frameNames") # Show the simulation results: print(summary((eviSimulationResult))) ############################################################# # (c) Two decision variables: decisionModel<-function(x){ list(Profit=x\$revenue-x\$costs, Costs=-x\$costs) } # Calculate the Expected Value of Information: eviSimulationResult<-eviSimulation(welfare=decisionModel, currentEstimate=currentEstimate, prospectiveEstimate=prospectiveEstimate, numberOfModelRuns=numberOfModelRuns, functionSyntax="data.frameNames") # Show the simulation results: print(summary((eviSimulationResult))) ############################################################# # Example 2 A list of prospective estimates: ############################################################# numberOfModelRuns=10000 # Define the welfare function with a name for the return value: profit<-function(x){ list(Profit=x\$revenue-x\$costs) } # Create the estimate object: variable=c("revenue","costs") distribution=c("posnorm","posnorm") lower=c(10000, 5000) upper=c(100000, 50000) currentEstimate<-as.estimate(variable, distribution, lower, upper) perfectInformationRevenue<-currentEstimate revenueConst<-mean(c(currentEstimate\$marginal["revenue","lower"], currentEstimate\$marginal["revenue","upper"])) perfectInformationRevenue\$marginal["revenue","distribution"]<-"const" perfectInformationRevenue\$marginal["revenue","lower"]<-revenueConst perfectInformationRevenue\$marginal["revenue","upper"]<-revenueConst # (a) A list with one element prospectiveEstimate<-list(perfectInformationRevenue=perfectInformationRevenue) # Calculate the Expected Value of Information: eviSimulationResult<-eviSimulation(welfare=profit, currentEstimate=currentEstimate, prospectiveEstimate=prospectiveEstimate, numberOfModelRuns=numberOfModelRuns, functionSyntax="data.frameNames") # Show the simulation results: print(summary(eviSimulationResult)) ############################################################# # (b) A list with two elements perfectInformationCosts<-currentEstimate costsConst<-mean(c(currentEstimate\$marginal["costs","lower"], currentEstimate\$marginal["costs","upper"])) perfectInformationCosts\$marginal["costs","distribution"]<-"const" perfectInformationCosts\$marginal["costs","lower"]<-costsConst perfectInformationCosts\$marginal["costs","upper"]<-costsConst prospectiveEstimate<-list(perfectInformationRevenue=perfectInformationRevenue, perfectInformationCosts=perfectInformationCosts) # Calculate the Expected Value of Information: eviSimulationResult<-eviSimulation(welfare=profit, currentEstimate=currentEstimate, prospectiveEstimate=prospectiveEstimate, numberOfModelRuns=numberOfModelRuns, functionSyntax="data.frameNames") # Show the simulation results: print(summary(eviSimulationResult)) ############################################################# # Example 3 A list of prospective estimates and two decision variables: ############################################################# numberOfModelRuns=10000 # Create the current estimate object: variable=c("revenue","costs") distribution=c("posnorm","posnorm") lower=c(10000, 5000) upper=c(100000, 50000) currentEstimate<-as.estimate(variable, distribution, lower, upper) # Create a list of two prospective estimates: perfectInformationRevenue<-currentEstimate revenueConst<-mean(c(currentEstimate\$marginal["revenue","lower"], currentEstimate\$marginal["revenue","upper"])) perfectInformationRevenue\$marginal["revenue","distribution"]<-"const" perfectInformationRevenue\$marginal["revenue","lower"]<-revenueConst perfectInformationRevenue\$marginal["revenue","upper"]<-revenueConst perfectInformationCosts<-currentEstimate costsConst<-mean(c(currentEstimate\$marginal["costs","lower"], currentEstimate\$marginal["costs","upper"])) perfectInformationCosts\$marginal["costs","distribution"]<-"const" perfectInformationCosts\$marginal["costs","lower"]<-costsConst perfectInformationCosts\$marginal["costs","upper"]<-costsConst prospectiveEstimate<-list(perfectInformationRevenue=perfectInformationRevenue, perfectInformationCosts=perfectInformationCosts) # Define the welfare function with two decision variables: decisionModel<-function(x){ list(Profit=x\$revenue-x\$costs, Costs=-x\$costs) } # Calculate the Expected Value of Information: eviSimulationResult<-eviSimulation(welfare=decisionModel, currentEstimate=currentEstimate, prospectiveEstimate=prospectiveEstimate, numberOfModelRuns=numberOfModelRuns, functionSyntax="data.frameNames") # Show the simulation results: print(sort(summary(eviSimulationResult)),decreasing=TRUE,along="Profit") ```