Truco R. Insertar imagen en un gráfico

Junio 22nd, 2010 por rvaquerizo

Quería pintaros mi estimación sobre el mundial de Sudáfrica con R. La he hecho con el corazón más que con la cabeza. Es evidente que no será así. Esta estimación la pinto utilizando dos paquetes de R más que interesantes. El rimage no está en CRAN, es una cosa muy rara, un paquete "propietario" pero que tiene la función read.jpeg que permite crear objetos de imagen en R. El otro paquete interesante es el TeachingDemos que nos permite añadir imágenes a los gráficos de R, me acerqué a él cuando esta web tenía un logo, ahora ya no lo tiene. También me parece que puede ser de utilidad la función download.file

El caso es que a continuación os planteo un código de R que puede añadir mucha vistosidad a vuestros gráficos Lee el resto de esta entrada »

Tags: ,

Trucos R. Conectar a internet por el puerto 8080

Junio 22nd, 2010 por rvaquerizo

Con R hay veces que no podemos acceder a internet desde nuestro trabajo. Esto es porque el puerto 80 suele estar cerrado por motivos de seguridad. Sin embargo el puerto 8080 es más habitual dejarlo abierto. Para conectar R con internet y facilitar la descarga de paquetes, la conexión con Yahoo Finance, Bloomberg,... podemos hacer lo siguiente. Buscar el Rgui.exe en nuestro equipo y a la hora de ejecutarlo poner la opción --internet2. Con ello hacemos que R se conecte a internet con el puerto 8080. Por ejemplo en windows sería:

"C:\Archivos de programa\R\R-2.10.1\bin\Rgui.exe" --internet2

Este sencillo truco nos está facilitando mucho la instalación de paquetes de R. Y a mi me está permitiendo seguir algunas acciones del Mercado Continuo con quantmod.

X command (MS-DOS prompt) desde SAS.

Junio 16th, 2010 por danifernandez

Como veo que a Raul le faltan algunas visitas para llegar a las 5000 (mensuales?), y dado que se curra esta web para dar a conocer multiples trucos en R, SAS, WPS, et..., he decidido crear esta sencilla macro (si queremos que el X command se ejecute repetitivamente dentro de un bucle, solo puede hacerse dentro de una macro pues si la ejecutamos dentro de un paso data SOLO lo ejecuta 1 vez por más que escribamos 'do i=1 to 100;' ). El comando X lo que hace es traspasar la sentencia SAS a 'cmd' o 'command' del MS-DOS. Aqui solo lo limito hasta 5 en modo de ejemplo:

options noxwait noxsync;

%macro visitar_analisisydecision;
%do z=1 %to 5;
x 'start http://analisisydecision.es/';
%end;
%mend;
%visitar_analisisydecision

Raul, ya tienes 5 visitas más.... ¿el contador de visitas lo percibe o no? (Sorry por mi ignorancia respecto a los web analytics).

un saludo!

Trucos SAS. Modificar el nombre de una tabla con código

Junio 16th, 2010 por rvaquerizo

Dando un repaso a las entradas de Google me he encontrado repetida la frase: "cambiar el nobre de un dataset SAS". Imagino que desearán cambiar el nombre de un dataset con código sin realizar un paso DATA. Para hacer esta labor hemos de emplear el PROC DATASETS y la sentencia CHANGE. Veamos un código de ejemplo muy sencillo:


*DATASET ALEATORIO;
data sasuser.uno;
 do i=1 to 1000;
 aleat=ranuni(9);
 output;
 end;
run;
*CAMBIAMOS EL NOMBRE;
proc datasets lib=sasuser nolist;
change uno=borrar;
quit;
*ELIMINAMOS EL DATASET;
proc delete data=sasuser.borrar; quit;

El código es extremadamente sencillo. Imagino que las entradas que estaban llegando con esta duda buscaban algo parecido a esto. El PROC DATASETS es un gran desconocido.

Tags: ,

Monográfico. Clasificación con SVM en R

Junio 15th, 2010 por rvaquerizo

Las máquinas de vectores de soporte, Support Vector Machines, SVM a partir de ahora, son un conjunto de técnicas estadísticas que nos permiten clasificar una población en función de la partición en subespacios de múltiples variables. Parte de la idea de dividir de forma lineal un conjunto de múltiples dimensiones. Creamos muchos hiperplanos que nos dividen las observaciones. Es una técnica que está ganando popularidad y que por supuesto podemos realizarla con R. Para ello tenemos algunos paquetes específicos como kvm, svmlight y el e1071. Este último es al que pretendo acercarme hoy.

El SVM es un algoritmo que, a partir del producto escalar de vos vectores multidimensionales, busca hiperplanos que separen los grupos. La función que define este producto escalar la denominaremos kernel y puede ser lineal, polinómica, radial o sigmoidal. Para clasificación el SVM se plantea como un problema de programación lineal en el que buscamos maximizar la distancia entre categorías sujeto a un coste y a un número óptimo de patrones de entrenamiento. Para entender mejor su funcionamiento trabajamos un ejemplo bidimensional:

#Simulación de un conjunto de datos bivariante
x=c(rnorm(500,1000,100),rnorm(500,2000,200),rnorm(500,3000,400))
y=c(abs(rnorm(500,50,25)),rnorm(500,200,50),rnorm(500,100,30))
grupo=as.factor(c(rep(1,500),rep(2,500),rep(3,500)))
datos=data.frame(x,y,grupo)

Tenemos un data frame con 3 variables, Lee el resto de esta entrada »

Tags: ,

Curso de lenguaje SAS con WPS. Variables

Junio 14th, 2010 por rvaquerizo

El elemento fundamental de los conjuntos de datos SAS son las variables. Ya las hemos referenciado en capítulos anteriores. Éstas pueden ser numéricas o alfanuméricas. Las variables se pueden crear, eliminar o se pueden recodificar. Todo esto siempre lo haremos mediante pasos DATA. Disponemos de un amplio número de funciones para que todas las variables se ajusten a nuestras necesidades.
Las variables tienen los siguientes atributos:

  • Nombre: no pueden exceder de 32 caracteres o empezar por un número ni tener espacios en blanco
  • Tipo: Numérica o alfanumérica ($)
  • Longitud:  máximo 8 bytes para numérica y 1 - 32,000 para alfnumérica
  • Formato salida de la variable: Por defecto para num BEST12. para numéricas y $w. para alfanumérica
  • Formato de entrada: similar al formato de salida
  • Etiqueta

Un tipo muy especial de variable es el valor perdido o missing. Por defecto la representación del missing para una variable numérica es . y ‘ ‘ para una variable alfanumérica. Para todas las variables podemos emplear operadores de comparación (por ejemplo en sentencias IF) y/o operadores lógicos. Los operadores de comparación son:

  • = EQ
  • ^= NE
  • ¬= NE
  • ~= NE
  • > GT
  • < LT
  • >= GE
  • <= LE
  • IN

Los operadores lógicos son:

  • & AND
  • | OR
  • ! OR
  • ¦ OR
  • ¬ NOT
  • ˆ NOT
  • ~ NOT

Variables numéricas:

Son las variables que representan números, son medidas de cada observación de nuestro ataset. Dentro de las numéricas se incluyen las variables de fecha y hora (un tipo muy especial). Su longitud va esde los 2 a los 8 bytes. El formato que tienen por defecto es BEST12. que es el formato de 12 bytes que SAS considera más adecuado para una variable numérica. La forma más común de representar las variables numéricas es w.[d] donde w representa la longitud de la parte entera y d la longitud de la parte decimal. Lee el resto de esta entrada »

Tags:

Macros SAS. Agrupando variables categóricas

Junio 14th, 2010 por rvaquerizo

Agrupar variables con SAS es una de las tareas más habituales. Las variables continuas las agrupamos según un criterio y las discretas, en principio, ya vienen agrupadas. El problema con las variables discretas es que pueden tomar muchos valores, muchos de ellos con poco valor que habitualmente agrupamos en un rango “OTROS”. Pues bien, hoy quería mostraros una macro muy sencilla que utilizo para crear ese cajón desastre. El código tiene algún aspecto muy interesante, es el que os pongo a continuación:

%macro agrupa_frecuencias(entrada=,/*DS DE ENTRADA*/
vargrupo=,/*VARIABLE QUE AGRUPA*/
nombre=count,/*VARIABLE DE FRECUENCIAS*/
numgr=,/*NUMERO DE GRUPOS*/
resto=,/*CATEGORIA RESTO*/
salida=/*DS DE SALIDA*/);
*TABLA DE FRECUENCIAS CON TODOS LOS VALORES;
proc freq data=&entrada. noprint;
tables &vargrupo./list missing
out=&salida. (drop=percent rename=&vargrupo.=agr);
quit;
proc sort data=&salida. ; by descending count;
*EN FUNCION DEL TIPO DE VARIABLE CREAMOS EL RESTO;
data &salida. ;
set &salida. ;
&vargrupo.="&resto.";
if _n_<&numgr. then &vargrupo.=put(left(agr),$10.);
run;
*SUMARIZAMOS;
proc summary sum nway missing; class &vargrupo. ;
output out=&salida. (drop=_type_ _freq_) sum(count)=&nombre.;
quit;
%mend;

Breve explicación del mismo, es un código de ejecución muy rápida y no tiene una calidad de producción como casi todo lo que hacemos los que trabajamos sólo con BASE. Lee el resto de esta entrada »

Tags: , ,

Un homenaje a Malthus con R

Junio 13th, 2010 por rvaquerizo

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[c(16:nrow(poblacion)-1),]
#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 Lee el resto de esta entrada »

Tags: , , , ,

Truco SAS. Duplicar registros si cumplen una condición

Junio 11th, 2010 por rvaquerizo

Mejor que truco, tontería SAS pero sirve para entender mejor el paso DATA. Se trata de duplicar registros si cumplen una condición. Es decir, añadimos una fila en SAS si se cumple la condición:

data uno;
do id_cliente=1 to 10000;
output;
end;
run;
data uno;
set uno;
output;
if mod(id_cliente,2)=0 then output;
run;

No puede ser más sencillo pero me llegó esta duda y me parece un buen ejemplo de uso de OUTPUT.

Tags:

Excelente descripción de los PIAS

Junio 11th, 2010 por rvaquerizo

Leído en Bancos y Cajas On Line:

 http://www.bancosycajasonline.com/2010/06/09/planes-individuales-de-ahorro-sistematico-pias/


Hoy repasamos los planes individuales de ahorro sistemático (PIAS), que son productos financieros con formato de seguro de vida ahorro, comercializados por entidades bancarias y de seguros, que permiten recibir una renta mensual vitalicia, por un importe conocido de antemano y que cobraremos cuando nosotros decidamos. Además podemos hacerlos líquidos en cualquier momento

Recomendable lectura.

Tags: