Archivo de la etiqueta: regresión logística

Qué pasa si uso una regresión de poisson en vez de una regresión logística

Para un tema de mi trabajo voy a utilizar una regresión de poisson en vez de una regresión logística, el evento es si o no y no tiene nada que ver el tiempo, ni se puede contabilizar como un número, pero a efectos prácticos es mejor para mi usar una regresión de poisson. Entonces, ¿qué pasa si hago una poisson en vez de binomial? Como siempre si mi n es muy grande hay relación entre ambas distribuciones. Pero yo quiero saber si me puede clasificar mis registros igual una regresión de poisson y una binomial y se me ha ocurrido hacer un ejercicio teórico muy simple.

Construyo con SAS 10.000 datos aleatorios con las variables independientes x e y normalmente distribuidas y la variable dependiente z que es una función logística "perfecta" de x e y:

data logistica;
do i=1 to 10000;
x=rannor(8);
y=rannor(2);
prob=1/(1+exp(-(-10+5*x-5*y)));
z=ranbin(8,1,prob);
output;
end;
drop i;
run;

data entrenamiento test;
set logistica;
if ranuni(6)>0.8 then output test;
else output entrenamiento;
run;

proc freq data=entrenamiento;
tables z;
quit;

Separo los datos en entrenamiento y test y vemos que un 8% aproximadamente de mis registros tienen valor 1. Sobre estos datos hago una logística y una poisson y veo los parámetros Sigue leyendo Qué pasa si uso una regresión de poisson en vez de una regresión logística

Trucos SAS. Medir la importancia de las variables en nuestro modelo de regresión logística

Hoy quería proponeros una forma poco ortodoxa de medir la importancia de las variables en un modelo de regresión logística con SAS. La cuestión es: dado un modelo de regresión logística crear un ranking con las variables más importantes dentro del modelo. Para esta tarea recomiendo el uso de random forest, pero puede ser imposible disponer de un software que realice este tipo de modelos. Imaginemos un caso concreto, disponemos de SAS STAT y nos da reparo trabajar con R. Para este caso podemos emplear el siguiente truco. El AIC (criterio de información de Akaike) es un estadístico que relaciona el cociente de la verosimilitud con el número de parámetros del modelo que ajustamos. Cuanto menor sea este cociente mejor será nuestro modelo. Si eliminamos una variable del modelo ¿cuánto empeora este modelo? Esa será la filosofía que emplearemos para analizar la importancia de las variables presentes en nuestro modelo. En la línea habitual hacemos un ejemplo para que podáis copiar y pegar en vuestro SAS:

Vamos a crear un dataset preparado para hacer una regresión logística perfecta donde en un 10% de los casos sucede un evento:

*REGRESION LOGISTICA PERFECTA;
data logistica;
do i=1 to 10000;
  normal1=rannor(8);
  normal2=rannor(45);
  normal3=rannor(32);
  normal4=rannor(7);
  normal5=rannor(98);
  unif1=ranuni(2);
  unif2=ranuni(21);
  unif3=ranuni(22);
  unif4=ranuni(23);
  unif5=ranuni(24);
  prob=1/(1+exp(-(-3.16+0.1*normal1-0.2*normal2+0.3*normal3-0.4*normal4+0.5*normal5+
	   0.1*unif1+0.2*unif2+0.3*unif3+0.4*unif4+0.5*unif5)));
  sucede=ranbin(8,1,prob);
  *TRAMIFICAMOS LAS VARIABLES;
  normal1=round(rannor(8),0.1);
  normal2=round(rannor(45),0.2);
  normal3=round(rannor(32),0.3);
  normal4=round(rannor(7),0.4);
  normal5=round(rannor(98),0.5);
  unif1=round(ranuni(2),0.1);
  unif2=round(ranuni(21),0.2);
  unif3=round(ranuni(22),0.3);
  unif4=round(ranuni(23),0.4);
  unif5=round(ranuni(24),0.5);
  output;
end;
drop i;
run;

title "Logistica con un 10% aprox de casos positivos";
proc freq data=logistica;
tables sucede;
quit;

Incialmente necesitamos las variables presentes en el modelo y el ajuste inicial, también un conjunto de datos SAS con los nombres de las variables. Esto es un poco chapuza, pero si seguís el blog podéis hacer este código mucho más elegante [no os lo voy a dar todo hecho] Sigue leyendo Trucos SAS. Medir la importancia de las variables en nuestro modelo de regresión logística

Sobremuestreo y pesos a las observaciones. Ahora con R

De nuevo volvemos a la entrada de ayer para replicar el código SAS utilizado en R. Se trata de realizar 3 modelos de regresión logística con R para estudiar como influyen en los parámetros el uso de un conjunto de datos con sobremuestreo o el uso de un conjunto de datos donde asignamos pesos a las observaciones. El programa es sencillo pero tiene un uso interesante de la librería de R sampling. Aquí tenéis el código:

#Regresión logística perfecta
num = 100000
x = rnorm(num); y=rnorm(num)
p=1/(1+exp(-(-5.5+2.55*x-1.2*y)))
z=rbinom(num,1,p)
datos_ini=data.frame(cbind(x,y,z))
table(datos_ini$z)

modelo.1 = glm(z~x+y,data=datos_ini,family=binomial)
summary(modelo.1)

El mismo modelo que planteamos con SAS en la anterior entrada nos permite realizar una regresión logística perfecta. Veamos como se plantea la realización del sobremuestreo con R:

#Realizamos el sobremuestreo con la librería sampling
library( sampling )
selec <- strata( datos_ini, stratanames = c("z"), size = c(50000,50000), method = "srswr" ) table(selec$z)

modelo.2 = glm(z~x+y,data=datos_ini[selec$ID_unit,],
family=binomial)
summary(modelo.2)

Habrá que volver sobre el tema del muestreo para analizar las posibilidades de la librería sampling, en este caso realizamos muestreo estratificado con la función strata y muestreo aleatorio con reemplazamiento. Replicamos el proceso asignando pesos:

#Realizamos el proceso asignando pesos
pct=sum(datos_ini$z)/num
datos_ini$peso = ifelse(datos_ini$z==1, 0.5/pct, 0.5/(1-pct))
tapply(datos_ini$peso,datos_ini$z,sum)

modelo.3 = glm(z~x+y,data=datos_ini,
family=binomial, weights=peso)
summary(modelo.3)

Y obtenemos los mismos resultados (que sorpresa). Saludos.

El sobremuestreo ¿mejora mi estimación?

El sobremuestreo (oversampling) es una técnica de muestreo que se emplea habitualmente cuando tenemos una baja proporción de casos positivos en clasificaciones binomiales. Los modelos pueden “despreciar” los casos positivos por ser muy pocos y nuestro modelo no funcionaría. Para incrementar el número de casos positivos se emplea el sobremuestreo. Ejemplos habituales pueden ser los modelos de fraude, un 99% de las compras son correctas, un 1% son fraudulentas. Si realizo un modelo puedo estar seguro al 99% de que todas mis compras son correctas, en este caso hemos de realizar un sobremuestreo para incrementar nuestros casos de fraude y poder detectar los patrones.

Personalmente no sabría deciros el porcentaje de casos positivos a partir del cual sería necesario llevar a cabo un proceso de remuestreo. A mi particularmente me gusta hacerlo siempre. Por lo menos realizar algunas pruebas para identificar aquellas variables que son más influyentes y comenzar a eliminar aquellas que no van a funcionar. Busco exagerar. Tampoco me quiero mojar mucho sobre la proporción de casos positivos y negativos, pero si estamos realizando un nuevo muestreo podemos emplear perfectamente un 50% para ambos, aquí si que dependemos del número de registros con el que estemos trabajando ya que al final el sobremuestreo será la repetición de los casos positivos sobre la tabla de entrada del modelo.

Sin embargo, cuando ya tengo decidido como va a ser mi modelo no me gusta realizar sobremuestreo. Lo considero un paso previo (algún lector del blog considerará estas palabras incoherentes). Después de toda esta exposición teórico-práctica de malos usos de un dinosaurio  en realidad lo que cabepreguntarse es ¿mejora la estimación un modelo con sobremuestreo?

Abrimos R y Tinn-R y manos a la obr Sigue leyendo El sobremuestreo ¿mejora mi estimación?

Monográfico. Un poco de PROC LOGISTIC

El PROC LOGISTIC es un procedimiento de SAS que nos ha dado muchas satisfacciones a los dinosaurios como el ahora escribiente. La regresión logística es uno de los modelos de regresión más utilizados y es bien conocido por todos mis lectores (bastante más inteligentes que yo). El problema es muy sencillo hemos de clasificar una población dividida en dos partes a partir de unas variables independientes. Su aplicación es muy extensa: patrones de fuga, propensiones a compra, salud, fraude,… Con este monográfico pretendo acercaros en 3 minutos a las sentencias básicas en SAS para crear un modelo de regresión logística y proponer gráficos y validaciones. En la línea habitual del blog partimos de una simulación y analizamos la sintaxis, evitamos poner las salidas para no “cargar” la entrada con tablas de poca utilidad. El ejemplo es el que sigue:

data datos;
do id_cliente=1 to 20000;
edad=min(65,ranpoi(4,45));
pasivo=ranuni(4)*10000+ranuni(12)*(10000*(edad-5));
compras=round(pasivo/(ranexp(423)*1000));
vinculacion=max(1,ranpoi(2,round(pasivo/300000)+1));
recibos=ranpoi(1,2);
provincia=min(52,ranpoi(123,28));
output;
end;
run;

Conjunto de datos SAS con 20000 clientes de Banca Personal de una entidad bancaria que están en proceso de desvinculación. Otra entidad se ha puesto en contacto con rvaquerizo@analisisydecision.es y le han realizado un modelo de potencial de pasivo, un modelo de Share of Wallet de clientes que está funcionando a las mil maravillas y detectan que esta entidad les está provocando una reducción de pasivo y desvinculación de algunos de sus clientes. Lo detectan gracias al mecanismo de alarmas que diseñó rvaquerizo@analisisydecision.es (un poco de publicidad que todo esto sale de mi tiempo y mi bolsillo). El equipo comercial se pone en marcha Sigue leyendo Monográfico. Un poco de PROC LOGISTIC

Monográfico. Regresión logística con R

Por fin nos metemos con la regresión logística en R. Nos meteremos con WPS (si es posible). Los modelos de regresión logística son los más utilizados en las áreas en las que el ahora escribiente ha trabajado. ¿Por qué tiene tanto "éxito"? Porque es el mejor ejemplo de modelo de variable linealmente dependiente de otras variables independientes. Pero sobre todo tiene éxito porque modelamos una probabilidad de un suceso (habitualmente dicotómico) en función de unos
factores que pueden ser discretos o continuos. Modelizamos probabilidades, insisto; por ejemplo, si clasificamos la variable comete fraude como 1 y no comete fraude como 0 podríamos realizar un modelo de regresión lineal del tipo fraude(0,1)=:término independiente:+:parámetro:*:independiente:. Matemáticamente es posible, pero si me dices que un cliente tiene un 1,34 de "potencial" de fraude entro en estado de shock. Peeero, si p es la probabilidad de cometer fraude podemos construir esta función Ln(p/(1-p)) y sobre esta función si hacemos: Ln(p/q)=:término independiente: + :parámetro:*:independiente:. O lo que es lo mismo: prob. fraude=1/(1+e**(-:término independiente:-:parámetro:*:independiente:)). Qué bonita función y que interesante propiedad de los logaritmos Sigue leyendo Monográfico. Regresión logística con R

Macros SAS. Tramificar en función de una variable respuesta

Sobre la idea de “dumificar” variables he ideado un proceso para agrupar variables cuantitativas en función de una variable respuesta. Los que disponéis de herramientas de análisis más complejas tipo Enterprise Miner o Clementine ya disponéis de algoritmos y funciones que realizan esta útil tarea, además los árboles pueden trabajar con variables continuas. Pero un modelo es bueno si las variables de entrada están bien elegidas y bien construidas y como paso previo al análisis multivariante el análisis univariable es imprescindible. Tramificar una variable continua en función de una variable respuesta no va más allá de un análisis univariante, igualmente podemos tener dependencia lineal entre variables, algo que sólo detectaremos con análisis multivariables. Pero este sencillo algoritmo puede ayudarnos a conocer mejor algunas variables que deseamos introducir en nuestro modelo.

La idea es muy fácil: dispongo de una variable continua y una variable respuesta, divido la variable continua en N variables dicotómicas y mediante una regresión logística determino una respuesta media de cada grupo y si la media de un grupo es muy parecida a la media de otro grupo cercano entonces Sigue leyendo Macros SAS. Tramificar en función de una variable respuesta