## Saturday, November 2, 2013

### Consumer's Choosing an Optimal Bundle - Utility Maximization

# The theoretical basis of classical consumer theory lies
# in utility maximization. The idea is that consumers
# make consumption decisions based on choosing a bundle
# of goods that will maximize individual utility.
# Despite this hypothesis being largely unsupported
# by reproducible results indicating the superiority
# any utility function over all other functions this
# theory persists.

# In this simulation I set up an easy framework for the
# user to simulate the decision of the consumer as a
# function of the utility function, price of goods,
# and consumer budget.

# Uof is the function that takes a choice of
# x and y and calculates the corresponding z as
# well as expected utility.

Uof <- function(XY) {
# x cannot be less than 0 or more than all of the
# budget expended on x
x <- min(max(XY[1],0), b/px)
# y cannot be less than 0 or more than the remaining
# budget left after x expenditures
y <- min(max(XY[2],0), (b - x*px)/py)

# z is purchased with whatever portion of the budget
# remains
z <- (b - x*px - y*py)/pz

# Display the quantity of x,y, and z chosen.
print(paste0("x:", x, " y:", y, " z:", z))

# Since optim minimizes a function I am making
# the returned value equal to negative utility.
-utility(x,y,z)
}

# I have defined a few different potential utility
# functions.

cobb.douglas2  <- function(x,y,z) x^.3*y^.3
cobb.douglas3  <- function(x,y,z) x^.3*y^.3*z^.4
lientief3      <- function(x,y,z) min(x,y,z)
linear.concave <- function(x,y,z) x^.3 + y^.2 + z^.5
mixed          <- function(x,y,z) min(x, y)^.5*z^.5

# Choose the utility function to maximize
utility <- cobb.douglas3

# Choose the prices
px <- 1
py <- 1
pz <- 1

# Choose the total budget
b <- 100

# Let's see how much utility we get out of setting
# x=1 and y=1
Uof(c(1,1))

# The following command will maximize the utility
# subject the choice of the utility fuction, prices,
# and budget.
optim(c(1,1), Uof, method="BFGS")

# In general it is a good idea not to use such
# computational methods as this since by instead
# solving mathematically in closed form for solutions
# to utility maximization functions, you can discover
# how exactly a change in one parameter in the model
# may lead to a change in quantity demanded of a
# type of good.

# Of course you could do something fairly simple along
# these lines in R as well.

# For instance, define vectors:

# Once again choose what utility function
utility <- linear.concave

xv  <- NULL
yv  <- NULL

pxv <- seq(.25,10,.25)

for (px in pxv) {
res <- optim(c(1,1), Uof, method="BFGS")
xv <- c(xv, max(res$par[1],0)) yv <- c(yv, max(res$par[2],0))
}

plot(xv, pxv, type="l", main="Demand for X(px)",
xlab="Quantity of X", ylab="Price of X")

# The map of the demand function for X 



plot(yv, pxv, type="l", main="Demand for Y(px)",
xlab="Quantity of Y", ylab="Price of X") 


# The map of the demand function for y as a function
# of the price of x. It is a little erratic probably
# because of lack of precision in the optimization
# algorithm.
Highlighted by Pretty R at inside-R.org