Truco R. Añadir una marca de agua a nuestro gráfico con ggplot2

Un breve truco que tenía en la nevera: añadir marcas de agua a los gráficos de R realizados con ggplot2. Quería dedicar una serie de monográficos a las marcas de agua y al final nunca acabé. Para ilustrar el ejemplo, vamos a graficar la serie de visitas a esta web que nos ha dado Google Analytics: # Objeto con las visitas visitas <- c(213, 376, 398, 481, 416, 505, 771, 883, 686, 712, 883, 993, 1234, 1528, 1965, 1676, 1037, 1487, 1871, 2725, 2455, 2856, 2868, 2809, 3326, 4284, 4599, 3863, 3778, 5090, 5510, 5911, 4460, 5495, 5290, 6407, 5619, 6494, 5854, 4940, 4735, 6049, 6839, 8695, 7112, 9207, 8991, 10909, 9647, 10943, 9819, 8982, 8597, 10004, 12550, 12025, 9108, 10664, 9563, 9751, 11402, 11875, 10395, 10078, 8706, 10893, 13197, 12868, 9857, 12119, 13421, 14411, 12820, 14443, 12713, 13869, 11740, 14887, 17021, 16827) serie <- ts(visitas, start = c(2008, 4), end = c(2014, 11), frequency = 12) Hemos creado un objeto serie temporal del tipo ts y aprovecho esta entrada para contaros cómo transformar un objeto ts en un data frame. Recordamos que ggplot2 no puede graficar objetos ts directamente (por lo menos hasta donde yo sé). Para la transformación del objeto emplearemos la función index del paquete zoo y mi querida función melt de reshape2: ...

17 de diciembre de 2014 · rvaquerizo

Medir la importancia de las variables en una red neuronal con R

Sigo a vueltas con esta gran web y hoy vamos a medir la importancia de las variables en una red neuronal. Al igual que sucede en un modelo de regresión, los parámetros obtenidos pueden servirnos para determinar la importancia de una variable dentro del modelo. En el caso de una red neuronal, los pesos de la red pueden ser utilizados para determinar cómo influye una variable en el modelo. Para ilustrar este tipo de tareas, el gran @beckmw realizó esta entrada: ...

29 de septiembre de 2014 · rvaquerizo

Representación de redes neuronales con R

En la última entrada realizamos un modelo de regresión con redes neuronales. Hoy quería mostraros cómo representar gráficamente la red neuronal creada en esa entrada. A la modelización con redes neuronales siempre se le ha achacado un comportamiento de “caja negra”: nosotros pasamos unas variables de entrada por una capa oculta y obtenemos una salida. No hay parámetros ni inferencia sobre los mismos; no sabemos lo que hace la red por dentro. En el caso concreto de R y continuando con la entrada anterior, si hacemos summary(bestnn): ...

9 de septiembre de 2014 · rvaquerizo

Modelos lineales dinámicos (DLM) con R

Otro de los modelos que está tocando estudiar este verano son los Dynamic Linear Models (DLM). Para estudiar este tipo de modelos es imprescindible leer este documento. Estos métodos parten de una idea: “la vida no es fácil cuando tienes que hacer estimaciones sobre una serie temporal”. Una serie temporal es un vector de datos aleatorios, una sucesión de observaciones de la forma $Y_t$ con $t=1, 2, \dots$. Si sobre esta sucesión tenemos una característica que puede influir, estamos ante un modelo de espacio estado. Estos modelos tienen una cadena de Markov (http://es.wikipedia.org/wiki/Cadena_de_M%C3%A1rkov) porque esa característica que afecta a la serie es una cadena de Markov, y eso nos permite que los $Y_t$ sean independientes ya que dependen sólo de esa característica. El más importante modelo de espacio estado es el modelo lineal dinámico. ...

7 de septiembre de 2014 · rvaquerizo

Regresión con redes neuronales en R

La última técnica que me estoy estudiando este verano es la regresión con redes neuronales. El ejemplo que os voy a poner es completamente análogo a este: http://heuristically.wordpress.com/2011/11/17/using-neural-network-for-regression/. Vamos a trabajar con el paquete nnet; si dispusiera de tiempo, replicaría este ejemplo en otra entrada con neuralnet. Para realizar el ejemplo tenemos el conjunto de datos BostonHousing, que contiene el censo de 1970 de 506 hogares de Boston. Empecemos a trabajar con la consola de RStudio: ...

7 de septiembre de 2014 · rvaquerizo

Primeros pasos con regresión no lineal (nls) con R

La regresión no lineal se da cuando tenemos que estimar $Y$ a partir de una función del tipo $Y = f(X, \beta) + \epsilon$, donde $\beta$ representa un vector de parámetros $\beta_1, \beta_2, \dots, \beta_n$. Unos datos $X$ e $Y$ se relacionan mediante una función no lineal respecto a unos parámetros $\beta$ desconocidos. ¿Cómo obtenemos estos $\beta$ desconocidos? Habitualmente a través de mínimos cuadrados ordinarios o bien con otros métodos como máxima verosimilitud. Este cálculo llevará asociada su inferencia estadística habitual. La función que asocia los pares de datos $(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)$ será una función conocida. Por eso esta técnica es muy utilizada en ciencias químicas, geodinámica… donde ya se conoce la relación teórica que hay entre las variables, pero es necesario realizar modelos con los pares de datos disponibles de cara a obtener estimaciones de los parámetros. ...

21 de agosto de 2014 · rvaquerizo

Regresión ridge o regresión contraída con R

Por lo visto no he estudiado lo suficiente. Tengo que redimirme y estudiar este verano determinadas técnicas avanzadas de predicción. Fundamentalmente tengo que trabajar con R y tener determinados conocimientos teóricos sobre estas técnicas. Así que he pensado que, a la vez que estudio yo, estudian todos mis lectores. Además es probable que genere debate. En esta primera entrega vamos a tratar la regresión contraída o regresión ridge. En el blog ya hablamos del problema que suponía la multicolinealidad; cuando tenemos este problema, una de las posibles soluciones es la regresión contraída o regresión ridge. Como ya dijimos, el modelo lineal se expresa como $Y = X \cdot \beta + \text{Error}$; la estimación de nuestros parámetros $\beta$ por mínimos cuadrados ordinarios es $\beta = \text{inv}(X’X) \cdot X’Y$. Cuando $(X’X)$ no es invertible tenemos un problema. La regresión ridge plantea una solución a este problema con unos parámetros $\beta extbackslash_{\text{contraidos}} = \text{inv}(X’X + \lambda I) \cdot X’Y$; si $\lambda$ es 0 estamos ante mínimos cuadrados ordinarios; en otro caso estamos ante un estimador sesgado de $\beta$. Este estimador sesgado es solución al problema de mínimos cuadrados penalizados y lo que hace es contraer los $\beta$ en torno a 0. En resumen: metemos sesgo pero reducimos varianza. ...

9 de julio de 2014 · rvaquerizo

Selección del mejor punto de diagnóstico en una prueba diagnóstica

La pasada semana, in un examen, me preguntaron cuál era el mejor punto para una prueba diagnóstica; era necesario razonar mi respuesta. Seguramente mi respuesta fue correcta, pero mi razonamiento no lo fue y por eso quería redimirme. Para evaluar las pruebas diagnósticas con una respuesta binaria (sí/no), contamos con la sensibilidad y la especificidad. La sensibilidad es la capacidad que tiene la prueba para acertar sobre los que de verdad tiene que acertar (la probabilidad de etiquetar como enfermos a aquellos que verdaderamente están enfermos). La especificidad es una medida que nos indica cuánto nos hemos equivocado con los «unos» (la probabilidad de etiquetar enfermos a pacientes sanos). Una forma de medir cuánto acertamos y cuánto nos equivocamos con nuestra prueba. Para analizar el comportamiento de nuestra prueba diagnóstica, debemos determinar un punto de corte. Para ilustrar cómo seleccionar el mejor punto de corte, vamos a emplear unos datos sacados de la web de bioestadística del Hospital Ramón y Cajal y vamos a elaborar una curva ROC con R y ggplot2. ...

5 de febrero de 2014 · rvaquerizo

Espacios en SAS

Las funciones SAS más habituales para eliminar blancos son las que tenéis en la figura de arriba. Para llegar a ese conjunto de datos SAS, hemos ejecutado el siguiente paso DATA: data ejemplo; st = " Cuando brilla el sol "; l_st = length(st); output; funcion = "COMPRESS"; st1 = compress(st); l_st1 = length(st1); output; funcion = "COMPBL"; st1 = compbl(st); l_st1 = length(st1); output; funcion = "TRIM"; st1 = trim(st); l_st1 = length(st1); output; funcion = "TRIMN"; st1 = trimn(st); l_st1 = length(st1); output; funcion = "STRIP"; st1 = strip(st); l_st1 = length(st1); output; funcion = "STRIP+COMPBL"; st1 = strip(compbl(st)); l_st1 = length(st1); output; run; Distintas formas de eliminar espacios dentro de una cadena de caracteres en SAS. Partimos de la variable string « Cuando brilla el sol » y empleamos las siguientes funciones: ...

14 de enero de 2014 · rvaquerizo

Cuidado con el p-valor. Depende del tamaño de la muestra

El otro martes, Teresa, mi profesora de la Facultad de Estudios Estadísticos, dijo una frase que me dejó helado: «Ojo con el p-valor porque depende del tamaño muestral». Estábamos estudiando regresión logística y tests de independencia. Ahora que uno mismo vuelve a estudiar qué es lo que hay detrás de la salida de los programas estadísticos, se plantean muchas dudas. Por definición, el p-valor depende del tamaño muestral y es una medida que la tomamos como un axioma para todo: el p-valor nunca miente hasta que tenemos mucha exposición. Voy a utilizar un ejemplo que vi en clase con Teresa ligeramente retocado (no creo que se enfade, no creo ni que lea esto). Trabajo con SAS porque estoy más acostumbrado a la salida que ofrece. Se trata de realizar un test de independencia para una tabla 2x2. La $H_0$ o hipótesis nula es que existe independencia entre el factor de nuestro estudio y la variable dependiente; en nuestro caso, $H_0$ es «no hay relación entre la utilización de un pesticida y la presencia de una enfermedad», frente a $H_1$, «hay relación entre la utilización del pesticida y la presencia de la enfermedad». Simulamos los datos con SAS: ...

17 de diciembre de 2013 · rvaquerizo