Archivo de la etiqueta: R

Truco R. Eval, parse y paste para automatizar código

La función paste nos permite concatenar cadenas de texto con R:

paste("Dato",rep(1:10),sep="")

Parse recoge una expresión pero no la evalúa:

parse(text="sqrt(121)")

Y por último eval evalúa una expresión:

eval(parse(text="sqrt(121)"))

Interesantes funciones que nos pueden permitir automatizar códigos recursivos o códigos guardados como objetos en R. Imaginemos el siguiente ejemplo de R:

ejemplo1 <- data.frame(replicate (20,rpois(20,10)))
nom <- paste("dato",1:20,sep="")
names(ejemplo1) <- nom
summary(ejemplo1)

Hemos automatizado los 20 nombres de un data frame con datos aleatorios con una distribución de poissón de media 10 creado con la función replicate. Ahora imaginemos que deseamos transformar en factor sólo aquellos elementos del data frame con un sufijo par (datos2, datos4, ...). Podemos crear una función o podemos crear ejecuciones de código R del siguiente modo:

ejecucion <- paste("ejemplo1$dato",seq(2,20,by=2),"<-as.factor(ejemplo1$dato",
seq(2,20,by=2),")",sep="")
ejecucion
[1] "ejemplo1$dato2<-as.factor(ejemplo1$dato2)"
[2] "ejemplo1$dato4<-as.factor(ejemplo1$dato4)"
[3] "ejemplo1$dato6<-as.factor(ejemplo1$dato6)"
[4] "ejemplo1$dato8<-as.factor(ejemplo1$dato8)"
[5] "ejemplo1$dato10<-as.factor(ejemplo1$dato10)"
[6] "ejemplo1$dato12<-as.factor(ejemplo1$dato12)"
[7] "ejemplo1$dato14<-as.factor(ejemplo1$dato14)"
[8] "ejemplo1$dato16<-as.factor(ejemplo1$dato16)"
[9] "ejemplo1$dato18<-as.factor(ejemplo1$dato18)"
[10] "ejemplo1$dato20<-as.factor(ejemplo1$dato20)"

Ahora tenemos que hacer que un objeto con instrucciones se ejecuten con parse y eval:

eval(parse(text=ejecucion))
summary(ejemplo1)

Hemos transformado en factores los elementos con sufijo par. Esto puede realizarse con sapply pero merece la pena que le echéis un vistazo a este proceso, lo ejecutéis y aprendáis una forma de automatizar código. En breve tendréis otro ejemplo de uso de esta metodología muy parecida a la que empleamos cuando programamos en otros lenguajes con menos futuro que R. Saludos.

Montemos un sistema de información en nuestro equipo (III)

Vamos a conectar R a nuestra BBDD postgres. Lo vamos a hacer vía ODBC con el paquete de R RODBC [inciso] recordad que todo el trabajo lo estamos realizando bajo Win. Además trabajar con ODBC nos permitirá conectar nuestro postgres con Access o Excel. Aunque para este tipo de tarea recomiendo el uso del Data Integration de Pentaho. El primer paso será descargarnos de esta dirección los controladores ODBC para Postgres que se adecúen con nuestro S.O. y nuestra versión de postgres. Tras instalarlos ya podemos ir a las Herramientas Administrativas Orígenes de Datos ODBC e introducimos un nuevo DSN de sistema y de usuario:

sinfo_casero7.png

Ya tenemos un origen de datos ODBC para nuestra BBDD de postgres llamado PostgreSQL30. Podemos crear la conexión con R:

library(RODBC)
con = odbcConnect("PostgreSQL30",case="postgresql")

Ya tenemos conectado R con nuestra BBDD y podemos realizar consultas sobre ella:

datos = sqlQuery(con,"SELECT * FROM red_wine")

Seleccionamos todos los campos de la tabla red_wine que cargamos en el capítulo anterior del monográfico. También estamos en disposición de subir a nuestro postgres los objetos de R que deseemos:

#Creamos una muestra aleatoria de 100 registros
selec = sample(1:nrow(datos),100)
muestra = datos[selec,]
#Subimos a la BBDD postgres el data frame de R
sqlSave(con,muestra)

Vemos que la función sqlSave nos permite guardar en la BBDD aquellos objetos de R que consideremos necesarios. En pocos pasos estamos construyendo herramientas para que nuestro equipo tenga un pequeño sistema de información. Este sistema se sustenta en tre pilares fundamentales: Postgres, Data Integration de Pentaho y R. Software libre.

Montemos un sistema de información en nuestro equipo (I)

Un poco de bricolaje. Se trata de crear un sistema de información sin coste y que nos permita almacenar nuestros datos con orden y coherencia, crear informes y realizar modelos matemáticos bajo Windows. Es perfectamente replicable para Linux. También estoy abierto a sugerencias ya que tampoco soy ningún experto en el tema y podemos crear un debate interesante. El sistema que planteo se va  a sustentar en 3 pilares fundamentales que os podéis descargar de forma gratuita en los link creados:

  • Postgres:
  • Será nuestro motor de BBDD relacionales. Seguramente no haremos un modelo de datos complicado e incluso nos dedicaremos a llenar la BBDD con tablas de todo tipo sin mucha conexión entre ellas pero es necesario tener una BBDD.

  • Data integration de Pentaho:
  • Será la herramienta que empleemos para subir datos al servidor. También podremos emplearla para realizar informes.

  • R:
  • Que puedo más puedo decir sobre R. El futuro.

Para la realización de informes he comentado la posibilidad de emplear Pentaho pero puede ser más adecuado emplear una hoja de cálculo. Para esto yo si me gasté dinero y dispongo de Excel, pero intentaré trabajar con Google Spreadsheet. El primer paso es descargarse cada una de las herramientas que propongo. Tanto Postgres como R nos lo descargamos y lo instalamos, el Data Integration de Pentaho no requiere instalación, nos descargamos el archivo, lo descomprimimos y para arrancarlo tenemos el script spoon.bat R no plantea muchos problemas para instalarse en un equipo local de Windows y Postgres puede dar algún problema en Windows 7, si alguien los tiene que los reporte para ayudar a solventarlos y así quedan documentados en el blog. La instalación dePostgres nos pedirá la contraseña del admin, ojo con esta contraseña.

En la siguiente entrega comenzaremos a trabajar con Postgres y Pentaho. Por supuesto, como he comentado antes, cualquier aporte será bienvenido. Saludos

Trucos R. Leer archivos XML con R

Un truco de R práctico que busca la colaboración de los lectores para mejorarlo. Se trata de leer ficheros xml con R. Los más asiduos ya sabéis que paquete voy a emplear, el XML. En los últimos tiempos la sentencia require(XML) aparece al principio de casi todos mis códigos en el Tinn-R. El ejemplo que ilustrará el truco lee de la BBDD del banco mundial en español el indicador de emisiones de CO2 en toneladas por habitante y año. La sintaxis es de este modo:


#Paquete necesario para leer XML
require(XML)
arch = "http://datos.bancomundial.org/sites/default/files/indicators/es/co2-emissions-metric-tons-per-capita_es.xml"
doc <- xmlTreeParse(arch,getDTD=T,addAttributeNamespaces=T)
arriba = xmlRoot(doc)
#Vemos los nombres de los campos de la tabla
names(arriba[[1]])

Leemos directamente de la web el documento XML. xmlTreeParse crea la estructura del XML en R, de este modo podemos acceder a los datos. Lo primero que vamos a hacer es saber los nombres de las columnas que deseamos leer, para ello xmlRoot obtiene los nodos raiz de la estructura que hemos leído. La función names obtiene los nombres Sigue leyendo Trucos R. Leer archivos XML con R

Un homenaje a Malthus con R

Hoy quería yo revindicar la figura de un tipo bastante maltratado: Thomas Malthus. Maltratado porque era un poco reaccionario y facha, y parece que eso es suficiente para que se olviden de uno, aunque fuera el tipo que más ha aportado a la demografía.Y el homenaje tenía que hacérselo con el paquete de R que más utilizo últimamente, el XML y algunos sencillos gráficos creados con R-commander. Malthus lo que venía a decir es que somos muchos, demasiados y encima la cosa tenía muy mala pinta. Parece que tiene razón, pero vamos a verlo gráficamente. Comenzamos:

library(XML)
pag="http://en.wikipedia.org/wiki/World_population"
total_tablas=readHTMLTable(pag)
str(total_tablas)

Nos interesa saber la población estimada y tenemos 17 elementos. Nos vamos a quedar con las estimaciones desde el siglo XVIII en adelante. Tenemos el problema con los formatos de los números:


poblacion=data.frame(total_tablas$`Estimated world population at various dates (in millions) [citation needed]`)
#NOS QUEDAMOS CON LOS REGISTROS QUE NOS INTERESAN
poblacion=poblacion
#FUNCION PARA TRANSFORMAR CARACTER A NUMERO
cambio=function(x){
x=(gsub("([[:punct:]])","",x))
x=(gsub("([[:alpha:]])","",x))
#AJUSTE A MEDIDA, POR NO COMPLICAR LA FUNCION
x=as.numeric(gsub(" 1 ","",x))}
#PODEMOS USAR SAPPLY:
poblacion$Year=cambio(poblacion$Year)
poblacion$World=cambio(poblacion$World)
poblacion$Africa=cambio(poblacion$Africa)
poblacion$Asia=cambio(poblacion$Asia)
poblacion$Europe=cambio(poblacion$Europe)
poblacion$Latin.America.Note.1.=cambio(poblacion$Latin.America.Note.1.)
poblacion$Northern.America.Note.1.=cambio(poblacion$Northern.America.Note.1.)
poblacion$Oceania=cambio(poblacion$Oceania)

Analicemos si Malthus tenía motivos para ser tan cenizo Sigue leyendo Un homenaje a Malthus con R

Agregador de noticias de R en español

En el blog hermano de Carlos Gil han puesto en marcha uno de los proyectos más interesantes que han pasado por la blogosfera  últimamente. Un agregador de noticias de R en español. Un proyecto similar a R-bloggers pero en lengua hispana. Por supuesto este blog es uno de los participantes.

El motor lo ha hecho integramente Carlos (con sus deditos y Python) y publica vía RSS cuando encuentra la etiqueta R. Desde aquí os invito a que déis de alta vuestros blog y poder crear una web referencia en español sobre R a la altura de R-bloggers.

“Random walk” se escribe con R.

'Random walk' hace referencia a la teoría financiera de que los mercados financieros siguen un camino aleatorio. Pero NO vamos  discutir si se da o NO se da tal hipótesis, lo que SÍ vamos a hacer es utilizar R para seguir las acciones, fondos de inversión, o sencillamente para ver nuestro decepcionante Euro respecto a otras divisas (por si algún día los 'españolitos' debieramos empezar a emigrar de nuevo... tal como esta el patio!).

Vamos a necesitar varios paquetes, si no me olvido de ninguno, básicamente son estos 2:
-quantmod
-tawny

La manera de funcionar es que conectan a la fuente de datos de los portales de Yahoo y Google, y extrae los datos que le pidamos con unos 15-30 minutos de retraso respecto al tiempo real de mercado (creo que conecta con Yahoo por defecto). Sea como sea, nos indica tambien la fecha y hora de la última cotización más reciente.

Es tan sencillo como hacer:

> getQuote('AAPL')
..y nos informa de la última cotización de las acciones de APPLE.

Sigue leyendo “Random walk” se escribe con R.

Desarrollo de IDE para R

Sigo añadiendo pocos mensajes al blog por falta de tiempo. Corren malos tiempos para el ahora escribiente. A este paso el blog no llegara nunca a las 4.000 visitas mensuales objetivo muy ambicioso para este 2010. Pero en este mensaje quería enlazar el blog de un ex compañero:

http://miguelinlas3.blogspot.com/

Interesante proyecto que crea un entorno de desarrollo integrado para R. De momento lo esta desarrollando pero cuando note el incremento de visitas desde este sitio, porque lo notara, y si lo nota y le seguimos le servirá de presión para que continúe su desarrollo.

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