MATRICES en R

Hay varias formas de definir una matriz

>matrix(x, nrow, ncol)
Donde x es una secuencia de elementos
nrow es un número o define el número de filas en la matriz
ncol es un número o define el número de columnas en la matriz
Definamos un vector de 12 elementos para luego definir una matriz con dichos elementos
>x=1:12
Ahora la matriz de 3 filas con 4 columnas
>matrix(x,ncol=4,nrow=3)
La misma se puede definir usando
>matrix(x,4,3)
Otra forma de hacerlo
>matrix(c(1:12),6,4)
Estos formatos permiten definir la matriz por columna
El siguiente, por fila
>matrix(x,ncol=4,nrow=3,byrow=T)

Los valores de x podemos definirla en forma directa, ingresándolos por teclado:
>x=scan()

Al presionar [Intro], en la siguiente línea aparece “1:”, en el cual ingresamos el valor. Así hasta completar los elementos de x. Al final se debe presionar para dar por terminado.

Nota:

Puede ser que los elementos de x no cubran para definir una matriz mxn, en ese caso se define la matriz, pero emite un “warning” (alerta).

También podemos definir una matriz usando la función scan().

>y=matrix(scan(),3,2)

Podemos saber el número total de elementos en la matriz con >length(y)
Podemos saber la dimensión de la matriz con >dim(y)
Del mismo modo, podemos saber el tipo de matriz con >mode(y).

Sabemos que se debe ingresar 6 elementos, pero si se ingresa más, descarta los restantes.
 

Si se dispone de vectores, también podemos definir matrices con ellos.

> c1=c(4,6,5,8)
> c2=c(5,7,3,4)
> c3=c(12,15,18,11,13)
> c4=c(121,432,837,376)

Si observamos el vector c3 veremos que tiene un elemento más. Supongamos que el error es que 18 no debe estar. Para ello debemos eliminarlo:

>c3=c3[-3]


Se puede definir una matriz por columna usando estos vectores.
> ma=cbind(c1,c2,c3,c4)
O por fila
>ma=rbind(c1,c2,c3,c4)

Si sólo queremos una matriz ma(2x12): >ma=rbind(c1,c3)
Una matriz de 3 columnas con 12 filas: >ma=cbind(c1,c3,c4)

Para hacer referencia a una fila: >ma[2,]
Para hacer referencia a una columna: >ma[,3]
Para modificar el valor de un elemento: >ma[i,j]=nuevoValor. Ejemplo: >ma[3,1]=0
 

Operaciones matriciales

Definamos dos matrices 4x3
> a=matrix(sample(10:20,12,rep=T),3,4)
> b=matrix(sample(10:20,12,rep=T),3,4)
Suma de matrices:
>c=a+b
>c=a-b
>c=a*b
(multiplica a(i,j) con b(i,j))

La multiplicación de matrices debe cumplir con a(nxm) *b(m,p) y se multiplica usando
>c=a%*%b (siempre que a y cumpla con lo dicho en la línea anterior).

Transpuesta de una matriz: >t(a)

Que tb sea la transpuesta de b: >tb=t(b)

Multiplicación matricial de a con la transpuesta de b:
>a%*%tb

Lo guardamos en c: >c=a%*%b
Matriz inversa: >solve(c)
Lo guardamos en ic: >ic=solve(c)
Verificamos si es la inversa de c: >c%*%ic

Operaciones por fila o columna
Estadísticas por fila: Sea a la matriz nxp

La media de las filas: >apply(a,1,mean)
La media de las columnas: >apply(a,2,mean)

Podemos obtener: la varianza y raíz cuadrada con
>apply(x,2,var) y >sqrt(apply(x,2,var))
 

Las filas y columnas de una matriz pueden tener nombres en su primera fila o columna para, definir una tabla de contingencia, por ejemplo.

Esto lo veremos en manejo de Listas.

Más sobre matrices

Definir matrices: a, b de 5x4 con (sample); c, d de 5x5 (con runif), e de 3x5 con sample > a=matrix(sample(20),4,5)

> b=matrix(sample(20),4,5)
> c=matrix(runif(25),5,5)
> d=matrix(runif(25),5,5)
> e=matrix(sample(15),3,5)
Ahora otras formas de definir matrices
>x=c(12,14,08,05,11,10,8,14,12,15,11,16,10,16)
>y=c(235,346,543,873,654,800,368,865,386,903,685,855)
La longitudes de x es 14 y de y es 12.

Si deseamos definir matrices de 3x4, en x sobran dos elementos. Vamos a eliminar el cuarto y el ultimo

>x=x[-4]
>x=x[-13]

Definiremos las matrices mx y my de tamaño 3x4
>mx=matrix(x,3,4)
>my=matrix(y,3,4)
Mostrar la longitud de mx
Mostrar la dimensión de mx
Matriz transpuesta de a
>ta = t(a)
 

Podemos extraer una determinada fila o columna de una matriz y dejarlo en un vector

>f3=a[3,]
>c2 = a[2,]

Operaciones de matrices
>a+b

Multipliquemos a por x y luego, a por su transpuesta para guardarlo en pa.
>x%*%a
>pa=a%*%t(a)

Podemos obtener las diagonales de la matriz c y d
>diag(c)
>diag(d)

Inversa de una matriz

Hallemos la inversa de c
>ic=solve(c)
Para comprobar, puesto que una matriz por su inversa es la matriz identidad,
>i=c%*%ic
Podemos sumar todos los elementos de i y debe sumar 5
>sum(i)

Otra forma de definir una tabla de contingencia o una tabla de doble entrada con x e y

> lx=matrix(x,3,4,dim=list(c("Ene","Feb","Mar"),c("Trim 1","Trim 2","trim 3","Trim 4")))
> lx
 

Uso del paquete ggplot2

Vamos a realizar diferentes tipos de gráficos ya vistos, usando la librería llamada ggplot2

Empezamos cargando el paquete: [Paquete] – [Cargar paquete] - Seleccionamos de la lista – ggplot2 – [Ok]

Si no estuviera disponible, debemos empezar instalándolo con [Paquete] - [Instalar paquete]…

Veamos si están los datos cars, mtcars, iris

>head(iris)
>head(mtcars)
>head(cars)
 

El uso de las funciones contenidas en el ggplot2 requiere que los datos tengan estructura de data.frame. Vemos cómo podemos reconocerlos:


>x=seq(-6.28,6,28,0.05)
>y=sin(x)

Para ver si y es data.frame (estructura de hoja de datos) usamos el comando:

>is.data.frame(y)
Si el resultado es FALSE entonces no tiene dicha estructura, pero sí se puede graficar
>plot(x,y)
Ahora veamos si algunas de los tres objetos mencionados arriba, son data.frame
>is.data.frame(cars)
El resultado será TRUE

Usaremos la función qplot()

Esta función es similar a plot() en la creación y combinación de gráficos de manera sencilla. Sin embargo, es más flexible y con mayores opciones.

Los datos deben tener una estructura de data.frame, en donde las columnas son las variables y la filas constituyen las observaciones de cada elemento o individuo. Por ejemplo, en mtcars observamos que cada fila contiene una marca de vehículo y cada columna lo describe. En el caso de Mazda RX4, recorre 21 millas por galón, tiene 6 cilindros, pesa es de 2.62 toneladas, …

Sintaxis:

qplot(x, y – NULL, data, geom=”auto”, xlim=c(NA, NA), ylim =c(Na, NA))

donde x e y son los valores a ser ploteados (y es opcional)
data: es el data.frame a ser usado
geom: es el vector de tipo de trazado. Si se especifica x e y se usa point si sólo está x se usa histograma.
xlim y ylim son los límites de los ejes.
 

Ejemplo 1

Usando x e y definidos arriba, podemos repetir plot() y saber la diferencia en el uso de geom.

>qplot(x,y)
>qplot(y)
>qplot(x,y,geom=c(“point”,”line”))

Diagrama de dispersión (scatterplot)

Usemos los datos de mtcars
>data(mtcars)
>mtcars

De todas las columnas que tiene, extraigamos sólo “mpg”, “cyl: y “wt” y lo dejamos en fd.

Pero se puede usar todo mtcars, como lo veremos.

>df = mtcars[, c(“mpg”,”cyl”,”wt”)]
>head(df)
> qplot(mpg,wt, data=df)

Otra forma de hacer lo mismo, visto antes

> qplot(mtcars$mpg,mtcars$wt)
¿Qué ocurre con cyl y wt?

Suavizamiento mediante una estimación polinomial

> qplot(mpg, wt, data = mtcars, geom = c("point", "smooth"))

Uso de una variable de agrupación

Se puede usar el atributo color definido según la nueva variable para distinguir grupos en el diagrama

>qplot(mpg, wt, data=mtcars, colour=cyl)

Esto puede server si tuviéramos que agrupar elementos (filas) en el caso del análisis multivariado: método de conglomerados. Hay dos grupos de vehículos: Los que privilegian mayor millas por galón, deben tener menor peso.

Ahora tracemos la gráfica agrupando con cyl definido como factor

> qplot(mpg, wt, data=mtcars, colour=factor(cyl),geom=c("point","smooth"))

Así como se usa el color para agrupar datos, podemos cambiar el sombreado y el tamaño de los puntos en la gráfica.

>qplot(mpg, wt, data=mtcars, size=mpg)
Mayor es la diferencia si se usa la variable cyl como tamaño.
>qplot(mpg, wt, data = mtcars, shape = factor(cyl))

Obsérvese la formación de los tres grupos. Esto por cuanto cyl ha sido usado como factor o variable categórica.

Introduciendo texto al gráfico

El uso de la variable continua cyl para distinguir los grupos, nos sugiere insertar texto como etiqueta de cada punto en el gráfico.

> qplot(mpg, wt, data=mtcars, label=rownames(mtcars), geom=c("point","text"), hjust = 0, vjust = 0)
 

Si hubiera menos datos o los nombres repetitivos, se apreciaría mejor. El Lincoln y el Cadillac, son vehículos más pesados y por tanto recorren menos millas por galón.

Gráficos de caja, puntos

Usemos ahora otros datos incluidos en R: PlantGrowth. Datos que permite comparar el rendimiento de plantas por el peso seco de las mismas usando dos controles y un tratamiento.

Vamos a obtener una copia ara facilitar el uso de su nombre

>pg=PlantGrowth
>head(pg)

Diagrama de caja usando la variable de agrupación group.

> qplot(group, weight, data=pg,geom=c("boxplot"))
 

Diagrama de puntos

> qplot(group, weight, data=pg,geom=c("dotplot"),stackdir="center",binaxis="y")

Usando colores

> qplot(group, weight, data=pg,geom=c("dotplot"),stackdir="center",binaxis="y",colour=group)
 

Rellenemos de color las cajas

> qplot(group, weight, data=pg,geom=c("boxplot"),fill=group)
Visualizando los puntos
> qplot(group, weight, data=pg,geom=c("boxplot","jitter"),fill=group)

Ahora en cuanto al gráfico de puntos
> qplot(group, weight, data=pg,geom=c("dotplot"),stackdir="center",binaxis="y", colour= group,fill=group)
 

En resumen

Opciones y argumentos principales que podemos añadirle a cada gráfico

• add= FALSE (defecto): Si es TRUE superpone el gráfico en el ya existente.
• axes= TRUE (defecto): si es FALSE no dibuja los ejes ni la caja del gráfico.
< • type=”p” (defecto): especifica el tipo de gráfico por ejemplo p= puntos, l= lineas, b= puntos conectados por lineas, h= lineas verticales.
• xlim=, ylim=: especifica los límites inferiores y superiores de los ejes; por ejemplo con xlim=c(1,5) o xlim=range(x) • xlab=” ”, ylab=” ”: añade los títulos a los ejes.
• main=” ”: añade el título principal. • sub=” “: añade un subtitulo (letra más pequeña)
• col=: elegimos el color que deseamos para cada objeto.

La siguiente es una lista de los colores disponibles que se pueden usar en un gráfico:

>colors()

Ejemplo 2

Supongamos que se registra vehículos que se estacionan al frente de una bodega, durante una semana de domingo a sábado.

Tomemos como datos las siguientes variables:

> autos = c(1, 3, 5, 5, 4, 9, 7)
> camiones = c(2, 4, 4, 3, 5, 5, 11)
> motos = c(1, 3, 3, 4, 3, 9, 14)

Vamos a plotear la variable autos:
>plot(autos)

Agreguemos tipo de gráfico y color
>plot(autos, type="o", col="blue")

Añadimos un título en color rojo y letra cursiva/negrita.
>title(main="Autos", col.main="red", font.main=4)

Añadiremos ylim en el eje Y como el rango (0, 11)
> plot(autos, type="o", col="blue", ylim=c(0, 11))

Trazaremos la gráfica de la variable camiones en línea punteada, roja y puntos cuadrados (pch = 22, indica la forma de unir los puntos; lty = 1, línea continua, =2, guiones, =3, puntos)

> lines(camiones, type="o", pch=22, lty=2, col="red")

Ahora los títulos
> title(main="Autos", col.main="red", font.main=4)


Ahora añadiremos etiquetas de los ejes, de leyenda y el rango del eje X.

Definimos el rango para los máximos tomando a los vectores auto y camiones

> rango = range(0, autos, camiones)

Graficamos autos, en el eje Y, el rango de 0 al máximo de autos o camiones. Además, cerramos las etiquetas de los ejes y las anotaciones (axes, ann) para poner los que deseemos.

> plot(autos, type="o", col="blue", ylim=rango, axes=FALSE, ann=FALSE)
Definiremos en el X etiquetas con los días de la semana.
>axis(1, at=1:7, lab=c("Lun", "Mar", "Mie", "Jue", "Vie", "Sab", "Dom"))


Vamos a crear una caja alrededor del gráfico.
> axis(2, las=1, at=rango[2])
> box()

Volvemos a dibujar camiones.
> lines(camiones, type="o", pch=22, lty=2, col="red")
Insertamos el título
> title(main="Autos", col.main="red", font.main=4)
Etiquetamos los ejes X e Y en color verde.
> title(xlab="Días", col.lab="green2")
> title(ylab="Total", col.lab="red2")

Añadiremos una leyenda al gráfico utilizando el tipo de línea y colores del gráfico.

>legend(1, rango[2], c("autos", "camiones"), cex=0.8, col=c("blue", "red"), pch=21:22, lty=1:2)
 

Diagrama de barras

Ante todo, debemos crear una hoja de datos con las tres variables. Esto es, debemos definir un data.frame

>df=data.frame(autos, camiones, motos)
>df

Veamos un diagrama de barras para la variable autos
>barplot(autos)

Ahora vamos a añadir etiquetas, bordes en las barras y densidad de trazado en las barras

> barplot(df$autos, main="Autos", xlab="Días", ylab="Total", names.arg=c("Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"), border="blue", density=c(10,20,30,40,50,60,70))

Tracemos un diagrama de barras para las tres variables para comparar el número de vehículos por día a partir del data.frame definido como una matriz.

> barplot(as.matrix(df), main="Autos", ylab="Total", beside=TRUE, col=rainbow(7))
 

Además incluiremos la leyenda.

> legend("topleft", c("Lun", "Mar", "Mie", "Jue", "Vie", "Sab", "Dom"), cex=0.6, bty="n", fill=rainbow(7))

Ahora mostremos una gráfica de los 7 días, apilando las variable por día; esto es lo que se llama gráfico de barra apiladas. Para ello, usaremos las variables como fila; para lo cual, usaremos como dato a graficar, la transpuesta del data-frame con t(df).

> barplot(t(df), main="Autos", ylab="Total", col=heat.colors(3), space = 0.1, cex.axis=0.8, las=1, names.arg=c("Lun","Mar","Mie","Jue","Vie", "Sab", "Dom"), cex=0.8)

Colocamos la leyenda. El argumento cex nos muestra el tamaño del recuadro de la leyenda.

El argumento fill permite colocar un relleno a las barras.

> legend(3, 30, names(df), cex=0.8, fill=heat.colors(3))
 

Otros tipos de gráfico en término de funciones como repaso

Gráfico de flores y pétalos: sunflowerplot()

Ejemplo 3

> x = c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3)
>y = c(2,2,2,3,3,3,4,4,4,5,5,5,5,2,2,2)
Mostremos como puntos (x,y) usando data.frame
>data.frame(x, y)

El número de veces que se repite el par, determinará el número de pétalos de la flor.

> sunflowerplot(x,y)
 

Un ejemplo de gráfico de torta pie()

Supongamos que se ha registrado el consumo semanal de café en una empresa de 45 trabajadores. Los datos son los siguientes:

>cafe = c(54, 60, 18, 58, 80)
Etiqueta de dia
>dia= c("Lun", "Mar", "Mie", "Jue", "Vie")

Tomemos el porcentaje de tazas de café por día, redondeado a 2 decimales
>pc = round(cafe/sum(cafe)*100,2)

Para usar como etiqueta estos porcentajes, definimos etiqueta, le añadimos “%”, sin separación.

>lab = paste(pc, “%”,sep=””)
Trazamos la gráfica
> pie(cafe,labels =lab)
Le añadimos colores de relleno
> pie(cafe,labels =lab, col=c("yellow", "violetred1", "orange", "green", "red"))

Le añadimos título central y un subtítulo
> pie(cafe,labels =lab, col=c("yellow", "violetred1", "orange", "green", "red"),main="Consumo diario de café",sub="Nro de tazas")

Vamos a hacer uso de paste para añadir a los días, la cantidad de café consumido
> dia=paste(dia,cafe, sep=":")
Añadimos la leyenda

> legend("topleft", c(dia), cex=0.6, bty="n", fill=c("yellow", "violetred1", "orange", "green", "red"))
 

Continuaremos en la siguiente sesión