tests/testthat/test-calc_utility.R

test_that("calculate utility for parameter != 1", {

  risk_aversion  <- 1
  risk_tolerance <- 1 / risk_aversion
  if (interactive()) print(risk_tolerance)
  expect_equal(calc_utility(-1,  risk_tolerance),  0)
  expect_equal(calc_utility(0,   risk_tolerance),  0)
  expect_equal(calc_utility(1,   risk_tolerance),  0)
  expect_equal(calc_utility(0.5, risk_tolerance), -0.69314718)
  expect_equal(calc_utility(1.5, risk_tolerance),  0.405465108)
  
  risk_aversion  <- 2
  risk_tolerance <- 1 / risk_aversion
  if (interactive()) print(risk_tolerance)
  expect_equal(calc_utility(-1,  risk_tolerance),  0)
  expect_equal(calc_utility(0,   risk_tolerance),  0)
  expect_equal(calc_utility(1,   risk_tolerance),  0)
  expect_equal(calc_utility(0.5, risk_tolerance), -1)
  expect_equal(calc_utility(2,   risk_tolerance),  0.5)
  
  risk_aversion <- 3
  risk_tolerance <- 1 / risk_aversion
  if (interactive()) print(risk_tolerance)
  expect_equal(calc_utility(-1,  risk_tolerance),  0)
  expect_equal(calc_utility(0,   risk_tolerance),  0)
  expect_equal(calc_utility(1,   risk_tolerance),  0)
  expect_equal(calc_utility(0.5, risk_tolerance), -1.5)
  expect_equal(calc_utility(2,   risk_tolerance),  0.375)

  risk_tolerance <- 0
  expect_equal(calc_utility(-1,  risk_tolerance), 0)
  expect_equal(calc_utility(0,   risk_tolerance), 0)
  expect_equal(calc_utility(1,   risk_tolerance), 0)
  expect_equal(calc_utility(0.5, risk_tolerance), 0)
  expect_equal(calc_utility(2,   risk_tolerance), 0)

  risk_aversion <- 100
  risk_tolerance <- 1 / risk_aversion
  if (interactive()) print(risk_tolerance)
  expect_equal(calc_utility(-1,  risk_tolerance),  0)
  expect_equal(calc_utility(0,   risk_tolerance),  0)
  expect_equal(calc_utility(1,   risk_tolerance),  0)
  expect_equal(calc_utility(2,   risk_tolerance),  0.01010101)
})

test_that("calculate utility for parameter == 1", {

  risk_aversion  <- 1
  risk_tolerance <- 1 / risk_aversion
  if (interactive()) print(risk_tolerance)
  expect_equal(calc_utility(-1,   risk_tolerance),   0)
  expect_equal(calc_utility(0,   risk_tolerance),   0)
  expect_equal(calc_utility(1,   risk_tolerance),   0)
  expect_equal(round(calc_utility(0.5, risk_tolerance), 2), -0.69)
  expect_equal(round(calc_utility(1.5, risk_tolerance), 2),  0.41)
})

test_that("calculate utility when spending is zero", {

  expect_equal(calc_utility(0,   0),   0)
  expect_equal(calc_utility(0,   1/2), 0)
  expect_equal(calc_utility(0,   1),   0)
})

test_that("calculate utility when x is negative", {

  expect_equal(calc_utility(x = -1, 1/2), 0)
  expect_equal(calc_utility(x = -1, 0), 0)
  expect_equal(calc_utility(x = -1, 1), 0)
})

test_that("calculate utility when x is a vector with negative or zero", {

  expect_equal(
    calc_utility(
      x         = c(exp(1), 0, -1, 0, -1),
      parameter = 1/ c(1, 2, 2, 1,  1)
    ),
    c(1, 0, 0, 0,  0))
})

test_that("calculate utility on a vector", {

  risk_aversion  <- c(2, 2, 2)
  risk_tolerance <- 1 / risk_aversion
  spending       <- c(1, 0.5, 2)
  expect_equal(
    calc_utility(spending, risk_tolerance),
    c(0, -1, 0.5))
})

test_that("calculating inverse utility", {

  consumption <- 1
  
  parameter <- 0
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )

  parameter <- 0.0001
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )

  parameter <- 0.1
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )

  parameter <- 0.2
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )

  parameter <- 0.9999
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )
  
  parameter <- 1
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )
})

test_that("calculating inverse utility for a vector", {

  consumption <- c(1, 2)
  if (interactive()) print(consumption)
  
  parameter <- 0.1
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )

  parameter <- 0.2
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )

  parameter <- 0.9999
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )
  
  parameter <- 1
  expect_equal(
    calc_inverse_utility(calc_utility(consumption, parameter), parameter),
    consumption
  )
})

Try the R4GoodPersonalFinances package in your browser

Any scripts or data that you put into this service are public.

R4GoodPersonalFinances documentation built on June 8, 2025, 11:18 a.m.