Está en la página 1de 15

BASES DE ESTADISTICA

1 de CC. Ambientales, curso 20092010

GUION DE LAS PRACTICAS CON R

1. Introduccion al programa R

El programa R funciona con una ventana donde se escriben los comandos


mas una ventana donde aparecen los graficos que se van creando. Podemos
empezar por dar un comando que haga aparecer la ventana de los graficos:

> plot(rnorm(1000))

Con este comando aparecera un grafico con mil muestras de una variable
aleatoria con distribucion normal. El comando rnorm(1000) crea la muestra
(r andom normal, o sea, normal aleatoria), mientras que el comando plot()
crea el grafico en la ventana propia (mas tarde veremos como guardar grafi-
cos en archivos).

1.1. Una calculadora

El programa R puede funcionar simplemente como una potente calcu-


ladora. Dispone de todas las funciones matematicas usuales:

> 2+2
[1] 4
> log(1+sin(pi/4))
[1] 0.5348
> rnorm(8)
[1] -0.99518798 -0.04388549 -2.15850920 1.81517190 0.78130990
[6] 0.56416476 0.45131008 0.14524045

Despues de cada uno de los comandos que damos, R nos presenta la respues-
ta. En el caso de plot() no hay respuesta en la ventana de comandos. En los

1
ultimos 3 comandos obtenemos una respuesta numerica. Los dos primeros
son numeros reales, el [1] inicial indica que es un vector con una compo-
nente (o sea, un numero). El ultimo nos da un vector de 8 componentes. En
la primera lnea de la respuesta, el [1] indica que el primer numero de esa
lnea es la componente 1 del vector; en la segunda lnea, el [6] indica que el
primer numero es la componente 6 del vector (las dos ultimas componentes
no caben en la primera lnea, por esa razon R las desplaza a la segunda;
esto puede ser diferente dependiendo del tamano de la ventana de R que se
tenga).

1.2. Variables

Una de las caractersticas indispensables de R es el uso de variables. En


la mayora de las computaciones que hacemos, en algun momento necesi-
tamos guardar valores en memoria para usarlos mas tarde en otras expre-
siones. Para este efecto creamos variables. Las variables tienen un nombre
que nosotros elegimos. Por ejemplo, el comando

> x <- 5

crea la variable x con el valor 5. Los nombres de las variables no pueden


empezar por un dgito ni por un punto seguido de un dgito (pueden em-
pezar por un punto seguido de una letra, pero no es conveniente hacerlo
pues estos nombres reflejan variables especiales del sistema). Sin embargo,
pueden contener tanto dgitos como puntos en el medio:

> esto.es.una.variable1 <- 45


> esto.es.una.2a variable <- 34

Ciertos nombres estan reservados por R y no se pueden redefinir. Algunos


casos susceptibles de crear dolores de cabeza son los nombres con una sola
letra c, q, t, C, D, F, I y T, pero tambien diff, df y pt. Por supuesto,
los nombres de las funciones usuales sin, cos, etc. tampoco se pueden usar

2
para variables. El sistema es sensible al uso de mayusculas y minusculas:

> una.variable <- 4


> una.Variable <- 10
> una.Variable
[1] 10

Las variables una.variable y una.Variable son diferentes.

1.3. Vectores

La mayora de los objetos con los que trabajaremos en R son vectores, los
numeros son interpretados como vectores de una componente, como hemos
visto. Una forma sencilla de construir un vector es con el operador de con-
catenacion c(...):

> peso <- c(60, 72, 84, 65, 43, 87, 90, 56)
> peso
[1] 60 72 84 65 43 87 90 56

Estos numeros son un ejemplo, pero podran representar el peso de un con-


junto de personas. Veremos un poco mas adelante como obtener datos de
un fichero. El comando length() nos da la longitud de un vector:

> length(peso)
[1] 8

Los elementos de los vectores tambien se pueden acceder individualmente


con el ndice de orden:

> peso[4]
[1] 65

Se pueden hacer calculos con vectores de la misma longitud. Imagnense que


disponemos tambien de los datos de las alturas de las mismas personas y
que queremos calcular el ndice de masa corporal (imc) para cada persona,

3
dado por el cociente entre el peso (en Kg) y el cuadrado de la altura (en m):

> altura <- c(1.59, 1.75, 1.85, 1.60, 1.57, 1.90, 1.83, 1.73)
> imc <- peso/altura^2
> imc
[1] 23.73324 23.51020 24.54346 25.39062 17.44493 24.09972
[7] 26.87450 18.71095

Se deben notar dos detalles. El primero es que en el vector de alturas, las


partes decimales estan separadas de la parte entera por un punto . y no
por una coma ,. El otro es que la division de dos vectores se efectua com-
ponente a componente (siempre que los vectores tengan la misma longitud),
o sea, la primera componente de imc es 60/1,592 . Cuando se efectua una
operacion entre un numero (un vector de longitud 1) y otro vector, el resul-
tado es un vector en el cual cada componente es el resultado de la operacion
entre dicho numero y cada componente del vector original, por ejemplo:

> altura + 4
[1] 5.59 5.75 5.85 5.60 5.57 5.90 5.83 5.73
> peso * 3
[1] 180 216 252 195 129 261 270 168

La funcion sum() da la suma de todos los elementos de un vector:

> sum(peso)
[1] 557

Podemos calcular la media de una muestra de esta forma

> sum(peso)/length(peso)
[1] 69.625

1 Pn 2
Usando la formula vx = n i=1 (xi x) calculamos la varianza de los pesos:

> peso.bar <- sum(peso)/length(peso)

4
> sum((peso - peso.bar)^2)/length(peso)
[1] 242.2344

Claro que, siendo R un programa disenado para la estadstica, ya existen


funciones para calcular estos valores:

> mean(peso)
[1] 69.625
> var(peso)
[1] 276.8393

Hay una diferencia entre el valor de la varianza que calculamos con la formula
usada en las clases, vx = n1 ni=1 (xi x)2 , y el valor dado por la funcion
P

1 Pn
var(). Esto se debe a que esta funcion calcula s2x = n1 2
i=1 (xi x) .
Analogamente, la desviacion tpica (standard deviation en ingles) se calcula
con sd(), pero esto nos da la version
v
u n
p u 1 X
s = s2x = t (xi x)2 ,
n1
i=1

> sd(peso)
[1] 16.63849
> sqrt(var(peso))
[1] 16.63849

Si queremos calcular nuestra version de la desviacion tpica, podemos escribir

> sqrt( var(peso) * (length(peso)-1)/length(peso))


[1] 15.56388
> sqrt(sum((peso-peso.bar)^2)/length(peso))
[1] 15.56388

La function summary() nos da un resumen de la distribuicion de los datos


de peso

5
> summary(peso)
Min. 1st Qu. Median Mean 3rd Qu. Max.
43.00 59.00 68.50 69.62 84.75 90.00

Hay que tener en cuenta como calcula R los cuartiles, que no es igual a como
lo hicimos en clase. Si la muestra ordenada tiene n datos, x1 , x2 , . . . , xn ,
entonces el primer dato, x1 , es el 0 (n 1)-til , x2 es el 1 (n 1)-til , etc.
xi es el (i 1) (n 1)-til , xn es el (n 1) (n 1)-til . Dicho de otra
forma, xi es la fracion (i 1)/(n 1) de la distribuicion. Veamos en el caso
de los pesos como se ordena la muestra:

> sort(peso)
[1] 43 56 60 65 72 84 87 90

El dato 43 es el 0 (o sea el mnimo), 56 es el 1/7 (la muestra tiene 8 elementos,


luego n 1 = 7) y 60 es el 2/7 = 0.2857. Para calcular el primer cuartil (que
es la fraccion 1/4 de la muestra ordenada), R hace una interpolacion lineal
entre el n 1-til inmediatamente anterior y el inmediatamente posterior
a 1/4, o sea, como 1/4 = 0,25 (1/7) + 0,75 (2/7), el primer cuartil es
Q1 = 0,25 56 + 0,75 60 = 59. El tercer cuartil es calculado de forma
analoga.
(Siempre que se quiera obtener informacion sobre un comando, se puede
usar la funcion help():

> help(sort)

que nos da como respuesta la discripcion completa del comando sort(); son
varias paginas de informacion por las que se puede navegar con las teclas
u (up) o d (down); para salir de la ayuda se usa la tecla q (quit)).
Los comandos cov(x,y) y cor(x,y) calculan la covarianza y el coe-
ficiente de correlacion r entre x y y. Tambien se puede construir un di-
agrama de tallos y hojas con el comando stem() (Pruebe por ejemplo
stem(altura)!)

6
Ejercicio 1. Los datos de la siguiente tabla representan los goles de David
Villa en la liga y en la copa desde la temporada 2000-01:

Temporada 00 01 02 03 04 05 06 07 08
N de partidos 36 44 40 46 46 40 49 41 40
N de goles 13 20 20 20 20 28 21 22 31

Introduzca estos datos en variables apropiadas y calcule la media, varianza,


desviacion tpica y mediana para cada una de ellas. Calcule la covarianza y
el coeficiente de correlacion entre los partidos jugados y goles marcados.

1.4. Leer y guardar datos

Para guardar toda la informacion que sale en pantalla se puede usar el


comando sink():

> sink("resultados_sesion_R.txt")

Este comando crea el fichero resultados sesion R.txt en el directorio


donde se esta trabajando. R va escribiendo en este fichero todas las re-
spuestas que salen en pantalla hasta que se de el comando

> sink()

Tambien se pueden guardar en un archivo todos los comandos dados hasta


cierto punto:

> savehistory("comandos_sesion_r.txt")

En este caso se guarda inmediatamente en el fichero comandos sesion R.txt


todos los comandos dados desde el principio de la sesion. Sera util utilizar
este comando inmediatamente antes de cerrar la sesion. Para terminar la
sesion se usa el comando q() o bien quit(). Se nos pregunta si queremos
guardar el workspace, o sea, el estado de la sesion: que variables (u otros
objetos) existen y en que estado estan. Si contestamos y (de yes), esta
informacion queda guardada en el directorio de trabajo, que no es nece-
sariamente el directorio inicial (en MacOS el directorio inicial suele ser el

7
directorio raiz del usuario y en Windows el directorio Mis Documentos; en
Linux es el directorio desde donde se ha inciado la sesion). Cuando se inicia
una nueva sesion desde este mismo directorio la informacion guardada se
recupera (esta informacion queda guardada en dos ficheros distintos: .RData
y .Rhistory). Esta opcion es muy util cuando se tiene que cerrar el orde-
nador sin perder el trabajo efectuado. En MacOS y en Windows tambien se
puede guardar el workspace directamente desde los menus.

1.4.1. Directorio de trabajo

No suele ser conveniente trabajar en el directorio base del usuario. Pode-


mos cambiar el directorio de trabajo desde la lnea de comandos de R. El
comando getwd() nos dice cual es el actual directorio de trabajo (del ingles
get working directory). Por ejemplo, en una sesion en Windows, sin haber
cambiado de directorio de trabajo, se podra obtener lo siguiente:

> getwd()
[1] "C:/Documents and Settings/Usuario"

Si tenemos un directorio dentro de Usuario llamado trabajo R podemos


cambiar el directorio de trabajo a este de la siguiente forma:

> setwd("trabajo R")


> getwd()
[1] "C:/Documents and Settings/Usuario/trabajo R"

Si queremos volver al directorio que se encuentra en el nivel inmediatamente


superior al actual podemos hacer setwd(".."):

> setwd("..")
> getwd()
[1] "C:/Documents and Settings/Usuario"

Es importante notar que el separador de subdirectorio es / y no \, aun


trabajando en Windows. Otro comando util es dir(), que nos da un listado

8
de los ficheros en el actual directorio de trabajo. Por ejemplo, en mi sesion
obtengo el siguiente resultado:

> dir()
[1] "R-practicas.aux" "R-practicas.dvi" "R-practicas.log"
[4] "R-practicas.tex"

1.5. Graficos

Vimos ya como crear un grafico con el comando plot(). Podemos igual-


mente crear histogramas (diagramas de barras) y diagramas de caja y big-
otes:

> hist(peso)
> boxplot(altura)

En el diagrama de caja y bigotes, los bigotes (las lneas horizontales conec-


tadas a la caja por un trazo discontinuo) no marcan el maximo y el mnimo
de la muestra sino el mayor y menor de los datos que quedan a una distan-
cia de la mediana menor o igual que 1.5 veces el tamano de la caja (que
es Q3 Q1). Si hay datos fuera de estos valores se consideran atpicos y se
senalan con un crculo. Para ver este efecto pruebe lo siguiente:

> x <- c(1, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 24, 25)
> boxplot(x)

Para crear un diagrama de dispersion entre los datos que tenemos de peso
y altura damos el comando

> plot(peso,altura)

El grafico que estaba antes desaparece y aparece uno nuevo con los datos
(peso, altura) marcados por crculos. Se pueden controlar todos los aspectos
del grafico: ejes, leyendas, etc. Vamos simplemente a indicar como cambiar
algunos detalles. Para cambiar la forma de como se presentan los puntos

9
en el grafico se usa el argumento pch=n donde n es un entero entre 1 y 26;
a cada numero corresponde un smbolo diferente, por ejemplo, con n=3 se
obtiene un +:

> plot(peso,altura, pch=3)

Se comprueba facilmente a que corresponden los otros numeros. Tambien


se puede usar la opcion pch="c" donde c es un caracter cualquiera. En este
caso en lugar de un smbolo aparece el caracter c (pruebalo!). Para cambiar
el ttulo del grafico se usa la opcion main="...", por ejemplo

> plot(peso,altura, pch=3,


+ main="El peso y la altura de los alumnos de CC.AA.")

Notese que cuando cambiamos de lnea sin que el comando este terminado, R
espera que introduzcamos el resto del comando en la lnea siguiente (delante
del smbolo +). Finalmente, se puede cambiar la leyenda que aparece en
los ejes con xlab="..." y ylab="...",

> plot(peso,altura, pch=3, xlab="Peso (en Kg)",


+ ylab="Altura (en m)",
+ main="El peso y la altura de los alumnos de CC.AA.")

El orden de las opciones es irrelevante, simplemente deben venir despues


de los vectores de datos. El comando abline(a,b) anade al grafico la lnea
recta de ecuacion y = a + bx:

> abline(1.4, 0.005)

Para anadir lneas horizontales o verticales se usa el mismo comando, pero


con otro formato:

> abline(v=80)
> abline(h=mean(altura))

10
Cuando estamos satisfechos con el resultado del grafico podemos guardalo
en un fichero. La forma de hacerlo es decir a R que en vez de enviar los
comandos que generan el grafico a la pantalla, los enve a un fichero. El
comando que se usa depende de que tipo de fichero queremos crear. El
comando

> jpeg("mi_grafico.jpeg")

crea el archivo mi grafico.jpeg, pero no con el grafico ya creado. Despues


de dado este comando tenemos que repetir los comandos que crearon el
grafico. Para terminar de escribir en el fichero mi grafico.jpeg tenemos
que decir a R que vuelva a la pantalla grafica con dev.off(). La secuencia
completa de comandos sera:

> jpeg("mi_grafico.jpeg")
> plot(peso,altura, pch=3, xlab="Peso (en Kg)",
+ ylab="Altura (en m)",
+ main="El peso y la altura de los alumnos de CC.AA.")
> abline(1.4, 0.005)
> abline(v=80)
> abline(h=mean(altura))
> dev.off()

Para guardar en otros formatos se puede usar pgn("mi grafico.png"),


pdf("mi grafico.pdf") o tiff("mi grafico.tiff"), entre otros.

Ejercicio 2. Con los datos del Ejercicio 1 relativos a los goles de David Villa,
construya diagramas de barras y de caja y bigotes para los goles marcados y
partidos jugados. Calcule la covarianza y el coeficiente de correlacion entre
estos dos datos. Haga un grafico de dispersion entre los goles y el numero
de partidos jugados, marcando con una lnea vertical y otra horizontal las
medias. Marque tambien la recta de regresion lineal entre los datos. Guarde
todos los graficos en archivo.

11
1.6. Leer datos de un fichero

Para crear vectores o matrices de datos pequenos se puede usar la funcion


de concatenacion c(), como ya hemos visto. Sin embargo, es comun tener
muestras demasiado grandes para que este metodo sea factible. Para estos
casos disponemos de la funcion read.table(). Vamos a leer una tabla que
contiene datos de precios y otras caractersticas de casas que se encuentran
en un archivo llamado casas-datos. Pero antes de hacerlo vamos a ver en
que estado esta nuestra sesion. El comando ls() nos da un listado de todos
los objectos que tenemos:

> ls()
[1] "altura" "imc" "peso" "peso.bar"
[5] "una.variable" "una.Variable"

Se puede eliminar algun objeto que no nos interese com rm(...):

> rm(una.variable)
> ls()
[1] "altura" "imc" "peso" "peso.bar"
[5] "una.Variable"

Volvamos a nuestro archivo de datos. Este debe estar escrito como un archivo
de texto normal (usualmente con la extension .txt, aunque esto no sea indis-
pensable). No debe ser un archivo creado por procesadores de texto como
OpenOffice o Word, si se usan estos programas hay que guardar el archivo
en formato de texto. Se puede usar Emacs, Vim, etc. en Linux, Notepad en
Windows o TextEdit en MacOS. El archivo casas-datos tiene la siguiente
estructura:

Precio Area Habit Edad Cal.cent


01 52.00 830 5 6.2 no
02 54.75 710 5 7.5 no
03 57.50 1000 5 4.2 no

12
04 57.50 690 6 8.8 no
05 59.75 900 5 1.9 si

La primera lnea tiene un elemento menos que las siguientes y contiene el


encabezamiento con los nombres de los datos. La primera columna contiene
los numeros de lnea (todos los datos estan separados por espacios). Vamos
a leer los datos:

> casas <- read.table("casas-datos")


Precio Area Habit Edad Cal.cent
01 52.00 830 5 6.2 no
02 54.75 710 5 7.5 no
03 57.50 1000 5 4.2 no
04 57.50 690 6 8.8 no
05 59.75 900 5 1.9 si
> ls()
[1] "altura" "casas" "imc" "peso"
[5] "peso.bar" "una.Variable"

Aveces no es conveniente tener la primera columna con los numeros de lnea.


Si el archivo tiene la siguiente estructura:

Precio Area Habit Edad Cal.cent


52.00 830 5 6.2 no
54.75 710 5 7.5 no
57.50 1000 5 4.2 no
57.50 690 6 8.8 no
59.75 900 5 1.9 si

se puede igualmente leer con el comando read.table pero como ahora la


primera lnea tiene el mismo numero de datos que las siguientes hay que
indicar a R que la primera lnea es el encabezamiento:

> casas <- read.table("casas-datos", header=TRUE)

13
Si el archivo solo tiene datos (sin encabezamiento), por supuesto no se usa
esta opcion.
La variable casas es una estructura de datos (en R una data frame),
que es una lista de datos. El comando read.table("casas-datos") sabe
leer el archivo y convertir el texto en la estructura de datos, que nosotros
asignamos a la variable casas. Esta variable (que es una lista) se puede ma-
nipular de varias formas. Cada dato esta almacenado en una subvariable con
el nombre que tenemos en el archivo. Por ejemplo, para acceder a la primera
columna (de precios) despues del nombre de la variable principal, casas,
ponemos el smbolo $ y el nombre de la subvariable, Precio (atencion a las
mayusculas!):

> casas$Precio
[1] 52.00 54.75 57.50 57.50 59.75
> casas$Area
[1] 830 710 1000 690 900

Estos representan vectores normales, los cuales podemos manipular con las
funciones que ya conocemos:

> mean(casas$Precio)
[1] 56.3
> plot(casas$Precio,casas$Area)

Siendo casas una lista, estos vectores tambien se pueden acceder por ndice
de orden:

> casas[[1]]
[1] 52.00 54.75 57.50 57.50 59.75

Notese que tenemos que usar dos [[. . . ]], y no uno como para los vectores.
Cuando los datos provienen de un archivo sin encabezamiento es util usar
esta forma de acceder a los datos. Hay otra forma de acceder a los datos

14
que simplifica el uso de los nombres de las variables. Podemos adjuntar la
estructura de datos casas con el comando

> attach(casas)

y a partir de este comando disponemos de las variables Precio, Area, Habit,


Edad y Cal.cent:

> Precio
[1] 52.00 54.75 57.50 57.50 59.75
> Cal.cent
[1] no no no no si
Levels: no si
> plot(Precio,Area)

La variable Cal.cent (calefaccion central) no es numerica, por tanto R nos


indica los valores posibles: Levels: no si. Cuando ya no deseamos trabajar
mas con la variable casas la desjuntamos. A partir de este comando ya
no vemos las variables Precio etc.:

> detach(casas)
> Precio
Error: object Precio not found

Ejercicio 3. Use el archivo de datos Productos.data (disponible en la


pagina de la asignatura) para leer los datos referentes a precios de 10 tipos
de productos alimentarios en los anos 1987 y 1988 en una determinada zona
del Reino Unido (los precios estan en peniques). Haga un analisis completo
de estos datos analogo al hecho en los ejercicios 1 y 2.

15

También podría gustarte