Uso de herramientas informáticas para la recopilación, análisis e interpretación de datos de
interés en las ciencias biomédicas
Módulo 1 – clase 8
Tabla de contenidos
Estadísticas de filas y columnas de [Link] y matrices.................................................................1
[Link]()....................................................................................................................................3
[Link]()...................................................................................................................................4
[Link]ón de objetos con secuencias numéricas.............................................................................4
[Link]()....................................................................................................................................4
[Link]()....................................................................................................................................5
[Link]ón secuencias con distribuciones aleatorias uniformes y normales............................6
[Link]().................................................................................................................................6
[Link]()...............................................................................................................................6
[Link]ón de funciones de inicio......................................................................................................9
3.1..First ...........................................................................................................................9
[Link]..................................................................................................................................................9
Estadísticas de filas y columnas de [Link] y matrices
En clases anteriores hemos utilizados estadísticas de filas y columnas. Revisemos estos conceptos
para luego introducir otros.
Ingresamos al espacio de trabajo la tablaR181 de la planilla de cálculo [Link]/xls que usted
dispone para esta clase.
> tablaR181<-[Link]("clipboard",header=TRUE,dec=",",sep="\t")
> tablaR181
peso edad sexo
1 53 25 f
2 58 26 f
3 59 24 m
4 96 59 m
5 78 54 m
6 98 56 m
7 58 58 f
8 59 58 f
9 85 59 f
10 58 53 m
11 84 65 f
12 85 56 m
13 59 54 f
14 85 45 m
15 48 45 m
16 58 48 m
pedimos como es adecuado para asegurarnos de la importación de los datos, un summary()
> summary(tablaR181)
peso edad sexo
Min. : 48.00 Min. :24.00 f:7
1st Qu.: 58.00 1st Qu.:45.00 m:9
Median :59.00 Median :54.00
Mean : 70.06 Mean :49.06
3rd Qu.: 85.00 3rd Qu.:58.00
Max. : 98.00 Max. :65.00
Es lo que esperamos de la importación! A continuación haremos uso de algunas funciones y
comprobaciones.
Haremos antes de iniciar la clase de hoy un breve repaso de funciones aprendidas. A continuación
usted recibe en cada ítem la indicación de hacer algo y deberá elegir la función adecuada. Si no la
recuerda hallará las mismas al final de este documento.
1
- compruebe que tablaR181 es un [Link].
2
- compruebe que el [Link] tablaR181 tiene 16 filas.
3
- compruebe que tiene tres columnas.
4
-compruebe que la columna 3 del [Link] tablaR181 tiene dos niveles del factor en estudio.
5
- obtenga la media de la columna 1 del [Link] tablaR181.
6
- obtenga la mediana de la columna 2 del [Link] tablaR181.
7
- obtenga el percentilo del 95% de la edad.
8
- obtenga el rango de los pesos.
9
- obtenga el desvío estándar de las edades.
10
- obtenga la variancia de los pesos.
11
- obtenga la edad del individuo más liviano (de menor peso).
12
- halle la edad del individuo de mayor edad.
Veremos ahora otras funciones, de mayor aplicación en casos que se trabajen con matrices
numéricas o [Link] solo con datos numéricos.
Veamos el ejemplo de la tablaR182. La misma corresponde a valores de glucosa en sangre de una
serie de animales indicado su código en la primer columna: p1-p8. Como puede observarse en la
tabla son todos valores numéricos, de la misma variable, aunque separados por animal (filas) y
fechas (columnas). Cada valor pertenece a un animal y a una fecha de medición en particular.
En casos como este puede ser necesario conocer estadísticas de columnas y filas.
Será conveniente entonces introducir los datos de manera que solo nos queden en la tabla valores
numéricos de la variable en estudio. Para ello hacemos la siguiente selección
y para introducirla en el espacio de trabajo utilizamos el siguiente comando
> tablaR182<-
[Link]("clipboard",header=TRUE,[Link]=c("p1","p2","p3","p4","p5","p6","p7","p8"),dec="
,",sep="\t")
con el argumento [Link], colocamos como nombre de la fila los códigos de cada animal, de
manera que no se crea una columna con los códigos de cada animal. De esta manera tenemos todas
filas y columnas con valores numéricos.
Vemos como quedó
> tablaR182
fecha1 fecha2 fecha3 fecha4
p1 1.0 1.2 1.4 1.1
p2 1.1 1.5 1.4 1.1
p3 1.2 1.5 1.4 1.2
p4 1.1 1.3 1.4 1.2
p5 1.2 1.3 1.5 1.2
p6 1.3 1.2 1.6 1.3
p7 1.1 1.3 1.4 1.3
p8 1.2 1.3 1.4 1.2
Si bien podemos utilizar algunas funciones ya conocidas, la biblioteca "fBasics" amplia bastante las
posibilidades. Puede descargarla desde cualquiera de los repositorios como hemos aprendido en
clases anteriores. Esta biblioteca provee algunas funciones interesantes para estos casos. Nos brinda
estadísticas de filas y columnas. Veamos su aplicación a columnas.
1.1. colStats()
nos permite calcular diferentes funciones de todas las columnas. Para calcular la media aplicamos el
siguiente código
> colStats(tablaR182,mean)
nos da la media de cada columna
fecha1 fecha2 fecha3 fecha4
1.1500 1.3250 1.4375 1.2000
Si deseamos el desvío estándar el comando a escribir será
> colStats(tablaR182,sd)
nos permite calcular el desvío estándar de las columnas
fecha1 fecha2 fecha3 fecha4
0.09258201 0.11649647 0.07440238 0.07559289
Para la variancia el procedimiento es similar
> colStats(tablaR182,var)
para calcular la variancias por columnas
fecha1 fecha2 fecha3 fecha4
0.008571429 0.013571429 0.005535714 0.005714286
lo mismo que para hallar el mínimo de cada columna
> colStats(tablaR182,min)
buscar el mínimo valor dentro de cada columna
fecha1 fecha2 fecha3 fecha4
1.0 1.2 1.4 1.1
o el máximo de cada columna
> colStats(tablaR182,max)
busca el máximo valor de cada columna
fecha1 fecha2 fecha3 fecha4
fecha1 fecha2 fecha3 fecha4
1.3 1.5 1.6 1.3
1.4
también podemos hallar el rango de valores (mínimo y máximo)
> colStats(tablaR182,range)
busca el mínimo y el máximo valor de cada columna, es decir el rango de valores
fecha1 fecha2 fecha3 fecha4
[1,] 1.0 1.2 1.4 1.1
[2,] 1.3 1.5 1.6 1.3
para la mediana
> colStats(tablaR182,median)
calcula la mediana de cada columna
fecha1 fecha2 fecha3 fecha4
1.15 1.30 1.40 1.20
1.16
Veamos ahora estadísticas de filas. Para ello utilizamos la función rowStats() de la biblioteca
fBasics
1.2. rowStats()
Para estadísticas de filas tenemos opciones similares.
Para la media
> rowStats(tablaR182,mean)
p1 p2 p3 p4 p5 p6 p7 p8
1.175 1.275 1.325 1.250 1.300 1.350 1.275 1.275
para el desvío estándar
> rowStats(tablaR182,sd)
p1 p2 p3 p4 p5 p6 p7 p8
0.170782 0.206155 0.150000 0.129099 0.141421 0.173205 0.125830 0.0957427
la variancia
> rowStats(tablaR182,var)
p1 p2 p3 p4 p5 p6 p7 p8
0.0291666 0.0425000 0.0225000 0.0166666 0.02000000 0.03000000 0.01583333 0.00916667
la mediana
> rowStats(tablaR182,median)
p1 p2 p3 p4 p5 p6 p7 p8
1.15 1.25 1.30 1.25 1.25 1.30 1.30 1.25
y el rango
> rowStats(tablaR182,range)
p1 p2 p3 p4 p5 p6 p7 p8
[1,] 1.0 1.1 1.2 1.1 1.2 1.2 1.1 1.2
[2,] 1.4 1.5 1.5 1.4 1.5 1.6 1.4 1.4
o algunos percentilos
> rowStats(tablaR182,quantile)
p1 p2 p3 p4 p5 p6 p7 p8
0% 1.000 1.100 1.200 1.100 1.20 1.200 1.100 1.200
25% 1.075 1.100 1.200 1.175 1.20 1.275 1.250 1.200
50% 1.150 1.250 1.300 1.250 1.25 1.300 1.300 1.250
75% 1.250 1.425 1.425 1.325 1.35 1.375 1.325 1.325
100% 1.400 1.500 1.500 1.400 1.50 1.600 1.400 1.400
2. Generación de objetos con secuencias numéricas
Muchas veces tenemos que generar vectores, columnas o filas de [Link], con secuencias
establecidas de números. Por ejemplo, hemos realizado la obtención de 50 muestras cada 2 minutos,
por lo tanto nuestros tiempos serán 0, 2, 4, ....etc.
Veremos a continuación algunos recursos al respecto
2.1.1. La función seq()
Esta función permite generar secuencias numéricas. Tiene diversas formas de expresarla, las cuales
se muestran con ejemplos
> seq(1,5,2)
[1] 1 3 5
En el caso anterior, el primer número es desde donde parte la secuencia, el segundo número hasta
donde llega y el tercero el escalón o incremento entre dos números consecutivos.
Veamos otros ejemplos similares
> seq(1,7,2)
[1] 1 3 5 7
> seq(1,7,3)
[1] 1 4 7
También podemos generar secuencias decrecientes.
> seq(10,1,-2)
[1] 10 8 6 4 2
Con la misma función podemos utilizar otro formato, en el cual indicamos con length: la cantidad
de números, from: desde donde partimos y to: hasta donde llegamos. En este caso el escalón lo elige
la función, ya que no se lo hemos pedido expresamente.
> seq(length=5,from=0, to=1)
[1] 0.00 0.25 0.50 0.75 1.00
> seq(length=23,from=0, to=1)
[1] 0.00000000 0.04545455 0.09090909 0.13636364 0.18181818 0.22727273
[7] 0.27272727 0.31818182 0.36363636 0.40909091 0.45454545 0.50000000
[13] 0.54545455 0.59090909 0.63636364 0.68181818 0.72727273 0.77272727
[19] 0.81818182 0.86363636 0.90909091 0.95454545 1.00000000
En el siguiente caso le indicamos la cantidad de números a generar con length. From: indica desde
donde partimos y by: el escalón que será positivo si generaremos números crecientes o negativo si
los números a generar son decrecientes. Obviamente en este caso, la función automáticamente elige
donde finalizar la secuencia.
> seq(length=5,from=100, by=-7)
[1] 100 93 86 79 72
Existen incompatibilidad entre algunos parámetros, los que darán error. Por ejemplo, en el caso
siguiente es una secuencias decreciente, pero el escalón es positivo.
> seq(from=100, to=70,by=10)
Error en [Link](from = 100, to = 70, by = 10) :
wrong sign in 'by' argument
para ser correcta debería ser
> seq(from=100, to=70,by=-10)
[1] 100 90 80 70
se puede asignar una secuencia a un objeto, en este caso lo llamamos s4
> s4<-seq(1,10,by=3)
cuando pidamos s4, obtendremos la secuencia
> s4
[1] 1 4 7 10
la forma más fácil de generar una secuencia numérica, por ejemplo de -10 hasta 10 en saltos de 0,1
a<-seq(-10,10,0.1)
En este caso no indicamos nada, entonces el primer número es de donde partimos, el segundo hasta
donde llegamos y el tercero el escalón. Pero, podemos escribirla sin escalón
a<-seq(1,100)
Si no se aclara el tercer número, es decir no indicamos el escalón, la función asigna
automáticamente al escalón el valor 1.
2.1.2. La función rep()
Esta función permite permite repetir un objeto en particular, no necesariamente numérico.
En el caso siguiente repetiremos 3 veces el objeto s4, creado anteriormente
> rep(s4,times=3)
[1] 1 4 7 10 1 4 7 10 1 4 7 10
En este caso la misma función produce repeticiones de un objeto una dada cantidad de veces, pero
agrupando sus elementos.
> rep(s4,each=3)
[1] 1 1 1 4 4 4 7 7 7 10 10 10
2.2. Generación secuencias con distribuciones aleatorias uniformes y normales
Ya vimos la función seq() que genera secuencias de elementos de un objeto de R. Sin embargo en
algunas oportunidades se requieren datos generados con cierta aleatoriedad o regularidad. A
continuación desarrollaremos algunas funciones útiles
2.2.1. La función runif()
Esta función genera secuencias aleatorias con distribución uniforme, es decir sin tener una moda.
Vemos por ejemplo
> runif(5,0,5)
[1] 3.751868 3.256647 3.356387 3.692737 2.871605
El primer número de la función runif(), en este caso 5, indica que se generarán 5 números
aleatorios. El segundo y el tercero: 0 y 5, indican los límites entre los cuales estarán los números.
Es una buena función para realizar sorteos, por ejemplo para asignar unidades experimentales
aleatoriamente a cada grupo experimental.
Se puede obviamente combinar con otras funciones. Por ejemplo si deseáramos generar 200
números enteros entre 0 y 1000, podríamos anidar la función runif() con la función round()
> round(runif(200,0,1000),digits=0)
[1] 847 873 940 805 879 177 219 466 894 879 831 410 289 446 890 448 63 848
[19] 234 661 893 466 707 571 987 485 991 766 431 472 975 543 950 324 127 115
[37] 440 561 200 494 869 559 211 232 772 740 935 399 437 463 48 718 421 435
[55] 118 580 489 581 314 56 360 167 64 957 755 578 189 628 253 228 92 485
[73] 358 334 956 68 694 989 459 129 626 689 700 912 900 408 387 838 610 757
[91] 312 571 264 585 394 494 784 509 55 769 300 85 71 152 883 236 920 814
[109] 925 402 731 999 957 164 158 868 404 71 753 927 831 207 503 824 611 938
[127] 198 5 61 544 59 205 786 818 117 404 27 877 487 69 446 109 173 643
[145] 566 62 221 58 294 161 284 508 273 167 210 148 945 978 852 580 541 599
[163] 745 603 888 593 140 399 617 475 202 171 122 137 113 901 361 801 380 646
[181] 86 724 685 376 818 929 63 993 587 159 884 354 623 642 637 895 714 229
[199] 196 766
2.2.2. La función rnorm()
Esta función genera números aleatorios pero los mismo tienen distribución normal.
Para mejor comprensión compararemos los datos obtenidos con seq(), runif() y rnorm().
Generamos una secuencia numérica que asignamos a un objeto A. Esta secuencia tendrá números
comprendidos entre 1 y 100 con saltos de a una unidad.
> A<-seq(1,100)
vemos el objeto A
>A
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
[37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
[55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
[73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
[91] 91 92 93 94 95 96 97 98 99 100
ahora generamos una secuencias aleatoria con distribución uniforme de 100 números comprendidos
entre 0 y 100, que asignamos al objeto B
> B<-round(runif(100,0,100),digits=0)
sus valores serán diferentes a los mostrados en este texto ya que es aleatoria la generación de los
mismos
vemos el objeto B
>B
[1] 33 4 35 64 49 10 86 62 30 39 1 13 78 47 36 46 23 43
[19] 81 39 82 72 40 43 57 25 44 96 2 33 61 81 81 38 86 52
[37] 90 18 30 86 99 82 77 41 79 99 70 61 75 33 9 36 24 89
[55] 65 8 24 4 65 86 100 44 75 65 58 30 1 31 4 66 5 72
[73] 4 74 74 46 74 51 62 72 53 92 99 77 52 92 46 34 92 93
[91] 90 7 33 47 94 97 17 3 38 47
por último generamos una secuencia aleatoria de 100 números con distribución normal y la
asignamos al objeto C
> C<- round(rnorm(100,50,25),digits=0)
El primer número dentro del paréntesis indica el número de datos a generar, el segundo la media de
la distribución normal y el tercero (25 en este caso) el desvío estándar.
sus valores serán diferentes a los mostrados en este texto ya que es aleatoria la generación de los
mismos
vemos este objeto
>C
[1] 82 43 67 93 31 85 27 33 94 33 48 39 30 49 84 23 38 40
[19] 57 59 72 53 65 12 59 65 63 94 84 14 37 55 17 26 44 41
[37] 78 25 12 33 43 50 47 40 105 68 40 47 42 43 6 52 56 69
[55] 41 63 6 35 2 35 12 51 28 43 75 26 25 24 55 32 59 27
[73] 48 34 57 46 34 48 43 74 61 43 47 71 0 30 33 47 29 122
[91] 46 57 37 88 27 75 24 77 66 88
Construimos ahora un [Link] con los datos de los objetos A, B y C
> ABC<-[Link](A,B,C)
pedimos un head de ABC
> head(ABC)
A B C
1 1 33 82
2 2 4 43
3 3 35 67
4 4 64 93
5 5 49 31
6 6 10 85
obviamente el objeto ABC tiene 100 filas, ya que cada elemento A, B y C tienen 100 filas.
Ahora graficaremos cada uno de estas columnas. primero veamos el histograma de la columna A
que corresponde a número naturales correlativos de 1 a 100
> hist(ABC$A)
nos indica que hay 10 número por cada intervalo de amplitud 10. Tal cual corresponde a lo que
generamos.
Si realizamos el histograma de los datos del objeto B
hist(ABC$B)
Observamos que como consecuencia de la aleatoriedad, no existe el mismo número de datos en
cada intervalo. Para el caso del elemento C
hist(ABC$C)
Podemos comprobar una concentración de los datos en el intervalo 40-60, que es donde se halla la
media que tiene el valor 50
3. Definición de funciones de inicio
3.1. .First()
.First() es una función útil para iniciar un espacio de trabajo con orientación a funciones o
bibliotecas especiales. Es decir en ella podemos cargar cierta información útil para un espacio de
trabajo en especial. Supongamos que en un espacio de trabajo debemos trabajar diariamente con las
funciones provistas por fBasics. Si bien no es mucho trabajo escribir library(fBasics), sería bueno
ya tenerla cargada cuando se accede a dicho espacio de trabajo y no tener que hacerlo cada vez que
iniciemos una sesión de trabajo.
Se puede poner en la función .First, esta biblioteca. El código siguiente nos indica como hacerlo.
.First<-function() {library(fBasics)}
cuando ejecute R en dicho espacio de trabajo , se cargará automáticamente la biblioteca fBasics (o
la que desee)
Por supuesto se pueden colocar más de una biblioteca, como vemos en el siguiente ejemplo donde
colocamos las bibliotecas pROC, fts y fBasics.
.First<-function(){
library(pROC)
library(fts)
library(fBasics)}
Si no deseara más el uso de .First(), puede eliminarla como cualquier objeto con la función rm()
rm(.First)
Cuando arranquemos nuevamente en este espacio de trabajo no se ejecutará más.
4. Listas
Las listas son objetos de utilidad en algunos casos especiales. Hasta ahora conocemos varios objetos
que almacenan datos: vectores, [Link], matrices y listas. Según el trabajo puede ser más o
menos útil cada uno de ellos.
Veremos una aplicación y para ellos utilizaremos una tabla con gran cantidad de datos.
Introduzca en su espacio de trabajo la tablaR183
tablaR183<-[Link]("clipboard",header=TRUE,dec=",",sep="\t")
Realizamos comprobaciones de rutina
> names(tablaR183)
[1] "codigo" "nombre" "clasificacion" "tipo"
[5] "ph" "conduct" "fosfato"
> head(tablaR183)
codigo nombre clasificacion tipo ph conduct fosfato
1 AR1A fanta otras normal 3.62 0.37 6.76
2 AR1B cocacola cola normal 2.63 0.65 55.17
3 AR1C h20h otras diet 3.63 0.59 20.85
4 AR2A levite aguasaborizada normal 3.39 0.37 54.88
5 AR3B awafrut aguasaborizada normal 3.04 0.58 0.70
6 AR3C levite aguasaborizada normal 3.00 0.72 0.26
> summary(tablaR183)
codigo nombre clasificacion tipo ph
am1 : 1 cocacola:10 aguasaborizada:10 diet :16 Min. :2.180
am2 : 1 h20h : 5 cola :11 normal:42 1st Qu.:2.855
am3 : 1 levite : 4 deportiva : 6 Median :3.020
am4 : 1 citric : 3 jugoliquido : 5 Mean :3.049
am5 : 1 clight : 3 jugopolvo :10 3rd Qu.:3.325
am6 : 1 gatorade: 3 otras :16 Max. :3.790
(Other):52 (Other) :30
conduct fosfato
Min. :0.3700 Min. : 0.16
1st Qu.:0.6800 1st Qu.: 31.97
Median :0.8550 Median : 55.24
Mean :0.9167 Mean :204.19
3rd Qu.:1.0650 3rd Qu.:270.75
Max. :2.0550 Max. :957.00
A modo de ejemplo de una forma de utilización de listas, analicemos la siguiente situación.
Supongamos que quisiéramos calcular media, desvío estándar, mediana y rango, haciendo grupos y
para diversas variables. En este caso calcularemos las estadísticas mencionadas para los diferentes
niveles del factor clasificación, que vemos a continuación con la función levels()
> levels(tablaR183$clasificacion)
[1] "aguasaborizada" "cola" "deportiva" "jugoliquido"
[5] "jugopolvo" "otras"
Por supuesto con un poco de ingenio y trabajo, ya estamos en condiciones de cumplir con el
objetivo propuesto, al menos por 10 formas diferentes (quiere pensar cuales podrían ser?)
Acá la propondré un método bastante efectivo y claro con el uso de listas.
Primero hagamos un ejemplo sencillo.
Supongamos que deseáramos obtener las medias de pH de cada nivel dentro de clasificación.
Para ello creamos una variable que llamaremos A, a la que le asignamos cada nivel del factor
"clasificacion"
recordemos los niveles
> levels(tablaR183$clasificacion)
[1] "aguasaborizada" "cola" "deportiva" "jugoliquido"
[5] "jugopolvo" "otras"
comenzamos con el nivel aguasaborizadas
> A<-"aguasaborizada"
creamos una lista
> list(clasificacion=A,media=mean(tablaR183$ph[tablaR183$clasificacion==A]))
al ejecutar el comando anterior obtenemos como salida el nivel del factor clasificación
$clasificacion
[1] "aguasaborizada"
y el valor de su media
$media
[1] 3.19
Para calcular las medias del pH para los otros niveles solo tenemos que redefinir la variable A.
Siguiendo con el nivel siguiente: "cola"
luego solo tenemos que redefinir A, para el otro nivel y así sucesivamente
> A<-"cola"
luego ejecutamos el mismo código, salvo que ahora para la función list() A ya no es más
aguasaborizadas sino cola
> list(clasificacion=A,media=mean(tablaR183$ph[tablaR183$clasificacion==A]))
$clasificacion
[1] "cola"
$media
[1] 2.579545
Si deseamos hacer muchos cálculos a la vez, por ejemplo: media, desvío estándar, mediana, rango.
Solo ampliamos la lista
>
list(clasificacion=A,media=mean(tablaR183$ph[tablaR183$clasificacion==A],[Link]=TRUE),desvi
oestandar=sd(tablaR183$ph[tablaR183$clasificacion==A],[Link]=TRUE),mediana=median(tablaR1
83$ph[tablaR183$clasificacion==A],[Link]=TRUE),rango=range(tablaR183$ph[tablaR183$clasific
acion==A],[Link]=TRUE))
$clasificacion
[1] "cola"
$media
[1] 2.579545
$desvioestandar
[1] 0.235568
$mediana
[1] 2.605
$rango
[1] 2.18 3.02
Veremos más adelante que esto se puede articular con [Link], scripts, etc.
1. > [Link](tablaR181)
2. > nrow(tablaR181)
3. > ncol(tablaR181)
4. > levels(tablaR181$sexo)
5. > mean(tablaR181$peso)
6. > median(tablaR181$edad)
7. > quantile(tablaR181$edad,probs=0.95)
8. > range(tablaR181$peso)
9. > sd(tablaR181$edad)
10. > var(tablaR181$peso)
11. > tablaR181[tablaR181$peso==min(tablaR181$peso),2]
12. > max(tablaR181$edad)