Estadística

V Jornadas de la Enseñanza y Aprendizaje de la Estadística y la Investigación Operativa

Los días 16 y 17 de junio de 2014, en Madrid, tendrán lugar las V Jornadas de la Enseñanza y Aprendizaje de la Estadística y la Investigación Operativa. Las organiza el Grupo de Enseñanza y Aprendizaje de la Estadística y la Investigación Operativa (GENAEIO) de la SEIO.

¿Por qué lo menciono? Pues porque estoy en el programa e igual alguien quiere acercarse a verme hablar de big data y similares. Aún no he cerrado los temas que quiero tratar en esas horas pero algunas ideas que me rondan la cabeza son:

Análisis factorial e ideas que se resisten a morir

Estoy escribiendo mucho sobre métodos de reducción de la dimensionalidad estos días. Digamos que son gajes del oficio. Espero no resultar repetitivo.

La cuestión que me empuja a escribir hoy es que algunos a mi alrededor insisten, insisten e insisten en las bondades del análisis factorial y lo oportuno de su aplicación a un problema sobre el que no voy a dar más detalles. Es una técnica que jamás estudié propiamente y con la que el poco contacto que he tenido se ha limitado a echar una mano a algunos clientes en el pasado en algún análisis.

The Elements of Statistical Craftsmanship

En How Statistics lifts the fog of war in Syria se describe una solución al problema de estimar el número de víctimas en cierto lance de la guerra de Siria. Lo complicado del problema es que existen diversos recuentos independientes y las víctimas pueden aparecer en todos, alguno o ninguno.

Me llama la atención que el método utilizado sea el de los bosques aleatorios (en particular, el randomForest de R). No sabría cómo utilizarlo para resolver este problema. Tampoco he tenido tiempo para entrar en los detalles.

Varimax: lo que se gana, lo que se pierde

Hoy hablaremos de exploratory factorial analysis y en particular aprovecharé para dejar constancia de que dejo resuelta una duda que siempre me ha dado pereza resolver: qué se pierde —lo que se gana ya nos lo han contado por doquier— al realizar una rotación varimax.

Comencemos. Primero, voy a realizar un análisis factorial (exploratorio) basándome en ?varimax:

fa <- factanal( ~., 2, data = swiss, rotation = "none")
fa

# Call:
#   factanal(x = ~., factors = 2, data = swiss, rotation = "none")
#
# Uniquenesses:
#   Fertility      Agriculture      Examination        Education         Catholic Infant.Mortality
# 0.420            0.492            0.270            0.005            0.061            0.960
#
# Loadings:
#   Factor1 Factor2
# Fertility        -0.674   0.356
# Agriculture      -0.648   0.297
# Examination       0.713  -0.471
# Education         0.997
# Catholic         -0.178   0.953
# Infant.Mortality -0.104   0.169
#
# Factor1 Factor2
# SS loadings      2.419   1.373
# Proportion Var   0.403   0.229
# Cumulative Var   0.403   0.632
#
# Test of the hypothesis that 2 factors are sufficient.
# The chi square statistic is 20.99 on 4 degrees of freedom.
# The p-value is 0.000318

Usando factanal he creado dos factores sobre el conjunto de datos swiss y he optado por no usar nigún tipo de rotación.

Componentes principales para quienes cursaron álgebra de primero con aprovechamiento

Quienes cursaron su álgebra de primero con aprovechamiento —los que no, pueden ponerse al día en 3:47 minutos— aprendieron que una matriz $latex X$ puede descomponerse de la forma

$$ \mathbf{X} = \mathbf{UDV}$$

donde $latex \mathbf{U}$ y $latex \mathbf{V}$ son matrices ortonormales y $latex \mathbf{D}$ es diagonal. Si los elementos de la diagonal de $latex \mathbf{D}$ son $latex d_1>d_2>\dots$ y los últimos son pequeños, entonces

$$ \mathbf{X} \approx \mathbf{UD_0V}$$

donde $latex \mathbf{D_0}$ es la matriz en la que se han sustituido los $latex d_i$ despreciables por ceros. Si $latex \mathbf{D_0}$ tiene m elementos diagonales no nulos, solo hay m columnas de $latex \mathbf{U}$ y m filas de $latex \mathbf{V}$ que juegan un papel efectivo en la proximación anterior. Por lo tanto se puede reescribir de la forma

Predictores con varianza casi nula, inflación, loterías y línea de comandos

Hoy viernes vuelvo a traer a mis páginas cuatro enlaces interesantes. El primero de ellos es como las malas películas: un arranque espléndido, un planteamiento prometedor y, al final, humo. Pero no trata de chico-conoce-chica sino de qué hacer con esas variables que tienen una varianza casi nula (a la hora de crear modelos estadísticos, se entiende). Me llegó tan oportunamente que pensé que alguien que vela por mí desde lo alto me lo enviaba para sacarme de mi semanal atolladero. Pero no fue el caso.

Los sospechosos habituales y Python

Llamo sospechosos habituales a esos programas y lenguajes para el análisis de datos distintos de R cuya decreciente popularidad nos parece tan natural a los partidarios de este último. Abundan los análisis de cuotas de mercado tales como What Analytic Software are People Discussing?

¿Cuáles son estos sospechosos habituales? Pues SAS, SPSS y algún otro: Stata, Statistica, Minitab,…

Sin embargo, R tiene competidores más serios a medio plazo. Uno de ellos, el más importante, es Python. Lo veo a mi alrededor: son muchos los físicos, los ingenieros, los informáticos que tienen experiencia en ese lenguaje y, sintiéndose cómodos en él —y les alabo el gusto— quieren utilizarlo para analizar datos cuando les toca.

Científicos de datos, aprended de los actuarios

Los actuarios fueron tal vez los primeros científicos de datos. Aparentemente, la primera tabla de mortalidad fue creada por John Graunt en 1662.

Los actuarios hablan de la esperanza de vida. Pero no son tan pendejos como los científicos de datos de hoy en día en eso de pretender que la esperanza de vida es la vida. Los actuarios saben que en una cohorte con una esperanza de vida de 78 años habrá quien muera a los tres, a los quince, a los cincuenta y a los noventa. Nadie les exige que acierten cuándo va a morir cada cual. En lugar de eso, estudian la distribución de los fallecimientos a lo largo del tiempo y calculan indicadores útiles para sus clientes.

Selección de enlaces: censos, el Titanic, periodistas y mapas

El primer enlace de la selección de esta semana es The evolution of the modern census. Todos sabemos que lo que llevó a José y María a Belén hace más de 2000 años fue dizque tenían que censarse. Hay noticias de censos anteriores. Desde entonces hasta ahora ha habido muchos, muchísimos censos, pero su mismo concepto y finalidad ha ido cambiando a lo largo de la historia: ya no se trata solamente de contar, medir la riqueza o el poderío militar. Ahora nos interesan otros aspectos relacionados ya no tanto con el cuántos sino con el cómo somos.

Victoria o diferencia de puntos, ahora con "random forests"

Después de hablar con tirios y troyanos sobre mi entrada sobre los efectos de binarizar una variable objetivo continua, he decidido tomarme la justicia por mi mano y llamar a la caballería. Es decir, utilizar random forests.

Aquí va el código:

library(randomForest)

set.seed(1234)

my.coefs <- -2:2
n <- 200
train.n <- floor(2*n/3)

test.error <- function(){
  X <- matrix(rnorm(n*5), n, 5)
  Y <- 0.2 + X %*% my.coefs + rnorm(n)
  Y.bin <- factor(Y>0)

  train <- sample(1:n, train.n)

  X <- as.data.frame(X)
  X$Y <- Y

  modelo <- randomForest(Y ~ .,
    data = X[train,])
  pred <- predict(modelo, X[-train,])
  error.cont <- length(pred) -
    sum(diag(table(pred >0, Y[-train]>0)))

  X$Y <- Y.bin
  modelo <- randomForest(Y ~ .,
    data = X[train,])
  pred <- predict(modelo, X[-train,])
  error.bin <- length(pred) -
    sum(diag(table(pred, Y.bin[-train])))

  data.frame(error.cont = error.cont,
    error.bin = error.bin)
}

errores <- do.call(rbind,
  replicate(1000, test.error(), simplify = F))

sapply(errores, fivenum)

El resultado, si te interesa, en tu pantalla.

¿Victoria o diferencia de puntos? ¿lm o glm?

Supongamos que queremos construir un modelo para predecir quién ganará un determinado partido de baloncesto basándonos en datos diversos. Y en un histórico, por supuesto.

Podemos utilizar una regresión logística así:

set.seed(1234)

my.coefs <- -2:2
n <- 200
train.n <- floor(2*n/3)

test.error.glm <- function(){
  X <- matrix(rnorm(n*5), n, 5)
  Y <- (0.2 + X %*% my.coefs + rnorm(n)) > 0

  train <- sample(1:n, train.n)

  X <- as.data.frame(X)
  X$Y <- Y

  mod.glm <- glm(Y ~ ., data = X[train,],
    family = binomial)

  glm.pred <- predict(mod.glm, X[-train,],
    type = "response")

  error <- length(glm.pred) -
    sum(diag(table(glm.pred > 0.5, Y[-train,])))
}

errores.glm <- replicate(1000, test.error.glm())

El código anterior hace lo siguiente:

Selección de enlaces: redes sociales, gráficos con R, ofertas de trabajo y p-valores

Acá va otra selección de cuatro enlaces relevantes –que no necesariamente nuevos— de la semana. El primero, Using Metadata to find Paul Revere recoge a modo de historia, que algunos encontrarán amena, una aplicación de rudimentos del álgebra lineal al análisis de redes sociales. Dada una matriz de incidencia A (personas que pertenecen a clubes) es posible calcular índices de proximidad entre personas (o entre clubes) calculando no más AA'. El resto hasta ganar el premio de Netflix es pura heurística.

D. Hand sobre estadística y minería de datos

Voy a comentar y recomendar hoy un artículo, Statistics and data mining: intersecting disciplines (lo siento, he perdido el enlace para su libre descarga), del siempre recomendable David Hand. Trata de un asunto que para muchos de los que seáis estadísticos y trabajéis en el asunto rodeados de gente procedente de otras disciplinas —¡ay, esos ingenieros!—, seguro, os produce dolores de cabeza: esa brecha que separa los mundos de la estadística y de la llamada minería de datos (y de otras maneras más recientemente).