Manual de R (2016)

Apunte Español
Universidad Universidad de Lleida (UdL)
Grado Biotecnología - 1º curso
Asignatura Bioestadística
Año del apunte 2016
Páginas 8
Fecha de subida 02/04/2016
Descargas 47
Subido por

Descripción

Manual para el programa de R de las funciones que se han dado en clase.

Vista previa del texto

Héctor Escribano R project ¿Qué es R, cómo funciona y como hablarle para que nos haga caso? R es un programa que nos permite realizar cálculos complejos, tablas, matrices, gráficos y análisis estadístico con sus múltiples herramientas. La única “desventaja” que tiene es que al ser un software libre su interfaz no es parecida a los programas que estamos habituados a utilizar. Para ello tendremos que aprender a decirle a R lo que queremos que haga por nosotros, pero en su idioma. No hay que estresarse si a la primera cosa que le decimos no nos entiende, pues es como un extranjero al que hay que hablarle poco a poco, despacio y correctamente para que nos entienda. Conozcamos R y veamos que puede hacer R por nosotros y cómo se lo podemos pedir.
Cuando abrimos R se nos abre una pantalla grande, con una ventana un poco más pequeña en el margen izquierdo. Esa es la consola. La consola nos sirve para decirle a R lo que queremos, se lo diremos mediante comandos. Seremos los comandantes de R y R es el ejército que espera nuestras órdenes. Los comandos que ejecutamos en la consola no pueden ser guardados para poder volverlos a ejecutar, por eso usamos el script. El Script es otra ventana en la que podemos escribir el texto que nosotros queramos. La ventaja del Script es que podemos escribir tanto comandos para R como anotaciones para nosotros. Pero tenemos que decirle a R que es que, porque él no lo puede distinguir. Para ello, cada vez que queramos añadir una anotación pondremos un hashtag (#) seguido del texto que queramos recordar. Los comandos no necesitan de ningún símbolo que los identifique. Los comandos se pueden agrupar mediante { y }, separar mediante ; o nuevas líneas. Para ejecutar un comando que hayamos escrito en el script sólo debemos poner el cursor en la línea que contiene el comando, o seleccionarlo entero y pulsar F5. Enter no funciona, solo sirve para añadir una nueva línea. Cuando R lea un comando y lo encuentre incompleto nos retornará en la consola un sigo de suma +. Si el comando contiene algún error de sintaxis o alguna orden que no existe, nos retornará un error. R es muy tiquismiquis con la forma de escribir: “Hola” no es lo mismo que “hola”, eso hay que tenerlo muy presente.
Las funciones que R puede llevar a cabo son “limitadas” y por eso cabe la posibilidad de agregarle funciones. Esas funciones se encuentran en las librerías y paquetes. Al instalar un paquete y cargar una librería, le enseñamos nuevas funciones a R, que hasta entonces no podía entender ni realizar.
¿Qué podemos hacer en R? Podemos asignar vectores, dando una serie de valores a una incógnita.
X<-c(1,2,3,4,5,6,7) X es un vector de 7 componentes Patata<-c(7,6,5,4,3,2,1,0) Patata es un vector de 8 componentes Si queremos saber cuál es el valor que ocupa la posición número tres de Patata, usaremos: Patata[3] y se nos devolverá un 5 Patata[2:5] nos dará 6 5 4 3 X[4]+Patata[3:6] nos dará 9 8 7 6 Héctor Escribano R project Podemos realizar otras funciones con vectores: max(X) nos dará el valor más grande de todo el vector X. Existe min, length (cantidad de variables del vector), sum (suma de todos los valores), log, tan, sin, cos, sqrt, exp…. Etc.
También podemos realizar secuencias y/o repeticiones numéricas.
rep(1,10) nos repite el numero 1 diez veces seq(1,2,0.1) nos dará una secuencia que cuenta de 1 hasta 2 de 0.1 en 0.1 seq(0,100,25) contará de 0 a 100 de 25 en 25 También se pueden hacer repeticiones de secuencias o secuencias de repeticiones, sumas de repeticiones, e infinitas combinaciones, siempre que sean matemáticamente factibles.
Pasemos a la estadística.
Dos funciones estadísticas de R son la Variancia var (x) y la Mediana mean (x).
La Mediana se define como sum(x)/length(x) La Variancia como sum((x-mean(x))^2/(length(x)-1) La función rnorm(a,b,c) nos generará “a” datos aleatorios cuya mediana sea “b” y cuya desviación estándar sea “c”.
Podemos crear funciones que no existen en el entorno de R, definiéndolas manualmente. Es decir, si queremos crear una función que nos lo sume todo, eleve la suma al cuadrado y le reste la cantidad de números que tiene el vector: funcioninventada<- function(x) ((sum(x))^2)-lenght(x) Hay que decirle que la función depende de x. Si dependiera de R,S y T habría que ponerle function(R,S,T).
Cuando queremos ver los resultados en forma de tabla se utiliza la función data.frame. Los dataframes ordenen las variables y sus valores por filas y columnas, dándonos una visión mucho más clara de los datos que queremos visualizar.
También podemos crear una database manualmente utilizando la función data.frame.
db<- data.frame( Noms = c("Albert", "Maria", "Joan"), Cognoms = c("Pelayo", "Patata", "Maravilla"), Edat = c(56,12,8), Pes = c(84,15,32)) db[nºfila, nºcolumna] Nos dará qué valor hay en la posición de la tabla que le digamos.
Héctor Escribano R project db[db$Edat>60,] Nos devolverá la cantidad de gente que es mayor de 60 db[db$Edat<30,] Nos dirá quiénes son menores de 30 db[db$Pes>16 & db$Pes<95,] Te dice quién pesa entre 16 y 95 db[db$Pes>40 | db$Edat>20,] Te dice quién es mayor de 20 o pesa más de 40. Aparecerá aunque solo cumpla una de las condiciones.
Cuando tenemos un rango muy grande de datos y solo nos interesa una parte de éstos, como por ejemplo los menores de 40, podemos crear un subespacio de trabajo en que todos los sujetos sean menores de 40.
subset(db,Edat<40) summary(db) La función summary te muestra diferentes características estadísticas de tu base de datos: minimos y máximos, medias, medianas, cuartiles… head(db,n=10) Te muestra las 10 primeras filas de datos Si queremos añadir una nueva variable a nuestra base de datos no hace falta crear una nueva, basta con crear una nueva variable en el dataframe ya existente: db$Altura<-c(1.75,1.80,1.60) Nos añade la variable Altura y asigna los valores por orden Podemos añadir una variable que sea función de otras ya existentes en el database.
db$IMC<- (db$Pes)/((db$Altura)^2) head(db, n=3) y nos devuelve lo siguiente: Noms Albert Maria Joan Cognoms Pelayo Patata Maravilla Edat 56 12 8 Pes Altura 84 1.75 15 1.80 32 1.60 IMC 27.42857 4.62963 12.50000 Creación e Importación de bases de datos a R En lugar de introducir los datos manualmente, podemos importar a R bases datos de páginas web en formato txt así: Directori <- "http://web.udl.es/Biomath/Bioestadistica/Bases%20de%20dades/Calcium.txt" dd<-read.table(Directori) Si entre paréntesis no se añade ningún condicionamiento más puede que R interprete mal la tabla.
dd<-read.table(Directori,header=T, sep="\t", dec=".") Con header=T se le dice que la tabla tiene un encabezado y que debe coger la primera fila de datos como los títulos de dichos encabezados. Se le indica que la separación entre valores es el tabulador y que el decimal lo marca en punto.
Héctor Escribano R project También podemos importar una base de datos de nuestro ordenador mediante el directorio en el que se encuentra y definiendo los mismos parámetros de lectura que antes.
Directori2 <- "F:\\Calcium.txt" dd2<-read.table(Directori2, header=T, sep="\t", dec=".") head(dd2) Te mostrará el cabecero de la database names(dd2) Te muestra el nombre de las variables contenidas en la base de datos Recodificación de variables summary(dd2) Hay veces que al hacer summary nos damos cuenta que algo no va bien, que nos hace medias de colores o de razas, o que nos hace desviaciones estándares de si la gente fuma o no. Este tipo de Variables no son cuantitativas, son cualitativas o binomiales, pero R las detecta mal. Otras veces vemos que no detecta bien los missing, para arreglarlo, añadimos otro condicionamiento. En este caso el missing se representa con un punto.
dd2<-read.table(Directori2, header=T, sep="\t", dec=".", na.string=".") summary(dd2) Ahora sí que nos retorna las variables como toca, a excepción de la edad y del sexo, que continua marcándolos como cuantitativos. Pero hemos logrado que nos diga si hay missings y que los sepa leer correctamente.
Para arreglar las variables hay que factorizarlas. Las variables se pueden factorizar encima de las ya existentes o añadir la variable factorizada a la base de datos. La segunda opción es más recomendable, ya que así no perdemos datos y podemos rectificar en caso de error.
dd2$SexF<-factor(dd2$Sex, labels=c("Male","Female")) dd2$LabF<-factor(dd2$Lab, labels=c("Metpath","Deyor","St. Elizabeth's","CB Rouche", "YOH", "Horizon", "Unknown")) Así hemos factorizado las variables de Sexo y de Laboratorio, pero para asegurarnos, lo comprobamos.
summary(dd2) Podemos visualizar una tabla con los elementos de una variable o una que nos diga cuantos casos hay de cada cosa con la función table. El resultado dependerá de si es una variable cuantitativa o una variable cualitativa.
table(dd2$SexF) Nos dice cuanta gente es de sexo masculino y cuanta femenino pie(table(dd2$SexF)) Nos dibuja un diagrama de sectores con la tabla anterior, en la que se puede distinguir cuanta gente hay de cada sexo dd2$AlkPhos.G1<-cut(dd2$AlkPhos,3) Te divide la variable en tres grupos iguales, el número que hay detrás de la coma. Haciendo servir el rango de valores, te divide dejando la misma cantidad de valores en cada grupo.
Héctor Escribano R project summary(dd2$AlkPhos.G1) Como nuestros datos no están centralizados, podemos definir nosotros los puntos de corte en los que queremos que R nos divida el grupo. Para eso cortamos con un vector.
dd2$AlkPhos.G2<-factor(cut(dd2$AlkPhos,c(0,90,300)),labels=c("L","H")) Y luego podemos dibujarlo para verlo gráficamente.
table(dd2$AlkPhos.G2) pie(table(dd2$AlkPhos.G2)) Visualización gráfica de los datos No sólo podemos dibujar gráficos de sectores, sino que tenemos diferentes formas gráficas de representar datos, cada una con sus ventajas y sus inconvenientes. Existe la función hist() que nos hace un histograma, la curve() que nos hace una curva, la función pie() que nos hace un diagrama de sectores, los boxplot(), barplot(), etc… La función curve nos permite crear curvas a partir de ecuaciones, cambiar el color de la línea, cambiar el tipo de línea, su grosor, los límites de representación, etc… curve(x^3-3*x, -10,10) curve(x^4-2,add=TRUE, col="lightblue") curve(x^2-2,add=TRUE, col="blue") Con el parámetro ADD añadimos la curva al gráfico anterior, en vez de eliminar el antiguo y crear uno nuevo. Útil para comparar.
Menten<-function(S,Vm,Km) Vm*S/(Km+S) Menten(5,18,3) curve(Menten(S,10,3),0,50) R está programado para hacer servir la x como variable, por lo que la S no la reconoce.
curve(Menten(x,10,3),0,50) Si ponemos una x en ligar de la S, R no lo puede calcular ya que nuestra función no tiene la variable x.
Para solucionarlo, añadimos un parámetro diciéndole que el nombre de la variable será S.
curve(Menten(S,10,3),0,50, xname="S") Así le definimos el nombre de la variable con la que queremos trabajar.
curve(Menten(S,15,5),0,50, xname="S", add=TRUE, col="maroon") Nos añades una nueva gráfica, encima de la otra, pero de color granate.
Se pueden establecer los límites en los que quermos que la variable se represente a lo largo del eje de las x y de las íes.
curve(Menten(S,10,3),0,50, xname="S", xlim=c(0,100)) curve(Menten(S,15,5),0,50, xname="S", add=TRUE, col="maroon",xlim=c(0,100)) Héctor Escribano R project Podemos añadir muchos más parámetros para adornar nuestro gráfico.
curve(Menten(S,10,3),0,50, xname="S", xlim=c(0,100), col="darkgreen",main="MichaelisMenten kinetic function",cex.main=2,col.main="orange", xlab="Concentration" ,ylab="rate", cex.lab=1.5,col.lab="brown") Cex es el tamaño y col el color, xlab permite asignar el nobre del eje x, y lab el de las y. Main es el título y lab son los labels, las etiquetas de cada eje.
Para añadir puntos al gráfico: concentracio<-seq(0,20,0.5) Así definimos un vector de concentraciones velocitat<- Menten(concentracio,10,3) Calculamos las velocidades dependiendo de la concentracion points(concentracio,velocitat) Dibujamos los puntos en el gráfico, con la concentración y la velocidad como variables.
También podemos añadir líneas para encuadrar el gráfico y ayudarnos a saber con qué valores estamos tratando, más fácilmente.
abline(h=c(5,8),lty=4,col="blue") Nos coloca líneas horizontales a 5 y a 8, de puntitos y de color azul abline(v=seq(0,20,5),lty=2,col="red") Líneas cada 5, rojas y con otro tipo de puntos.
Dependiendo del número que se le dé a lty, nos aparece un tipo de línea u otro.
Función plot Además de utilizar curve y points para dibujar un gráfico, podemos utilizar plot, que lo hace todo en la misma función. Para ello volvemos a escribir la ecuación que queremos representar y hacemos lo siguiente: Menten<- function(S,Vm,Km) S*Vm/(Km+S) concentracion<- seq(0,20,0.5) vel<- Menten(concentracion,10,2) plot(concentracion,vel) Para ver lo que podemos hacer con la función plot vamos a cargar una nueva base de datos.
Esta vez la base de datos no se encuentra ni en nuestro ordenador en formato txt ni en un servidor externo, sino que se encuentra en una de las librerías de R. Llamamos a la librería y cargamos la base de datos. Queremos encontrar de qué manera podemos extraer información valiosa de la base de datos.
library(Hmisc) data(Puromycin) summary(Puromycin) Puromycin[1:8,] Nos da las ocho primeras filas. Es lo mismo que usar head(Puromycin, n=8) Héctor Escribano R project Representamos una variable, luego otra, y luego las dos a la vez (una frente a la otra). Pero no se saca nada en claro aún. Vemos que los puntos están como duplicados.
plot(Puromycin$conc) plot(Puromycin$rate) plot(Puromycin$rate,Puromycin$conc) Creamos un subset con aquellos que están tratados y aquellos que no lo están, de la siguiente manera: PuroA <- subset (Puromycin, state=="treated") PuroB <- subset (Puromycin, state=="untreated") hist(Puromycin$rate) hist(Puromycin$conc) Con un histograma tampoco no se ve demasiado claro.
hist(Puromycin$rate) with(Puromycin,hist(rate)) Ambos comandos tienen el mismo resultado.
with(Puromycin, hist(rate, probability=TRUE, nclass=5)) Con nclass establecemos la cantidad de barras del histograma.
table(Puromycin) table(Puromycin$state) barplot(Puromycin$state) barplot(table(Puromycin$state)) pie(table(Puromycin$state)) Así vemos la cantidad de tratados y de no tratados en el ensayo.
plot(Puromycin$rate~Puromycin$conc) Delante de ~ se pone la variable dependiente y detrás la independiente y es igual a: plot(Puromycin$rate,Puromycin$conc) plot(PuroA$rate~PuroA$conc) Al haber creado los subsets, ahora los gráficos nos salen con solo unos de los puntos, desaparecen esas parejas que veíamos en otros gráficos anteriores.
boxplot Nos sirve para representar una variable cuantitativa enfrente de otra cualitativa.
with(Puromycin, boxplot(rate, data = PuroB, ylab="rate")) boxplot(rate~state, data = Puromycin, col=grey(c(0.6,0.9))) Ambos comandos crean un boxplot para el rate, el primero solo el rate y el segundo el rate separando aquellos tratados y los no tratados.
Héctor Escribano R project Importación de base de datos desde Excel, formato csv.
dir<-"C:\\Users\\alumnes\\Desktop\\lowbwt.csv" low<-read.csv2(dir, header=TRUE) head(low) summary(low) Factorizamos las siguientes variables, ya que no son cuantitativas.
low$RACE low$race<-factor(low$RACE, labels=c("White","Black", "Other")) low$htens<-factor(low$HT, labels=c("Yes", "No")) low$smoke<-factor(low$SMOKE,labels=c("Yes","No")) Creamos un subset para comparar dos de las etnias.
wblow<-subset(low, low$race=="White"|low$race=="Black") Comprobamos que el subset se ha creado correctamente.
summary(wblow) Creamos un histograma, con 20 barras y le añadimos una línea de densidad ara visualizar más correctamente los picos de peso de los bebés.
hist(wblow$BWT, breaks=20, col="maroon", prob=TRUE) lines(density(wblow$BWT),col="gold", lwd=10, lty=1) par(mfrow=c(1,2)) Con este comando conseguimos que la ventana en la que se nos muestran los gráficos, se muestren una fila de dos gráficos. Dependiendo del vector que pongamos podemos variar el número de filas disponibles o el número de columnas.
dw<-subset(wblow,wblow$race=="White") db<-subset(wblow,wblow$race=="Black") hist(dw$BWT, prob=T,breaks=20, col="maroon", xlab="Dona Blanca") hist(db$BWT, prob=T,breaks=10, col="light green", xlab="Dona Negra") Creamos dos subsets nuevos, y representamos sus histogramas para poder comparar en dos gráficos diferentes a las dos etnias.
También podemos crear un gráfico en que se solapen ambos. En lugar de tenerlos separados, ponerlos ambos en el mismo eje de coordenadas. Para ello, hacemos que los colores sean translúcidos, para que también se vea al color del gráfico que quede atrás. Lo hacemos mediante el vector rgb=c(red,green,blue,transparency).
hist(dw$BWT, prob=T,breaks=20, col="rgb"(0,0,1,1/4), ylim=c(0,0.001)) hist(db$BWT, prob=T,breaks=10, col="rgb"(0,1,0,1/4), add=TRUE) ...