Escolar Documentos
Profissional Documentos
Cultura Documentos
Bíoestadística/Estadística
Semestre par 2016
q()
en la consola.
Es recomendable escribir la secuencia de funciones en un archivo de texto, que llamaremos script y luego
correrlo en la consola, ya que el script es fácil de guardar y volver a reproducirlo en otra instancia.
Para obtener información sobre una función específica, el comando es
help()
El nombre de la función se pasa como argumento de la función help. R es sensible a mayúsculas y minúsculas,
por lo tanto A y a son símbolos diferentes y por lo tanto refieren a variables distintas. Si no se recuerda el
nombre exacto de una función, se puede buscar en los archivos de ayuda de R escribiendo
help.search()
el término buscado (en inglés) debe estar dentro del paréntesis y con comillas. Al utilizar help.search aparecen
todos los comandos que contengan dicha palabra, con la sintaxis paquete:comando. Varios paquetes ya vienen
instalados con el R básico. Aquellos que no lo están se pueden instalar y luego cargarlos con el comando
library(paquete).
Ejercicio 1. Mirar la ayuda de la función mean(). Determinar si existe una función que calcule el máximo
de un grupo de números.
El símbolo # significa que todo lo que le sigue es solo comentario.
R opera en datos con estructuras predeterminadas. La estructura más simple es el vector numérico. Para
asignar un valor a una variable se puede usar una flecha “<-” o el igual “=”.
1
a<-5
b = 4
Para determinar un vector se deben concatenar varios números, utilizando la función c().
Para ver el contenido de una variable en la consola podemos ver su contenido. Escribiendo x y z verificamos
que son el mismo vector.
También se pueden crear vectores concatenando vectores ya existentes. R contiene todos los operadores
aritméticos estándar (ver tabla). Estas operaciones se pueden usar también con vectores. Además de las
expresiones artiméticas comunes también se pueden usar: log(), sin(), cos(), exp(), tan().
u<- 4*x + z
Ejercicio 2
Ejercicio 3
Explorar qué hacen las funciones range(), mean(), length(), sum() aplicadas a un vector.
Ejercicio 4 Explorar qué hace la función sort(). Es posible ordenar los elementos de manera decreciente?
Los vectores se pueden crear “a mano”, escribiendo todos los elementos
diez <-c(1,2,3,4,5,6,7,8,9,10)
o usando las facilidades de R. Para crear vectores que contienen secuencias de números se puede usar “a:b”
que crea una secuencia que empieza en a y va sumando 1 hasta llegar a b, o la función seq(a,b,c), que hace lo
mismo, pero suma c en vez de uno (c puede ser cualquier real positivo). La función “:” tiene alta prioridad
ante otras operaciones.
v1 = -5:5 #avanzo de a 1
v2 = seq(-5,5,0.5) #avanzo de a 0.5
v1
## [1] -5 -4 -3 -2 -1 0 1 2 3 4 5
2
v2
## [1] -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5
## [15] 2.0 2.5 3.0 3.5 4.0 4.5 5.0
Ejercicio 5
• Comparar los resultados de la expresión 1:n-1 y 1:(n-1) para algún número natural n.
• Generar una secuencia de números del 20 al 1.
• Generar otra secuencia del 20 al 2, sólo de números pares.
Para elegir subconjuntos de un vector alcanza con poner el nombre del vector y el índice o índices de los
elementos que se quieren elegir con paréntesis rectos []. Los índices deben de variar entre 1 y n=length(vector)
largo del vector. Por ejemplo, para obtener la primera componente de y
y[1]
Ejercicio 6 Usar la función “:” para elegir los elementos del 2 al 5 del vector y.
Operadores
Los vectores lógicos pueden ser utilizados con operadores aritméticos. En ese caso el FALSE se convierte en 0
y el TRUE se convierte en 1.
y[y > 2]
## [1] 3.5 4.0 8.0 12.0 3.0 7.0 8.0 16.0 24.0
y>2
## [1] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE
devuelve un vector de TRUE y FALSE según si cada valor de y es mayor que 2 o no.
Ejercicio 7 Crear un vector m que contenga los elementos de y mayores que 2 y menores que 5. Explorar la
diferencia entre las multiplicaciones
3
m*m
m%*%m
Matrices
Son la extensión natural de los vectores. Una matriz se puede definir del siguiente modo:
Esto genera una matriz de 4 filas con los números del 1 al 20, la cantidad de columnas se determina
automáticamente si es posible. En R las matrices por defecto se llenan por columnas, es decir, la primer
columna de la matriz x serían los números del 1 al 4, la segunda son los números del 5 al 8 y así sucesivamente.
En el ejemplo, para que se llenase por filas hubo que especificárselo utilizando el argumento “byrow = TRUE”.
Observación importante En el ejemplo anterior, x[3,2] nos daría el segundo elemento de la tercera fila de
x, x[,1] sería la primer columna y x[3,] la tercer fila.
Ejercicio 8 Crear un vector de largo 20 con los números que usted quiera. A partir del vector creado, crear
una matriz m1 de dimensiones 5 x 4 completándola por filas. A partir del mismo vector, crear otra matriz
m2 de dimensiones 2 por 10, completándola por columnas.
Dada una matriz A, la función t(A) calcula la traspuesta de la matriz A. Dada una matriz A, nrow(A) y
ncol(A) nos dicen el número de filas y columnas de la matriz A y dim(A)=c(nrow(A), ncol(A)). La función
solve() aplicada a una matriz calcula su inversa si esta existe. Dadas dos matrices A y B, el producto matricial
entre ambas se hace mediante el operador
A %*%B
“Pegando” matrices
Es importante recordar que la función c(), se puede utilizar para concatenar cualquier tipo de objetos, no sólo
variables numéricas, enteras, etc. De la misma familia son las funciones cbind y rbind que permiten combinar
una serie de objetos bien por columnas o por filas. Habitualmente se usan para construir una matrices a
partir de vectores.
La función apply
La función apply() es muy importante a la hora de programar códigos eficientes para el manejo de grandes
conjuntos de datos. Permiten ahorrarse el uso de muchos bucles (que veremos más adelante), lo cual lleva a
un código más legible y, en muchos casos, más eficiente. La función apply permite realizar la misma operación
en todas las filas o columnas de un array (matriz) simultáneamente. Sólo hay que indicarle la operación a
realizar y el índice o índices sobre los cuales ha de realizarla. Por ejemplo, para sumar los elementos de las
filas de la matriz x definida antes
4
apply(x,1,sum)
## [1] 15 40 65 90
apply(x,2,sum)
## [1] 34 38 42 46 50
también se puede definir una nueva función mediante function() y aplicarle la nueva función a las filas o
columnas
mioperacion=function(z){
return(z-mean(z))} #defino la función primero
apply(x,1,mioperacion)
Ejercicio 10
• Crear un vector llamado v2 que contenga los promedios de las columnas de la matriz mat2.
• Crear una matriz mat3, que a las entradas de cada fila le agregue la suma de sus filas. Hacerlo usando
primero una combinación de operaciones matriciales y apply. Luego hacerlo utilizando directamente la
función apply. Explorar si los resultados son iguales.
Data frames
Los data.frames (campos de datos) son el objeto más habitual para almacenar datos. La forma de pensar en un
data.frame es considerar que cada fila representa a un individuo de una muestra y el correspondiente valor para
cada columna representa la medición de alguna variable para ese individuo (fila-individuo, columna-variable).
Si, por ejemplo, tenemos 100 alumnos y las notas numéricas de ellos en cada examen junto con la calificación
final (tipo caracter), esto podrá representarse con un data.frame de 100 filas con una columna por cada
examen y una columna más para la calificación final.
R trae algunos juegos de datos ya pre-cargados, uno de ellos se llama mtcars. Para acceder a él basta llamarlo
por su nombre:
5
mtcars
mtcars[3,2]
## [1] 4
mtcars['Datsun 710','cyl']
## [1] 4
De la misma manera, para seleccionar columnas de un data.frame, podemos hacer lo mismo que antes, pero
usando el comando $.
mtcars[,4]
## [1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230
## [18] 66 52 65 97 150 150 245 175 66 91 113 264 175 335 109
mtcars$hp
## [1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230
## [18] 66 52 65 97 150 150 245 175 66 91 113 264 175 335 109
Se puede usar la función all.equal() parar verificar que ambas expresiones son equivalentes:
all.equal(mtcars$hp,mtcars[,4]) ### TRUE
Ejercicio 11
• Usar la función dim para saber cuántos autos tiene esta base de datos y cuántas características para
cada auto.
• Crear un vector que contenga el peso del auto. Transformar dicho vector para cambiar el peso de libras
a kg. Agregarlo al data.frame usando $.
Para matrices y dataframes, colnames() y rownames() son las etiquetas de las columnas y las filas respectiva-
mente. Se puede acceder también con dimnames() que devuelve una lista con ambos vectores. Puede ser útil
ver un dataframe como una matriz con columnas que pueden tener diferentes modos y atributos. Sus filas o
columnas pueden ser extraídas usando los índices habituales en matrices.
6
Tipos de objeto
Dado un objeto se puede consultar su tipo, su clase (numérico, caracter, lista, matriz. . . ). Dado un objeto
de un cierto tipo, es posible forzarlo a otro distinto (siempre que esto tenga sentido para el objeto). Esto es
posible mediante la familia de funciones as.objeto().
En particular, no es lo mismo, por ejemplo, tener el número 3 que el caracter ‘3’, o tener una variable llamada
datos que la palabra ‘datos’. Por ejemplo, si Data un data.frame, la función as.matrix(Data) lo convierte
en una matriz si esto es posible. Un uso indebido de estas imposiciones de tipo puede llevar a resultados
no deseados (el que no haya habido mensaje de error no quiere decir que la conversión se haya hecho como
nosotros queríamos).
Para verificar, disponemos de funciones que permiten determinar si una variable es un número, un string, un
vector, etc y, en caso de necesitarlo, convertir unas en otras.
as.numeric recibe una entrada y la convierte a número (si es posible). is.numeric verifica si el argumento
recibido es un número o no.
## [1] TRUE
## [1] FALSE
## [1] 3
## [1] 3
Hay que tener cuidado al usar este tipo de funciones ya que a veces uno deconoce a qué clase de objeto se le
está aplicando. Veamos que ocurre si intentamos aplicar as.numeric a, por ejemplo, una palabra:
as.numeric(c('plato','3'))
## [1] NA 3
is('3')
7
Como la palaba ‘plato’ no se puede convertir automáticamente en un número, la función as.numeric() devuelve
NA, que quiere decir, dato faltante y un warning, que avisa que introdujo un NA. El caracter ‘3’ si lo logra
convertir en un número.
Algunas funciones similares son is.vector, as.vector, is.character, as.character, is.logical, as.logical. La función
is se usa para saber qué tipo de objeto es.
Ejercicio 12 a) Evaluar las funciones recién mencionadas en los siguientes valores y observar los resultados
obtenidos:
• 43
• ‘45’
• FALSE
• ‘FALSE’
• 3.14
• ‘3’ + ‘4’
• TRUE + TRUE
• TRUE + 5
• 4 × FALSE
Para realizar operaciones numéricas con data.frames, lo más conveniente es convertir a matriz, array o vector
la parte con la que se desea operar y después hacer las operaciones.
• read.table() lee cualquier conjunto de datos tabulados donde las columnas están separadas por tab, por
ejemplo en un archivo .txt (se puede especificar el separador)
• read.csv() es una versión simplificada de read.table(), donde los argumentos están ya preconfigurados
para leer archivos .csv (eg. planillas Excel). En este caso el separador por defecto es espacio, también
se puede cambiar.
En caso de querer usar estas funciones para cargar los datos hay que tomar precauciones con, por ejemplo, el
directorio sobre el que se está trabajando. Sin embargo en RStudio estas cosas se pueden hacer a través de
menús: En caso de querer cambiar el directorio de trabajo (es decir, el punto de partida para las rutas de
archivo y aquel en el que se guardan por defecto las salidas que genere nuestro script), en R Studio basta
con ir al menú Session -> Set Working Diretory. Para cargar un archivo .csv o .txt como data.frame, basta
con utilizar el menú Import Dataset -> From Local File. . . ubicado en el cuadrante superior derecho del
programa.
Ejercicio 13
8
Procedimientos gráficos
El lenguaje R dispone de varias funciones preparadas para la representación gráfica de datos y estas serán
muy importantes a lo largo del curso:
Estas funciones se dividen en dos grandes grupos:
De entre todos los gráficos de este tipo se destaca la función plot(), que tiene muchas variantes y dependiendo
del tipo de datos que se le pasen como argumento actuará de modos distintos. Lo más común es plot(x,y)
para representar un diagrama de puntos de y respecto a x. Otras funciones de alto nivel importantes son, por
ejemplo, hist() para dibujar histogramas o barplot para dibujar gráficos de barras. Para representaciones
tridimensionales (superficies) se usa persp.
Algunos parámetros comunes a la mayoría de los gráficos de alto nivel:
• add=TRUE Fuerza a la función a actuar como si fuese de bajo nivel (intenta super- ponerse a un gráfico
ya existente). Hay que tener cuidado, no sirve para todas las funciones.
• type Indica el tipo de gráfico a realizar, cabe destacar type=“p” sirve para representar puntos (opción
por defecto), type=“l” para representar líneas, type=“b” para representar los puntos unidos por líneas.
Son de gran utilidad para completar un gráfico, compararlo con otro superponiendo ambos, etc. Destacan los
siguientes (help(par) para una descripción completa de estos y otros parámetros):
Muchos de éstos parámetros se pueden ingresar como un único valor, o como un vector de valores. En este
caso el gráfico irá alternando dicho parámetro en cada punto/línea de la gráfica.
El siguiente ejemplo grafica la función logaritmo para los enteros de 1 a 10. Luego, graficamos sobre la misma,
la función raiz cuadrada en la misma región usando lines.
9
x = 1:10
y = log(x) #evalúa la función logaritmo en cada entrada del vector x
z = sqrt(x) #idem, con la función raiz
plot(x,y, type = 'l', main = 'Gráficos de las funciones logaritmo y raiz ',
col = 'GREEN', ylim = c(0,4) )
lines(x,z, col = 'ORANGE')
1
0
2 4 6 8 10
x
La función barplot recibe un vector y grafica en barras sus valores, en el orden que los recibe. Como se verá
en el ejemplo, resulta adecuada para graficar información por categorías
10
70
50
30
10
0 Gráfico de algún porcentaje relevado
vector = mtcars$wt #el vector a analizar, recordar que mtcars viene preestablecida en R
hist(vector)
Histogram of vector
8
6
Frequency
4
2
0
2 3 4 5
vector
En ese caso R determinará la cantidad y rango de intervalos que usará para construir el histograma. Sin
embargo esto se puede elegir manualmente utilizando el argumento opcional breaks. Asimismo, existen
argumentos opcionales que permiten modificar título, nombre de las variables, color, etc.
11
hist(vector, breaks = 15, main = "Histograma similar pero más bonito", xlab = "Peso(lb)", col = "green")
8
6
Histograma similar pero más bonito
Frequency
4
2
0
2 3 4 5
Peso(lb)
Si queremos realizar un diagrama de cajas basta utilizar el comando boxplot
boxplot(vector)
5
4
3
2
Ejercicio 14
12
Una vez que en la ventana de gráficos tenemos algo representado, existen dos funciones que nos permiten
trabajar interactivamente sobre dicha ventana:
• La función locator() sitúa el cursor en la ventana de gráficos y cada vez que pulsemos el botón izquierdo
del mouse nos devolverá las coordenadas del punto en el que hayamos marcado.
• La función identify() nos permite marcar uno de los puntos del gráfico (con el ratón, igual que antes),
y nos devuelve la componente de los vectores representados que dio lugar a ese punto. Muy útil en
estadística para identificar outliers.
Condiciones y bucles.
R tiene disponible una construcción condicional de la forma:
donde expr 1 evalúa una condición y debe devolver un valor: TRUE o FALSE. Si el resultado es TRUE,
entonces devolverá el resultado de expr 2 y si es FALSE el de expr 3. No es obligatorio incluir el else.
El siguiente ejemplo utiliza if para decir si la variable entero es par o impar.
Para construir un loop se puede usar el comando “for” que tiene la siguiente forma:
donde “name” es la variable que varía en el loop, típicamente usamos una letra. expr 1 es un vector
(generalmente es una secuencia, como por ejemplo 1:10), y expr 2 es generalmente un grupo de expresiones,
donde alguna de ellas depende de la variable sobre la que estamos iterando.
Supongamos que tenemos el vector numérico y:
y<-c(3,2,0,6,1,0)
y que para cada elemnto de y queremos ver si es igual a 0 o no. Si lo es, remplazaremos el elemento con el
número 10.
for(i in 1:length(y)){
if(y[i]==0){ y[i]<-10}
}
Ejercicio 15 Dado el vector: v<-c(4,5,9,2,1,4), remplazar los elementos impares con el número 1.
13
dados = sample(c("C", "N" ), 10, rep = TRUE)
dados
## [1] "N" "N" "C" "C" "C" "N" "C" "N" "C" "C"
Es necesario incluir el argumento rep = TRUE para que se admitan resultados reptidos. El argumento por
defecto es FALSE de modo que si no se indica nada el sorteo se hará sin repetición. Por ejemplo, si queremos
sortear 5 números diferentes entre 1 y 30 podemos usar
## [1] 4 14 13 18 11
Sin embargo sample no es la única forma de simular eventos aleatorios. Existen funciones que permiten
simular números aleatorios cuyas probabilidades tienen ciertos comportamientos predefinidos (algunas de
las distintas distribuciones que se verán en el curso). Por regla general el nombre de las funciones comienza
con ‘r’ y sigue con una abreviatura de la distribución considerada. Así, por ejemplo la función runif genera
valores distribuidos uniformemente en un intervalo dado:
## [1] 3.488726
Ejercicio 16
• Algunas otras funciones a tener en cuenta son rbinom, rgeom, rnbinom, rmultinom, rnorm, rexp.
Explorar la ayuda para determinar qué hace cada una de ellas, y generar para cada una un juego de 50
datos (con parámetros a elección)
• Investigar si es posible utilizar la función sample para simular un sorteo de valores no equiprobables.
En caso de ser posible, simular 50 tiradas de una moneda cargada con probabilidades 0.6 y 0.4 para “C”
y “N” respectivamente.
14