rm(list=ls())
setwd("C:/DAVE2/CIDE/Doc/Econometria II/Lab_4")
options(scipen=999)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.5
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.4 v dplyr 1.0.7
## v tidyr 1.1.3 v stringr 1.4.0
## v readr 2.0.1 v forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.0.5
## Warning: package 'tibble' was built under R version 4.0.5
## Warning: package 'tidyr' was built under R version 4.0.5
## Warning: package 'readr' was built under R version 4.0.5
## Warning: package 'dplyr' was built under R version 4.0.5
## Warning: package 'forcats' was built under R version 4.0.5
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
## Warning: package 'janitor' was built under R version 4.0.5
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
## Warning: package 'modelsummary' was built under R version 4.0.5
## Loading required package: dfidx
## Warning: package 'dfidx' was built under R version 4.0.5
##
## Attaching package: 'dfidx'
## The following object is masked from 'package:stats':
##
## filter
## Warning: package 'sandwich' was built under R version 4.0.5
#Preliminares
#rm(list=ls())
#Cargamos paquetes necesarios
pacman::p_load(ggplot2,nnet,mlogit, foreign,reshape2,xtable,stargazer,tibble,knitr,dplyr,stats,margins,pscl,devtools,PoEdata,MCMCpack,survival,Epi,mclogit,mnlogit,gmnl)
#Los ajustes de modelos logit multinomiales: mlogit y nnet
# Si presentas problemas para correr el archivo .rmd ve a file>save with encoding>UTF-8
Un modelo con solo variables específicas individuales a veces se denomina modelo logit multinomial, uno con solo variables específicas alternativas un modelo logit condicional y otro con ambos tipos de variables un modelo logit mixto.
Ejemplo 1. Las elecciones ocupacionales de las personas pueden verse influidas por las ocupaciones de sus padres y su propio nivel educativo. Podemos estudiar la relación de la elección de ocupación de uno con el nivel de educación y la ocupación del padre. Las opciones ocupacionales serán la variable de resultado que consta de categorías de ocupaciones.
Ejemplo 2. Un biólogo puede estar interesado en las elecciones de alimentos que hacen los caimanes. Los caimanes adultos pueden tener preferencias diferentes a las de los jóvenes. La variable de resultado aquí serán los tipos de comida, y las variables predictoras podrían ser el tamaño de los caimanes y otras variables ambientales.
Ejemplo 3. Los estudiantes que ingresan a la escuela secundaria hacen elecciones de programas entre programa general, programa vocacional y programa académico. Su elección puede ser modelada usando su puntuación de escritura y su estatus económico social.
Es importante tener los paquetes: * nnet: más usado para logit multinomial, pero también para muchas otras cosas más * mlogit: un poco más confuso de usar, más usado para el logit condicional * sandwich: para trabajar con matríces de varianzas y construir versiones robustas
Importmaos la based dedaos que utilizamos para estimar los modelos probit y logit, son los datos de Herriges & Kling (1999) usados y provistos por Cameron & Trivedi (2005):
data_fishing<-read_csv(
"./fishing_data.csv",
locale = locale(encoding = "latin1")) %>%
clean_names() %>%
mutate(income=income/1000)
## Rows: 1182 Columns: 17
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (17): client, mode, price, crate, dbeach, dpier, dprivate, dcharter, pbe...
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
Analizamos la base de datos:
## # A tibble: 6 x 17
## client mode price crate dbeach dpier dprivate dcharter pbeach ppier pprivate
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 4 183. 0.539 0 0 0 1 158. 158. 158.
## 2 2 4 34.5 0.467 0 0 0 1 15.1 15.1 10.5
## 3 3 3 24.3 0.241 0 0 1 0 162. 162. 24.3
## 4 4 2 15.1 0.0789 0 1 0 0 15.1 15.1 55.9
## 5 5 3 41.5 0.108 0 0 1 0 107. 107. 41.5
## 6 6 4 63.9 0.398 0 0 0 1 192. 192. 28.9
## # ... with 6 more variables: pcharter <dbl>, qbeach <dbl>, qpier <dbl>,
## # qprivate <dbl>, qcharter <dbl>, income <dbl>
Vamos a ver la estruictura de datos:
## spec_tbl_df [1,182 x 17] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ client : num [1:1182] 1 2 3 4 5 6 7 8 9 10 ...
## $ mode : num [1:1182] 4 4 3 2 3 4 1 4 3 3 ...
## $ price : num [1:1182] 182.9 34.5 24.3 15.1 41.5 ...
## $ crate : num [1:1182] 0.5391 0.4671 0.2413 0.0789 0.1082 ...
## $ dbeach : num [1:1182] 0 0 0 0 0 0 1 0 0 0 ...
## $ dpier : num [1:1182] 0 0 0 1 0 0 0 0 0 0 ...
## $ dprivate: num [1:1182] 0 0 1 0 1 0 0 0 1 1 ...
## $ dcharter: num [1:1182] 1 1 0 0 0 1 0 1 0 0 ...
## $ pbeach : num [1:1182] 157.9 15.1 161.9 15.1 106.9 ...
## $ ppier : num [1:1182] 157.9 15.1 161.9 15.1 106.9 ...
## $ pprivate: num [1:1182] 157.9 10.5 24.3 55.9 41.5 ...
## $ pcharter: num [1:1182] 182.9 34.5 59.3 84.9 71 ...
## $ qbeach : num [1:1182] 0.0678 0.1049 0.5333 0.0678 0.0678 ...
## $ qpier : num [1:1182] 0.0503 0.0451 0.4522 0.0789 0.0503 ...
## $ qprivate: num [1:1182] 0.26 0.157 0.241 0.164 0.108 ...
## $ qcharter: num [1:1182] 0.539 0.467 1.027 0.539 0.324 ...
## $ income : num [1:1182] 7.08 1.25 3.75 2.08 4.58 ...
## - attr(*, "spec")=
## .. cols(
## .. client = col_double(),
## .. mode = col_double(),
## .. price = col_double(),
## .. crate = col_double(),
## .. dbeach = col_double(),
## .. dpier = col_double(),
## .. dprivate = col_double(),
## .. dcharter = col_double(),
## .. pbeach = col_double(),
## .. ppier = col_double(),
## .. pprivate = col_double(),
## .. pcharter = col_double(),
## .. qbeach = col_double(),
## .. qpier = col_double(),
## .. qprivate = col_double(),
## .. qcharter = col_double(),
## .. income = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Ahora vamos a estimar el modelo:
## # weights: 12 (6 variable)
## initial value 1638.599935
## iter 10 value 1477.505846
## final value 1477.150570
## converged
Una vez estimado podemos obtener un resumen de las estimaciones:
## Call:
## multinom(formula = mode ~ income, data = data_fishing)
##
## Coefficients:
## (Intercept) income
## 2 0.8141701 -0.14340453
## 3 0.7389569 0.09190030
## 4 1.3413284 -0.03164588
##
## Std. Errors:
## (Intercept) income
## 2 0.2286325 0.05328822
## 3 0.1967314 0.04066362
## 4 0.1945173 0.04184622
##
## Residual Deviance: 2954.301
## AIC: 2966.301
La tabla 15.2 dice que todos los coeficientes, excepto \(\beta_{I4}\) son estadísticamente significativos al 5%.
Para poder calcular los p values asociados tenremos que utilizar el siguiente comando:
z <- summary(mmultilogit_1)$coefficients/summary(mmultilogit_1)$standard.errors
pv <- (1 - pnorm(abs(z)))*2
pv
## (Intercept) income
## 2 0.000369384199215173 0.007121444
## 3 0.000172532839256112 0.023820471
## 4 0.000000000005360823 0.449503854
El paquete usado para estimar los logit multinomial es nnet, que es una abreviatura para neural networks
Las redes neuronales, una aplicación en constante desarrollo del aprendizaje automatizado pueden emplearse, entre muchas otras cosas, para problemas de clasificación. Pueden encontrar màs informaciòn al respecto en este link. Finalmente podemos considerar nuestro modelos multinomiales como problemas de clasificaciòn.
## Warning: package 'sas7bdat' was built under R version 4.0.3
Importamos los datos:
## hsgpa hsengl hscalc course passed outcome
## 1 78.0 80 Yes Mainstrm No Failed
## 2 66.0 75 Yes Mainstrm Yes Passed
## 3 80.2 70 Yes Mainstrm Yes Passed
## 4 81.7 67 Yes Mainstrm Yes Passed
## 5 86.8 80 Yes Mainstrm Yes Passed
## 6 76.7 75 Yes Mainstrm Yes Passed
Modificamos los datos para que la funcion de regresion logistica multinomial pueda procesarlos. Para hacer esto, necesitamos expandir la variable de resultado (y) como lo hariamos para la codificacion ficticia de una variable categ?rica para incluirla en la regresion multiple estandar.
## hsgpa passed
## 1 78.0 No
## 2 66.0 Yes
## 3 80.2 Yes
## 4 81.7 Yes
## 5 86.8 Yes
## 6 76.7 Yes
## ~~~~~~~
## first 10 observations out of 788
## ~~~~~~~
## hsgpa passed chid alt idx
## 1 78.0 TRUE 1 No 1:No
## 2 78.0 FALSE 1 Yes 1:Yes
## 3 66.0 FALSE 2 No 2:No
## 4 66.0 TRUE 2 Yes 2:Yes
## 5 80.2 FALSE 3 No 3:No
## 6 80.2 TRUE 3 Yes 3:Yes
## 7 81.7 FALSE 4 No 4:No
## 8 81.7 TRUE 4 Yes 4:Yes
## 9 86.8 FALSE 5 No 5:No
## 10 86.8 TRUE 5 Yes 5:Yes
##
## ~~~ indexes ~~~~
## chid alt
## 1 1 No
## 2 1 Yes
## 3 2 No
## 4 2 Yes
## 5 3 No
## 6 3 Yes
## 7 4 No
## 8 4 Yes
## 9 5 No
## 10 5 Yes
## indexes: 1, 2
simple0 = mlogit(passed ~ 0 | hsgpa, data=long0)
simple0 = mlogit(passed ~ 0 | hsgpa, data=long0); summary(simple0)
##
## Call:
## mlogit(formula = passed ~ 0 | hsgpa, data = long0, method = "nr")
##
## Frequencies of alternatives:choice
## No Yes
## 0.40102 0.59898
##
## nr method
## 5 iterations, 0h:0m:0s
## g'(-H)^-1g = 0.000119
## successive function values within tolerance limits
##
## Coefficients :
## Estimate Std. Error z-value Pr(>|z|)
## (Intercept):Yes -15.210112 1.998398 -7.6112 0.00000000000002709 ***
## hsgpa:Yes 0.197734 0.025486 7.7587 0.00000000000000866 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Log-Likelihood: -221.72
## McFadden R^2: 0.16436
## Likelihood ratio test : chisq = 87.221 (p.value = < 0.000000000000000222)
Ahora implementamos un modelo multinomial
outcome = as.character(math$outcome)
for(j in 1:length(outcome))
{if(outcome[j]=='Disappeared') outcome[j]='Gone'}
math$outcome = factor(outcome); table(outcome)
## outcome
## Failed Gone Passed
## 61 97 236
Seleccionamos los datos:
math1 = math[,c(1,6)] #datos de cols 1 al 6
long1 = mlogit.data(math1,shape="wide",choice="outcome")
Que tenemos en long1?
## ~~~~~~~
## first 10 observations out of 1182
## ~~~~~~~
## hsgpa outcome chid alt idx
## 1 78.0 TRUE 1 Failed 1:iled
## 2 78.0 FALSE 1 Gone 1:Gone
## 3 78.0 FALSE 1 Passed 1:ssed
## 4 66.0 FALSE 2 Failed 2:iled
## 5 66.0 FALSE 2 Gone 2:Gone
## 6 66.0 TRUE 2 Passed 2:ssed
## 7 80.2 FALSE 3 Failed 3:iled
## 8 80.2 FALSE 3 Gone 3:Gone
## 9 80.2 TRUE 3 Passed 3:ssed
## 10 81.7 FALSE 4 Failed 4:iled
##
## ~~~ indexes ~~~~
## chid alt
## 1 1 Failed
## 2 1 Gone
## 3 1 Passed
## 4 2 Failed
## 5 2 Gone
## 6 2 Passed
## 7 3 Failed
## 8 3 Gone
## 9 3 Passed
## 10 4 Failed
## indexes: 1, 2
Que tenemos en math?
## hsgpa hsengl hscalc course passed outcome
## 1 78.0 80 Yes Mainstrm No Failed
## 2 66.0 75 Yes Mainstrm Yes Passed
## 3 80.2 70 Yes Mainstrm Yes Passed
## 4 81.7 67 Yes Mainstrm Yes Passed
## 5 86.8 80 Yes Mainstrm Yes Passed
## 6 76.7 75 Yes Mainstrm Yes Passed
Hacemos el ajuste multinomial
##
## Call:
## mlogit(formula = outcome ~ 0 | hsgpa, data = long1, method = "nr")
##
## Frequencies of alternatives:choice
## Failed Gone Passed
## 0.15482 0.24619 0.59898
##
## nr method
## 5 iterations, 0h:0m:0s
## g'(-H)^-1g = 1.09E-05
## successive function values within tolerance limits
##
## Coefficients :
## Estimate Std. Error z-value Pr(>|z|)
## (Intercept):Gone 1.904226 2.744979 0.6937 0.4879
## (Intercept):Passed -13.393056 2.570453 -5.2104 0.00000018845 ***
## hsgpa:Gone -0.018816 0.035775 -0.5260 0.5989
## hsgpa:Passed 0.186437 0.033018 5.6465 0.00000001637 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Log-Likelihood: -326.96
## McFadden R^2: 0.11801
## Likelihood ratio test : chisq = 87.497 (p.value = < 0.000000000000000222)
Como podemos evalua la probabilidad estimada para un estudiante con HSGPA = 90
## (Intercept):Gone (Intercept):Passed hsgpa:Gone hsgpa:Passed
## 1.90422575 -13.39305637 -0.01881621 0.18643711
## attr(,"names.sup.coef")
## character(0)
## attr(,"fixed")
## (Intercept):Gone (Intercept):Passed hsgpa:Gone hsgpa:Passed
## FALSE FALSE FALSE FALSE
## attr(,"sup")
## character(0)
Y
gpa = 90
L1 = betahat1[1] + betahat1[3]*gpa # Gone
L2 = betahat1[2] + betahat1[4]*gpa # Passed
denom = 1+exp(L1)+exp(L2)
pihat1 = exp(L1)/denom # Gone
pihat2 = exp(L2)/denom # Passed
pihat3 = 1/denom # Failed
rbind(pihat1,pihat2,pihat3)
## (Intercept):Gone
## pihat1 0.03883621
## pihat2 0.92970789
## pihat3 0.03145590
Podemos tener un modelo mas completo:
long = mlogit.data(math[,c(1:4,6)],shape="wide",choice="outcome")
fullmod = mlogit(outcome ~ 0 | hsgpa+hsengl+hscalc+course, data=long)
summary(fullmod)
##
## Call:
## mlogit(formula = outcome ~ 0 | hsgpa + hsengl + hscalc + course,
## data = long, method = "nr")
##
## Frequencies of alternatives:choice
## Failed Gone Passed
## 0.15482 0.24619 0.59898
##
## nr method
## 5 iterations, 0h:0m:0s
## g'(-H)^-1g = 0.000216
## successive function values within tolerance limits
##
## Coefficients :
## Estimate Std. Error z-value Pr(>|z|)
## (Intercept):Gone 2.5734410 2.8288386 0.9097 0.36297
## (Intercept):Passed -14.0411854 2.7005870 -5.1993 0.00000020003 ***
## hsgpa:Gone -0.0079779 0.0413277 -0.1930 0.84693
## hsgpa:Passed 0.2157706 0.0382179 5.6458 0.00000001644 ***
## hsengl:Gone -0.0067241 0.0251049 -0.2678 0.78882
## hsengl:Passed -0.0399811 0.0228733 -1.7479 0.08047 .
## hscalcYes:Gone -0.3902775 0.6742796 -0.5788 0.56272
## hscalcYes:Passed 1.0009683 0.8215247 1.2184 0.22306
## courseElite:Gone -2.0666545 0.9836801 -2.1009 0.03565 *
## courseElite:Passed 0.6032839 0.8044316 0.7500 0.45328
## courseMainstrm:Gone -0.6834686 0.5560854 -1.2291 0.21905
## courseMainstrm:Passed 0.4086564 0.6339142 0.6447 0.51915
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Log-Likelihood: -312.26
## McFadden R^2: 0.15766
## Likelihood ratio test : chisq = 116.89 (p.value = < 0.000000000000000222)
Los estudiantes que ingresan a la escuela secundaria hacen elecciones de programas entre programa general, programa vocacional y programa academico. Su eleccion puede ser modelada usando su puntuacion de escritura y su nivel economico social.
## id female ses schtyp prog read write math science socst honors
## 1 45 female low public vocation 34 35 41 29 26 not enrolled
## 2 108 male middle public general 34 33 41 36 36 not enrolled
## 3 15 male high public vocation 39 39 44 26 42 not enrolled
## 4 67 male low public vocation 37 37 42 33 32 not enrolled
## 5 153 male middle public vocation 39 31 40 39 51 not enrolled
## 6 51 female high public general 42 36 42 31 39 not enrolled
## awards cid
## 1 0 1
## 2 0 1
## 3 0 1
## 4 0 1
## 5 0 1
## 6 0 1
Variable categorica multinomial:
prog=program type (general program, vocational program and academic program)
Predictoras:
ses= social economic status
write=writing score(variable continua)
## prog
## ses general academic vocation
## low 16 19 12
## middle 20 44 31
## high 9 42 7
## M SD
## general 51.33333 9.397775
## academic 56.25714 7.943343
## vocation 46.76000 9.318754
## # weights: 15 (8 variable)
## initial value 219.722458
## iter 10 value 179.985215
## final value 179.981726
## converged
## Call:
## multinom(formula = prog ~ ses + write, data = ml)
##
## Coefficients:
## (Intercept) sesmiddle seshigh write
## academic -2.851973 0.5332914 1.1628257 0.05792480
## vocation 2.366097 0.8246384 0.1802176 -0.05567514
##
## Std. Errors:
## (Intercept) sesmiddle seshigh write
## academic 1.166437 0.4437319 0.5142215 0.02141092
## vocation 1.174251 0.4901237 0.6484508 0.02333135
##
## Residual Deviance: 359.9635
## AIC: 375.9635
##
## ==============================================
## Dependent variable:
## ----------------------------
## academic vocation
## (1) (2)
## ----------------------------------------------
## sesmiddle 0.533 0.825*
## (0.444) (0.490)
##
## seshigh 1.163** 0.180
## (0.514) (0.648)
##
## write 0.058*** -0.056**
## (0.021) (0.023)
##
## Constant -2.852** 2.366**
## (1.166) (1.174)
##
## ----------------------------------------------
## Akaike Inf. Crit. 375.963 375.963
## ==============================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Como tenemos tres categorias vamos a estimar dos vectores de parámetros \(\beta_1\) y \(\beta_2\)
En general si tenemos \(J\) categoias estimaremos \(J-1\) vectores de parametros
Para estimar estos parametros se hace de la funcion de verosimilitud apropiada
En este ejemplo tipo de programa tiene tres categorias y la categoria base es programa general.
En el logit multinomial la probabilidad de que el individuo \(i\) elija la categoria \(j\) es para \(j=1,...J-1\)
Y para la categoria base J:
La descision por alguna de la categorias depende del vector de caracteristicas \(x_i\).
En nuestro ejemplo
\[P_{i1}=\dfrac{e^{x_i\beta_1}}{1+e^{x_i\beta_1}+e^{x_i\beta_2}}\]
\[P_{i2}=\dfrac{e^{x_i\beta_2}}{1+e^{x_i\beta_1}+e^{x_i\beta_2}}\]
\[P_{i3}=\dfrac{1}{1+e^{x_i\beta_1}+e^{x_i\beta_2}}\]
Si podemos obtener los sig cocientes:
\[\dfrac{P_{i1}}{P_{i3}}=e^{x_i\beta_1}\]
\[\dfrac{P_{i2}}{P_{i3}}=e^{x_i\beta_2}\]
y entonces
\[\dfrac{P_{i1}}{P_{i2}}=e^{x_i(\beta_1-\beta_2)}\]
y si tomas logaritmos llegas a que:
\[\ln\left(\dfrac{P_{i1}}{P_{i3}}\right)=x_i\beta_1\]
\[\ln\left(\dfrac{P_{i2}}{P_{i3}}\right)=x_i\beta_2\]
\[\ln\left(\dfrac{P_{i1}}{P_{i2}}\right)=x_i(\beta_1-\beta_2)\]
En concreto para nuestro caso
\[\ln\left(\dfrac{P_{i1}}{P_{i3}}\right)=\beta_1^1+\beta_2^1*(ses=middle)+\beta_3^1*(ses=high)+\beta_4^1*write\]
\[\ln\left(\dfrac{P_{i2}}{P_{i3}}\right)=\beta_1^2+\beta_2^2*(ses=middle)+\beta_3^2*(ses=high)+\beta_4^2*write\]
\[\ln\left(\dfrac{P_{i1}}{P_{i2}}\right)=(\beta_1^1-\beta_1^2)+(\beta_2^1-\beta_2^2)*(ses=middle)+(\beta_3^1-\beta_3^2)*(ses=high)+(\beta_4^1-\beta_4^2)*write\]
O de manera áun más explícita, que para el \(i\)-esimo individuo:
\[\ln\left(\dfrac{P(prog=academic)}{P(prog=general)}\right)=\beta_1^1+\beta_2^1*(ses=middle)+\beta_3^1*(ses=high)+\beta_4^1*write\]
\[\ln\left(\dfrac{P(prog=vocation)}{P(prog=general)}\right)=\beta_1^2+\beta_2^2*(ses=middle)+\beta_3^2*(ses=high)+\beta_4^2*write\]
\[\ln\left(\dfrac{P(prog=academic)}{P(prog=vocation)}\right)=(\beta_1^1-\beta_1^2)+(\beta_2^1-\beta_2^2)*(ses=middle)+(\beta_3^1-\beta_3^2)*(ses=high)+(\beta_4^1-\beta_4^2)*write\]
\(\beta_4^1\) mide el efecto de cambios en el score de escritura sobre el log de la razon de probabilidades de elegir el programa academico respecto a el programa general (si aumenta el score en write es mas probable que un alumno elija el programa academico en vez de el programa general) \(\beta_4^2\) mide el efectode cambios en el score de escritura sobre el log de la razon de probabilidades de elegir el programa vocacional respecto a el programa general(si aumenta el score en write es menos probable que un alumno elija el programa vocacional en lugar de el programa general)
Si queremos ver el efecto de un cambio en el score de escritura sobre la decision de elegir programa academico sobre el programa vocacional el efecto es \((\beta_4^1-\beta_4^2)\)
##Efectos marginales en logit multinomial 11. Es el efecto de un cambio en la variable sobre la probabilidad absoluta de caer en alguna de las categorias. 12. A diferencia de las betas su interpretacion no es relativa sino absoluta: el impaacto sobre la posibilidad de estar en una categoria 13. no depende de la base
\[\dfrac{\partial P_{i1}}{\partial write}=P_{i1}(\beta_1^w-P_{i1}\beta_1^w-P_{i2}\beta_2^w)\]
\[\dfrac{\partial P_{i2}}{\partial write}=P_{i2}(\beta_2^w-P_{i1}\beta_1^w-P_{i2}\beta_2^w)\] 15. El signo del efecto marginal puede ser distinto del signo del parametro beta
## (Intercept) sesmiddle seshigh write
## academic 0.05773033 1.704533 3.198960 1.0596353
## vocation 10.65572511 2.281056 1.197478 0.9458464
Ante un cambio unitario en score de write,es un 5% mas probable que se elija un programa academico respecto aun programa general.
Por lo tanto, la probabilidad relativa de optar por un programa de tipo academico en lugar de un programa general es un 70% mas alta para los jovenes de nivel socieconomico medio que para los de nivel socieconomico bajo con el mismo puntaje en escritura.
Ojo: Solo la probabilidad relativa de elegir programa academico sobre programa general es mayor. No estamos diciendo que los jovenes de estatus medio tengan mas probabilidad de elegir programa academico.
La probabilidad relativa de elegir progrma tipo academico en lugar de un programa general para los alumnos de estatus socieconomico alto es mas del triple de la probabilidad relativa correspondiente para los chavos de nivel socieconomico bajo con el mismo nivel de score de escritura.
El efecto marginal promedio de un joven de status alto sobre el programa academico: -0.16. Esto significa que la probabilidad de elegir un programa academico es, en promedio, 16 puntos porcentuales mas baja para los de estatus alto que para los de estatus bajo con el mismo nivel escritura
## general academic vocation
## 1 0.3382355 0.1482852 0.5134793
## 2 0.1806255 0.1202128 0.6991617
## 3 0.2367932 0.4186802 0.3445267
## 4 0.3508282 0.1726975 0.4764743
## 5 0.1689350 0.1001332 0.7309318
## 6 0.2377813 0.3533635 0.4088552
###Asi cambias a otra categoria base
#Ajuste 2:Con otra categoria base
ml$prog2<-relevel(ml$prog, ref = "academic")
test2<-multinom(prog2 ~ ses + write, data = ml)
## # weights: 15 (8 variable)
## initial value 219.722458
## iter 10 value 179.982880
## final value 179.981726
## converged
##
## ==============================================
## Dependent variable:
## ----------------------------
## general vocation
## (1) (2)
## ----------------------------------------------
## sesmiddle -0.533 0.291
## (0.444) (0.476)
##
## seshigh -1.163** -0.983*
## (0.514) (0.596)
##
## write -0.058*** -0.114***
## (0.021) (0.022)
##
## Constant 2.852** 5.218***
## (1.166) (1.164)
##
## ----------------------------------------------
## Akaike Inf. Crit. 375.963 375.963
## ==============================================
## Note: *p<0.1; **p<0.05; ***p<0.01
\[\ln\left(\dfrac{P(prog=general)}{P(prog=academic)}\right)=2.852-0.533*(ses=middle) -1.163*(ses=high)-0.058*write\]
\[\ln\left(\dfrac{P(prog=vocation)}{P(prog=academic)}\right)= 5.218+0.291*(ses=middle)-0.983*(ses=high)-0.114*write\]
\[\ln\left(\dfrac{P(prog=general)}{P(prog=vocation)}\right)=(2.852-5.218)+(-0.533 -0.291)*(ses=middle)+(-1.163-(-0.983))*(ses=high)+(-0.058-(-0.114))*write\]
Un incremento unitario en el score de escritura lleva a una decremento de 0.058 en el logaritmo de la razón de probabilidades de elegir el programa general respecto al programa academico.
Ante un incremento unitario en el score de escritura se tiene un decremento de 0.114 en el logaritmo de la razón de probabilidades de elegir el programa vocacional respecto al programa academico.
El logaritmo de la razón de probabilidades de elegir un programa general respecto a elegir un programa academico decrese en 1.163 si pasamos de un nivel socieconomico bajo a uno nivel socieconomico alto.
## (Intercept) sesmiddle seshigh write
## general 2.445214 -1.2018081 -2.261334 -2.705562
## vocation 4.484769 0.6116747 -1.649967 -5.112689
## (Intercept) sesmiddle seshigh write
## general 0.0144766100 0.2294379 0.02373856 0.0068189015731
## vocation 0.0000072993 0.5407530 0.09894976 0.0000003176045
## (Intercept) sesmiddle seshigh write
## general 17.32582 0.5866769 0.3126026 0.9437172
## vocation 184.61262 1.3382809 0.3743123 0.8926116
## academic general vocation
## 1 0.1482764 0.3382454 0.5134781
## 2 0.1202017 0.1806283 0.6991700
## 3 0.4186747 0.2368082 0.3445171
## 4 0.1726885 0.3508384 0.4764731
## 5 0.1001231 0.1689374 0.7309395
## 6 0.3533566 0.2377976 0.4088458
dses <- data.frame(ses = c("low", "middle", "high"), write = mean(ml$write))
predict(test2, newdata = dses, "probs")
## academic general vocation
## 1 0.4396845 0.3581917 0.2021238
## 2 0.4777488 0.2283353 0.2939159
## 3 0.7009007 0.1784939 0.1206054
##almacena el predicho probabilidades para cada valor de ses and write
pp.write <- cbind(dwrite, predict(test2, newdata = dwrite, type = "probs", se = TRUE))
##calcular las probabilidades medias dentro de cada nivel de ses
by(pp.write[, 3:5], pp.write$ses, colMeans)
## pp.write$ses: high
## academic general vocation
## 0.6164315 0.1808037 0.2027648
## ------------------------------------------------------------
## pp.write$ses: low
## academic general vocation
## 0.3972977 0.3278174 0.2748849
## ------------------------------------------------------------
## pp.write$ses: middle
## academic general vocation
## 0.4256198 0.2010864 0.3732938
## usando melt y ggplot2
lpp <- melt (pp.write, id.vars = c ( "ses" , "write" ), value.name = "probabilidad" )
head (lpp) # ver las primeras combinaciones
## ses write variable probabilidad
## 1 low 30 academic 0.09843588
## 2 low 31 academic 0.10716868
## 3 low 32 academic 0.11650390
## 4 low 33 academic 0.12645834
## 5 low 34 academic 0.13704576
## 6 low 35 academic 0.14827643
Graficamos las probabilidades predichas a travess de valores write para cada nivel de ses Hacemos un plot por tipo de programa
R ofrece varias alternativas para ajustar un modelo logit condicional
Puedes usar la función mlogit() del paquete mlogit
Puedes usar la función gmnl() del paquete gmnl
Puedes usar la función mclogit() del paquete mclogit
Puedes usar la función MCMCmnl() del paquete MCMCpack
Puedes usar la función clogistic() del paquete Epi
data("Electricity", package = "mlogit")
Electr <- mlogit.data(Electricity, id.var = "id", choice = "choice",varying = 3:26, shape = "wide", sep = "")
head(Electr,10)
## ~~~~~~~
## first 10 observations out of 17232
## ~~~~~~~
## choice id alt pf cl loc wk tod seas chid idx
## 1 FALSE 1 1 7 5 0 1 0 0 1 1:1
## 2 FALSE 1 2 9 1 1 0 0 0 1 1:2
## 3 FALSE 1 3 0 0 0 0 0 1 1 1:3
## 4 TRUE 1 4 0 5 0 1 1 0 1 1:4
## 5 FALSE 1 1 7 0 0 1 0 0 2 2:1
## 6 FALSE 1 2 9 5 0 1 0 0 2 2:2
## 7 TRUE 1 3 0 1 1 0 1 0 2 2:3
## 8 FALSE 1 4 0 5 0 0 0 1 2 2:4
## 9 FALSE 1 1 9 5 0 0 0 0 3 3:1
## 10 FALSE 1 2 7 1 0 1 0 0 3 3:2
##
## ~~~ indexes ~~~~
## chid id alt
## 1 1 1 1
## 2 1 1 2
## 3 1 1 3
## 4 1 1 4
## 5 2 1 1
## 6 2 1 2
## 7 2 1 3
## 8 2 1 4
## 9 3 1 1
## 10 3 1 2
## indexes: 1, 1, 2
##
## Call:
## mlogit(formula = choice ~ pf + cl + loc + wk + tod + seas | 0,
## data = Electr, method = "nr")
##
## Frequencies of alternatives:choice
## 1 2 3 4
## 0.22702 0.26393 0.23816 0.27089
##
## nr method
## 4 iterations, 0h:0m:1s
## g'(-H)^-1g = 9.34E-07
## gradient close to zero
##
## Coefficients :
## Estimate Std. Error z-value Pr(>|z|)
## pf -0.6252278 0.0232223 -26.924 < 0.00000000000000022 ***
## cl -0.1082991 0.0082442 -13.136 < 0.00000000000000022 ***
## loc 1.4422429 0.0505571 28.527 < 0.00000000000000022 ***
## wk 0.9955040 0.0447801 22.231 < 0.00000000000000022 ***
## tod -5.4627587 0.1837125 -29.735 < 0.00000000000000022 ***
## seas -5.8400308 0.1866779 -31.284 < 0.00000000000000022 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Log-Likelihood: -4958.6
##
## Model estimated on: Mon Sep 13 06:01:16 2021
##
## Call:
## gmnl(formula = choice ~ pf + cl + loc + wk + tod + seas | 0,
## data = Electr, method = "nr")
##
## Frequencies of categories:
##
## 1 2 3 4
## 0.22702 0.26393 0.23816 0.27089
##
## The estimation took: 0h:0m:2s
##
## Coefficients:
## Estimate Std. Error z-value Pr(>|z|)
## pf -0.6252278 0.0232223 -26.924 < 0.00000000000000022 ***
## cl -0.1082991 0.0082442 -13.136 < 0.00000000000000022 ***
## loc 1.4422429 0.0505571 28.527 < 0.00000000000000022 ***
## wk 0.9955040 0.0447801 22.231 < 0.00000000000000022 ***
## tod -5.4627587 0.1837125 -29.735 < 0.00000000000000022 ***
## seas -5.8400308 0.1866779 -31.284 < 0.00000000000000022 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Optimization of log-likelihood by Newton-Raphson maximisation
## Log Likelihood: -4958.6
## Number of observations: 4308
## Number of iterations: 4
## Exit of MLE: gradient close to zero (gradtol)
## transport suburb distance cost working prop.true resp
## 1 bus 1 8.418094 4.0 212 0.00130138501561 2
## 2 car 1 0.000000 10.0 212 0.98296149144755 207
## 3 train 1 6.956365 3.7 212 0.01573712353685 3
## 4 bus 2 4.254465 4.0 211 0.37320718128614 89
## 5 car 2 0.000000 10.0 211 0.54666211060243 104
## 6 train 2 5.480114 3.7 211 0.08013070811143 18
## 7 bus 3 6.545856 4.0 201 0.02148267975951 4
## 8 car 3 0.000000 10.0 201 0.97851051800407 197
## 9 train 3 12.117690 3.7 201 0.00000680223642 0
## 10 bus 4 15.864880 4.0 171 0.00000001865187 0
##
## Iteration 1 - deviance = 39.74973 - criterion = 0.8590917
## Iteration 2 - deviance = 10.50328 - criterion = 2.758244
## Iteration 3 - deviance = 9.231325 - criterion = 0.1363107
## Iteration 4 - deviance = 9.227742 - criterion = 0.0003840654
## Iteration 5 - deviance = 9.227742 - criterion = 0.000000003446475
## converged
##
## Call:
## mclogit(formula = cbind(resp, suburb) ~ distance + cost, data = Transport)
##
## Estimate Std. Error z value Pr(>|z|)
## distance -1.43940 0.05318 -27.07 <0.0000000000000002 ***
## cost -0.97753 0.03987 -24.52 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Null Deviance: 2734
## Residual Deviance: 9.228
## Number of Fisher Scoring iterations: 5
## Number of observations: 1994
## party class Freq time econ.left welfare auth
## 1 green working 22 0.04 0.40 0.0 -0.75
## 2 labor working 463 0.04 1.00 1.5 0.00
## 3 communist working 6 0.04 2.50 1.0 0.50
## 4 conservative working 2 0.04 -1.00 -1.0 1.00
## 5 liberal working 0 0.04 -1.25 0.0 -0.75
## 6 right.wing.populist working 7 0.04 0.00 0.1 2.00
## 7 green new.middle 157 0.04 0.40 0.0 -0.75
## 8 labor new.middle 117 0.04 1.00 1.5 0.00
## 9 communist new.middle 0 0.04 2.50 1.0 0.50
## 10 conservative new.middle 31 0.04 -1.00 -1.0 1.00
l.condicional2<-mclogit(cbind(Freq,interaction(time,class))~econ.left/class+welfare/class+auth/class, random=~1|party.time,data=within(electors,party.time<-interaction(party,time)))
## Iteration 1 - deviance = 1054.511 - criterion = 0.1598497
## Iteration 2 - deviance = 923.1626 - criterion = 0.02666473
## Iteration 3 - deviance = 890.3113 - criterion = 0.006530011
## Iteration 4 - deviance = 883.0567 - criterion = 0.0005723444
## Iteration 5 - deviance = 881.4344 - criterion = 0.00001387329
## Iteration 6 - deviance = 881.2041 - criterion = 0.0000001394381
## Iteration 7 - deviance = 881.1809 - criterion = 0.00000000104388
## converged
##
## Call:
## mclogit(formula = cbind(Freq, interaction(time, class)) ~ econ.left/class +
## welfare/class + auth/class, data = within(electors, party.time <- interaction(party,
## time)), random = ~1 | party.time)
##
## Coefficents:
## Estimate Std. Error z value Pr(>|z|)
## econ.left -0.12603 0.18576 -0.678 0.497
## welfare 2.01955 0.29136 6.932 0.00000000000416 ***
## auth 0.11409 0.15908 0.717 0.473
## econ.left:classnew.middle -1.81703 0.09859 -18.430 < 0.0000000000000002 ***
## econ.left:classold.middle -3.13862 0.15780 -19.890 < 0.0000000000000002 ***
## classnew.middle:welfare -0.89578 0.06573 -13.628 < 0.0000000000000002 ***
## classold.middle:welfare -1.47904 0.13451 -10.996 < 0.0000000000000002 ***
## classnew.middle:auth -1.43391 0.04855 -29.535 < 0.0000000000000002 ***
## classold.middle:auth 1.44109 0.05883 24.494 < 0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Co-)Variances:
## Grouping level: party.time
## Estimate Std.Err.
## (Intercept) 3.066 0.9423
##
## Null Deviance: 80580
## Residual Deviance: 881.2
## Number of Fisher Scoring iterations: 7
## Number of observations
## Groups by party.time: 150
## Individual observations: 37500
Supongamos que queremos estudiar el efecto del precio en la decisión de un individuo sobre la elección de una de las tres marcas de refrescos:
pepsi
sevenup
coke
En el modelo logit condicional, la probabilidad que el individuo \(i\) elija la marca \(j\) está dada por la siguiente ecuación:
\[\begin{equation} p_{ij}=\frac{exp(\beta_{1j}+\beta_{2}price_{ij})}{exp(\beta_{11}+\beta_{2}price_{i1})+exp(\beta_{12}+\beta_{2}price_{i2})+exp(\beta_{13}+\beta_{2}price_{i3})} \label{eq:CondLogitPij} \end{equation}\]
A diferencia del modelo logístico multinomial, el coeficiente de la variables independiente price es el mismo para todas la categorías, pero el valor de la variable independiente es diferente para cada individuo.
## WARNING: Rtools is required to build R packages, but is not currently installed.
##
## Please download and install Rtools 4.0 from https://cran.r-project.org/bin/windows/Rtools/.
## Skipping install of 'PoEdata' from a git2r remote, the SHA1 (c41bee8f) has not changed since last install.
## Use `force = TRUE` to force installation
## id choice price feature display
## 1 1 0 1.79 0 0
## 2 1 0 1.79 0 0
## 3 1 1 1.79 0 0
## 4 2 0 1.79 0 0
## 5 2 0 1.79 0 0
## 6 2 1 0.89 1 1
## 7 3 0 1.41 0 0
## 8 3 0 0.84 0 1
## 9 3 1 0.89 1 0
## 10 4 0 1.79 0 0
## 11 4 0 1.79 0 0
## 12 4 1 1.33 1 0
## 13 5 0 1.79 0 0
## 14 5 0 1.79 0 0
## 15 5 1 1.79 0 0
N <- nrow(cola)
N3 <- N/3
price1 <- cola$price[seq(1,N,by=3)]
price2 <- cola$price[seq(2,N,by=3)]
price3 <- cola$price[seq(3,N,by=3)]
bchoice <- rep("1", N3)
for (j in 1:N3){
if(cola$choice[3*j-1]==1) bchoice[j] <- "2"
if(cola$choice[3*j]==1) bchoice[j] <- "3"
}
cola.clogit <- MCMCmnl(bchoice ~
choicevar(price1, "b2", "1")+
choicevar(price2, "b2", "2")+
choicevar(price3, "b2", "3"),
baseline="3", mcmc.method="IndMH")
## Calculating MLEs and large sample var-cov matrix.
## This may take a moment...
## Inverting Hessian to get large sample var-cov matrix.
sclogit <- summary(cola.clogit)
tabMCMC <- as.data.frame(sclogit$statistics)[,1:2]
row.names(tabMCMC)<- c("b2","b11","b12")
kable(tabMCMC, digits=4, align="c",
caption="Estimaciones para el Logit Condicional para los datos 'cola' ")
Mean | SD | |
---|---|---|
b2 | -2.2991 | 0.1382 |
b11 | 0.2839 | 0.0610 |
b12 | 0.1037 | 0.0621 |
pPepsi <- 1
pSevenup <- 1.25
pCoke <- 1.10
b13 <- 0
b2 <- tabMCMC$Mean[1]
b11 <- tabMCMC$Mean[2]
b12 <- tabMCMC$Mean[3]
# La probabilidad de que el individuo i elija Pepsi:
PiPepsi <- exp(b11+b2*pPepsi)/
(exp(b11+b2*pPepsi)+exp(b12+b2*pSevenup)+
exp(b13+b2*pCoke))
PiPepsi
## [1] 0.4834922
# La probabilidad de que el individuo i elija Sevenup:
PiSevenup <- exp(b12+b2*pSevenup)/
(exp(b11+b2*pPepsi)+exp(b12+b2*pSevenup)+
exp(b13+b2*pCoke))
PiSevenup
## [1] 0.2272638
## [1] 0.2892439
\[p_{i, \,pepsi}=0.483\] \[p_{i, \,sevenup}=0.227\] \[p_{i, \,coke}=0.289\]
Las tres probabilidades son diferentes para diferentes individuos porque diferentes individuos enfrentan diferentes precios; en un modelo más complejo se pueden incluir otros regresores, algunos de los cuales pueden reflejar características individuales.
##Quinta forma usando clogistic del pkg Epi
##
## Call:
## clogistic(formula = choice ~ price, strata = id, data = cola)
##
##
##
##
## coef exp(coef) se(coef) z p
## price -2.23 0.108 0.132 -16.8 0
##
## Likelihood ratio test=333 on 1 df, p=0, n=4521
#Referencias: 1. https://stats.idre.ucla.edu/sas/dae/multinomiallogistic-regression/