Processing math: 0%

Introducción a deaR

Seminario informal

V. Coll, V. J. Bolós y R. Benítez

25 de enero de 2019

¿Qué es DEA?

DEA es una técnica de programación matemática que permite la construcción de una superficie envolvente, frontera eficiente o función de producción empírica, a partir de los datos disponibles del conjunto de DMUs objeto de estudio.

Las DMUs que determinan la envolvente son denominadas DMUs eficientes y aquellas que no permanecen sobre la misma son consideradas DMUs ineficientes.

DEA permite la evaluación de la eficiencia relativa de cada una de las DMUs.

Caracterización de los modelos DEA

  • Tipología de medida de eficiencia: modelos radiales, modelos no radiales, etc.
  • Orientación del modelo.
  • Tipología de rendimientos a escala.

El paquete deaR

  • Paquete de R
  • Desarrollado con el IDE Rstudio
  • No sólo es un conjunto de funciones que permite resolver los modelos DEA más usuales
  • Proporciona una infraestructura de datos flexible que permite incorporar nuevos modelos de forma sencilla

Modelos disponibles

Modelos radiales

Modelo Orientación Retornos a escala Función
Radial básico IO/OO/DIR CRS/VRS/NIRS/NDRS/GRS model_basic
Multiplicativo IO/OO CRS/VRS/NIRS/NDRS/GRS model_multiplier
Free disposal hull IO/OO/DIR VRS model_fdh

Modelos disponibles

Modelos no radiales

Modelo Orientación Retornos a escala Función
No radial básico IO/OO CRS/VRS/NIRS/NDRS/GRS model_nonradial
Aditivo NA CRS/VRS/NIRS/NDRS/GRS model_additive
Preference Structure IO/OO CRS/VRS/NIRS/NDRS/GRS model_deaps
Slack-based model IO/OO/NO CRS/VRS/NIRS/NDRS/GRS model_sbmeff
Eficiencia de beneficios1 NA CRS/VRS/NIRS/NDRS/GRS model_profit
1: Sólo en la versión de desarrollo (github)

Modelos disponibles

Modelos de supereficiencia

Modelo Orientación Retornos a escala Función
Superef. básica IO/OO/DIR CRS/VRS/NIRS/NDRS/GRS model_supereff
Superef. basada en slacks IO/OO/NO CRS/VRS/NIRS/NDRS/GRS model_sbmeff
Superef. aditiva NA CRS/VRS/NIRS/NDRS/GRS model_addsupereff
Superef. compuesta2 IO/OO/NO CRS/VRS/NIRS/NDRS/GRS model_sbmcomposite
2: Sólo en la versión de desarrollo (github)

Modelos disponibles

Modelos fuzzy

Modelo Orientación Retornos a escala Función
Modelo Guo-Tanaka IO/OO CRS modelfuzzy_guotanaka
Modelo Kao-Liu Todos Todos modelfuzzy_kaoliu
Modelo Posibilístico IO/OO/DIR CRS/VRS/NIRS/NDRS/GRS modelfuzzy_possibilistic

Modelos disponibles

Otros modelos

Modelo Orientación Retornos a escala Función
Índice de Malmquist IO/OO VSR malmquist_index
Bootstrap básico IO/OO CRS/VRS bootstrap_basic
Eficiencias cruzadas IO/OO CRS/VRS cross_efficiency
Eficiencias cruzadas fuzzy IO/OO CRS cross_efficiency_fuzzy

Instalar deaR

Workflow

Flujo de trabajo

Importar desde Excel

Leer los datos

  • La tabla de datos hay que convertirlo en una lista deadata
  • Usaremos la función read_data
  • Hay que determinar las DMUs, los inputs / outputs y otras opciones
Company Assets Equity Employees Revenue Profit
Mitsubishi 91920.6 10950.0 36000 184365.2 346.2
Mitsui 68770.9 5553.9 80000 181518.7 314.8
Itochu 65708.9 4271.1 7182 169164.6 121.2
General Motors 217123.4 23345.5 709000 168828.6 6880.7

Leer los datos

Fortune500 <- as.data.frame(Fortune500)
misdatos <- read_data(datadea = Fortune500, ni = 3, no = 2)
  • misdatos es una lista de tipo deadata conteniendo

Aplicamos el modelo…

Modelo básico (input orientado)

min

Modelo básico con deaR

result <- model_basic(misdatos)

Extracción de resultados

  • Parciales
    • efficiencies
    • lambdas
    • slacks
    • targets
    • multipliers
    • rts
    • references
  • Generales
    • summary
    • plot

Nos vamos al ordenador…

Otras opciones de datos

I/O No controlables

  • Ej. 2º input y 1er ouput no controlables
misdatos <- read_data(datadea = Fortune500, ni = 3, no = 2, nc_inputs = 2, nc_outputs = 1)

Ejemplo (modelo básico)

\begin{aligned} \min_{\theta,\,\mathbf{\lambda}}&\quad\theta \\ s.a.:&\\ &\sum_{j=1}^n\lambda_j x_{ij}\leq \theta x_{io},\qquad &i \in IC\\ &\sum_{j=1}^n\lambda_j y_{rj}\geq y_{ro},\qquad &r \in OC\\ &\lambda_j\geq 0& j = 1,\ldots,n \end{aligned}

\begin{aligned} &\\ &\\ &\\ &\sum_{j=1}^n\lambda_j x_{ij}= x_{io},\qquad &i \not\in IC\\ &\sum_{j=1}^n\lambda_j y_{rj}= y_{ro},\qquad &r \not\in OC\\ \end{aligned}

result <- model_basic(misdatos)

I/O No discreccionales

  • Ej. 1er y 3er inputs y 2º ouput no discrecionales
misdatos <- read_data(datadea = Fortune500, ni = 3, no = 2, 
                      nd_inputs = c(1,3), nd_outputs = 2)

Ejemplo (modelo básico)

\begin{aligned} \min_{\theta,\,\mathbf{\lambda}}&\quad \theta \\ s.a.:&\\ &\sum_{j=1}^n\lambda_j x_{ij}\leq \theta x_{io},&i \in ID\\ &\sum_{j=1}^n\lambda_j y_{rj}\geq y_{ro}&r \in OD\\ &\lambda_j\geq 0& j = 1,\ldots,n \end{aligned}

\begin{aligned} &\\ &\\ &\sum_{j=1}^n\lambda_j x_{ij} \leq x_{io}, &i \not\in ID\\ &\sum_{j=1}^n\lambda_j y_{rj}\geq y_{ro},&r \not\in OD\\ \end{aligned}

I/O No deseables (o bad)

  • Se transforman los inputs/outputs no deseables (normalmente son outputs)
  • Ejemplo: Huan-Bian, 2007. 2 Inputs, 3 ouputs, output 3 no deseable
huan <- read_data(Hua_Bian_2007, ni = 2, no = 3, ud_outputs = 3)
results1 <- model_basic(huan, orientation = "oo", rts = "vrs")
results2 <- model_basic(huan, orientation = "oo", rts = "vrs", vtrans_o = 1500)

Otras opciones generales de los modelos

Otras opciones

  • Orientación del modelo (orientation)
    • Input / Output / Direccional / No orientado
  • Retornos a escala (rts)
    • CRS, VRS, NIRS, NDRS, GRS
  • DMUs a evaluar (dmu_eval)

  • DMUs de referencia (dmu_ref)

  • 2ª etapa (max_slack) con pesos

Índice de Malmquist

Índice de Malmquist

  • Tenemos datos en distintos periodos de tiempo
  • Vemos la evolución de las eficiencias
  • Los datos están formateados de manera diferente:
    • Tablas horizontales
    • Tablas verticales
  • La función read_malmquist general una lista de deadata

Tabla horizontal

DMUs Capital2005 Labor2005 GIOV2005 Capital2006 Labor2006 GIOV2006
Beijing 12829.79 116.97 6946.07 14244.40 117.36 8210.00
Tianjin 6347.92 122.17 6774.10 7129.02 116.33 8527.70
Hebei 9473.70 292.21 11008.12 11250.95 303.35 13489.80
Shanxi_1 7045.09 213.20 4850.91 8865.50 220.59 5902.84
Neimenggu 4595.89 83.70 2995.59 5605.92 90.72 4140.05
Liaoning 11902.12 276.55 10814.51 14140.89 303.02 14167.95

Tabla vertical

DMUs Period Capital Labor GIOV
1 Beijing 2005 12829.79 116.97 6946.07
2 Tianjin 2005 6347.92 122.17 6774.10
….
31 Sinkiang 2005 2837.00 46.70 2102.53
32 Beijing 2006 14244.40 117.36 8210.00
33 Tianjin 2006 7129.02 116.33 8527.70
….

Lectura de datos (Tabla horizontal)

  • Hace falta indicar el número de periodos, el número de inputs/outputs
ejemplo_malmquist <- read_malmquist(datadea = Economy, 
                                nper = 5, 
                                arrangement = "horizontal",
                                ni = 2, 
                                no = 1)

Lectura de datos (Tabla vertical)

  • Hace falta indicar la columna que contiene la información temporal, los inputs/outputs
ejemplo_malmquist2 <- read_malmquist(datadea = EconomyLong, 
                                percol = 2, 
                                arrangement = "vertical",
                                ni = 2, 
                                no = 1)

Ejecutamos el modelo

MI <- malmquist_index(ejemplo_malmquist2)
resumen <- summary(MI)
knitr::kable(resumen$Results[1:5,])
Period DMU ec tc pech sech mi
2006 Beijing 0.9904260 0.9185664 1 0.9904260 0.9097720
2006 Tianjin 0.9049332 0.9383294 1 0.9049332 0.8491254
2006 Hebei 0.9502866 0.9329661 1 0.9502866 0.8865852
2006 Shanxi_1 0.8854319 0.9407446 1 0.8854319 0.8329653
2006 Neimenggu 0.9483924 0.9369410 1 0.9483924 0.8885877

Más resultados

  knitr::kable(resumen$means_by_period)
Period ec tc pech sech mi
2006 0.9500551 0.9350165 1 0.9500551 0.8883172
2007 0.9627391 0.9052274 1 0.9627391 0.8714978
2008 0.9440146 0.9441444 1 0.9440146 0.8912862
2009 1.0063403 0.8777664 1 1.0063403 0.8833317

Y más todavía…

  knitr::kable(head(resumen$means_by_dmu))
DMU ec tc pech sech mi
Anhui 0.9809305 0.9054903 1 0.9809305 0.8882230
Beijing 0.9925625 0.9174540 1 0.9925625 0.9106305
Chongqing 1.0149624 0.9054903 1 1.0149624 0.9190386
Fujian 0.9991211 0.9114593 1 0.9991211 0.9106582
Gansu 0.9154485 0.9054903 1 0.9154485 0.8289297
Guangdong 1.0000000 0.9939756 1 1.0000000 0.9939756

Eficiencia cruzada

Eficiencia cruzada

data_example <- read_data(datadea = Golany_Roll_1989, 
                          dmus = 1, 
                          inputs = 2:4, 
                          outputs = 5:6)
result <- cross_efficiency(data_example, 
                           orientation = "io", 
                           rts = "crs", 
                           selfapp = TRUE)

Doyle, J.; Green, R. (1994). “Efficiency and cross efficiency in DEA: derivations, meanings and the uses”, Journal of Operational Research Society, 45(5), 567–578. DOI: 10.2307/2584392

Eficiencia cruzada (resultados)

Método arbitrario

DMU_1 DMU_2 DMU_3 DMU_4
DMU_1 0.6810811 0.7179487 0.5973333 0.8129032
DMU_2 0.5518519 0.8333333 0.6196078 0.9000000
DMU_3 0.6666667 0.8333333 0.6274510 0.8571429
DMU_4 0.5444444 0.8312500 0.6176471 0.9000000

Eficiencia cruzada (resultados)

Método II (Agresivo)

DMU_1 DMU_2 DMU_3 DMU_4
DMU_1 0.6810811 0.7179487 0.5973333 0.8129032
DMU_2 0.5518519 0.8333333 0.6196078 0.9000000
DMU_3 0.6666667 0.8333333 0.6274510 0.8571429
DMU_4 0.5444444 0.8312500 0.6176471 0.9000000

Eficiencia cruzada (resultados)

Método II (Benevolente)

DMU_1 DMU_2 DMU_3 DMU_4
DMU_1 0.6810811 0.7179487 0.5973333 0.8129032
DMU_2 0.5518519 0.8333333 0.6196078 0.9000000
DMU_3 0.6666667 0.8333333 0.6274510 0.8571429
DMU_4 0.5444444 0.8312500 0.6176471 0.9000000

Modelos Fuzzy

Números fuzzy

Lectura de datos (Leon2003)

DMU x alpha y beta
A 3.0 2.0 3.0 1.00
B 4.0 0.5 2.5 1.00
C 4.5 1.5 6.0 1.00
D 6.5 0.5 4.0 1.25
E 7.0 2.0 5.0 0.50
F 8.0 0.5 3.5 0.50

Lectura de datos (Triangular simétrico)

data_exampleL <- read_data_fuzzy(datadea = Leon2003, dmus = 1, inputs.mL = 2, inputs.dL = 3, 
                                outputs.mL = 4, outputs.dL = 5)

Lectura de datos (Kao_Liu_2003)

Library Patronage Collections Personel Expenditures Buildings Services beta3_l beta3_u beta5_l beta5_u
Library_01 0.28 0.32 0.20 0.41 0.48 0.79 0.0 0.00 0.00 0.00
Library_02 0.16 0.57 0.22 0.50 1.00 0.55 0.0 0.00 0.00 0.00
Library_03 1.00 1.00 1.00 1.00 0.86 0.98 0.0 0.00 0.00 0.00
Library_04 0.53 0.67 0.81 0.74 0.36 0.92 0.0 0.00 0.00 0.00
Library_05 0.02 0.10 0.08 0.15 0.03 0.57 0.0 0.00 0.00 0.00
Library_06 0.56 0.58 0.50 0.63 0.68 1.00 0.0 0.00 0.00 0.00
Library_07 0.24 0.41 0.34 0.58 0.34 0.76 0.0 0.00 0.00 0.00
Library_08 0.01 0.37 0.04 0.11 0.05 0.41 0.0 0.00 0.00 0.00
Library_09 0.12 0.06 0.11 0.13 0.14 0.65 0.0 0.00 0.00 0.00
Library_10 0.82 0.32 0.41 0.62 0.79 0.87 0.0 0.00 0.00 0.00
Library_11 0.57 0.70 0.37 0.21 0.41 0.71 0.0 0.00 0.00 0.00
Library_12 0.20 0.09 0.11 0.23 0.24 0.64 0.0 0.00 0.00 0.00
Library_13 0.33 0.25 0.36 0.19 0.28 0.72 0.0 0.00 0.00 0.00
Library_14 0.35 0.30 0.31 0.49 0.44 0.71 0.0 0.00 0.00 0.00
Library_15 0.30 0.32 0.13 0.44 0.21 0.68 0.0 0.00 0.00 0.00
Library_16 0.20 0.27 0.23 0.40 0.51 0.56 0.0 0.00 0.00 0.00
Library_17 0.47 0.26 0.37 0.30 0.62 0.71 0.0 0.00 0.00 0.00
Library_18 0.19 0.24 0.23 0.30 0.36 0.52 0.0 0.00 0.00 0.00
Library_19 0.14 0.21 0.14 0.21 0.16 0.53 0.0 0.00 0.00 0.00
Library_20 0.66 0.28 0.46 0.45 0.59 0.70 0.0 0.00 0.00 0.00
Library_21 0.46 0.23 0.28 0.28 0.40 0.59 0.0 0.00 0.00 0.00
Library_22 0.45 0.25 0.30 0.52 0.32 0.69 0.0 0.00 0.28 0.31
Library_23 0.69 0.42 0.31 0.41 0.54 0.69 0.0 0.00 0.28 0.31
Library_24 0.72 0.44 0.27 0.41 0.18 0.47 0.3 0.59 0.00 0.00

Lectura de datos (Triangular asimétrico)

data_exampleKL <- read_data_fuzzy(datadea = Kao_Liu_2003, dmus = 1,
                                inputs.mL = 2, 
                                outputs.mL = 3:7, 
                                outputs.dL = c(NA, NA, 8, NA, 10), 
                                outputs.dR = c(NA, NA, 9, NA, 11))

Corremos el modelo (Kao-Liu)

  • Se puede ejecutar sobre cualquier otro modelo crisp
  • Considera el mejor y el peor caso
  • Devuelve eficiencias para ciertos \alpha-cortes
result <- modelfuzzy_kaoliu(data_exampleL, 
                            kaoliu_modelname = "basic", 
                            orientation = "io", 
                            rts = "crs", 
                            alpha = c(0,0.25,0.5,0.75,1))

Resultados (Peor caso)

0 0.25 0.5 0.75 1
A 0.171 0.250 0.361 0.519 0.750
B 0.083 0.160 0.269 0.360 0.469
C 0.208 0.373 0.599 0.907 1.000
D 0.098 0.178 0.286 0.367 0.462
E 0.125 0.218 0.339 0.429 0.536
F 0.088 0.149 0.225 0.274 0.328

Resultados (Mejor caso)

0 0.25 0.5 0.75 1
A 1.00 1.000 1.000 1.000 0.750
B 1.00 0.961 0.764 0.602 0.469
C 1.00 1.000 1.000 1.000 1.000
D 1.00 0.864 0.706 0.574 0.462
E 1.00 1.000 0.835 0.668 0.536
F 0.64 0.544 0.462 0.390 0.328

Próximamente… Shiny!!!

Muchas gracias!!!