13 abr 2019

Derivar funciones y problemas de optimización en R


En la siguiente entrada se muestra como derivar funciones en R, y se resuelve un problema de optimización con funciones objetivos con más de dos variables, sin restricciones. Para aplicar esta entrada, se resuelve el ejemplo 1 presentado por Chiang y Wainwright (2006), en el libro “Métodos Fundamentales de Economía Matemática”, p.315.


Encuentre los valores extremos de la función:

f2*x^2 + x*y + 4*y^2 + x*z + z^2 + 2

Lo primero es obtener las primeras derivadas. Para esto, insertamos en R la expresión correspondiente a la función objetivo, utilizando la función expression. Posteriormente, utilizando la función D, obtenemos las primeras derivadas parciales respecto a cada variable.

> FunObj<-expression(2*x^2 + x*y + 4*y^2 + x*z + z^2 + 2)

> # Primeras derivadas
> D(FunObj,"x")
2 * (2 * x) + y + z

> D(FunObj,"y")
x + 4 * (2 * y)

> D(FunObj,"z")
x + 2 * z

Luego, es necesario identificar las condiciones de primer orden f1=f2=f3=0. Esto, lo podemos obtener matricialmente a partir del sistema de ecuaciones resultante (las primeras derivadas obtenidas anteriormente) [Ver R Tutorial #7 - Solvingsystems of linear equations - Statistical Programming Language R]:

> coef<-matrix(c(4,1,1,1,8,0,1,0,2), 3, 3, byrow=T)
> coef
     [,1] [,2] [,3]
[1,]    4    1    1
[2,]    1    8    0
[3,]    1    0    2

> rest<-c(0,0,0)
> 
> var<-solve(coef)%*%rest
> rownames(var)<-c("x","y","z")
> var
  [,1]
x    0
y    0
z    0

Por tanto, los valores críticos identificados son x*=y*=z*=0.
Ahora, una vez identificados los puntos críticos y obtenidas las primeras derivadas, es necesario encontrar la matriz hessiana [3x3] de segundas derivadas, dado que necesitamos verificar si esta es definida positiva o negativa, para determinar la condición necesaria de segundo orden. Utilizando las primeras derivadas obtenidas anteriormente, se obtienen las derivadas parciales de segundo orden para conformar la hessiana (H):

> H<-matrix(NA, 3,3)

> H[1,1]<-D(expression(4*x+y+z),"x")
> H[1,2]<-D(expression(4*x+y+z),"y")
> H[1,3]<-D(expression(4*x+y+z),"z")
 
> H[2,1]<-D(expression(x+8*y),"x")
> H[2,2]<-D(expression(x+8*y),"y")
> H[2,3]<-D(expression(x+8*y),"z")
 
> H[3,1]<-D(expression(x+2*z),"x")
> H[3,2]<-D(expression(x+2*z),"y")
> H[3,3]<-D(expression(x+2*z),"z")
> H
     [,1] [,2] [,3]
[1,]    4    1    1
[2,]    1    8    0
[3,]    1    0    2
Ahora, sabiendo que:

Máximo: H1 < 0; H2 > 0; H3 < 0
Mínimo: H1, H2,..,Hn>0

Ahora, necesitamos encontrar los menores principales (H1, H2,..,Hn∣) de la matriz hessiana (H), estos se obtienen a partir de los determinantes de las matrices cuadradas que podemos obtener de la matriz hessiana. Estos determinantes se obtienen en R a partir de la función det:
> H1<-H[1,1]
> H2<-det(H[c(1:2),c(1:2)])
> H3<-det(H[c(1:3),c(1:3)])
> 
> H1; H2; H3
[1] 4
[1] 31
[1] 54
Dado que todos los signos de los determinantes son positivos (>0), la matriz es definida positiva, por lo que, los puntos críticos identificados corresponden a un mínimo.

Recodificación de variables usando dplyr en R

Una base de datos suele tener diversos tipos de variables del tipo cualitativo y cuantitativo. En función del tipo de variables aplicamos di...