Libro R
Libro R
Libro R
INTRODUCCION
ESTADISTICA CON R PARA PROFESORES
Jos
e Miguel Contreras Garca
Elena Molina Portillo
Pedro Arteaga Cez
on
c
Jose Miguel Contreras Garca
Elena Molina Portillo
Pedro Arteaga Cezon
Todos los derechos reservados. Ninguna parte del libro puede ser reproducida, almacenada
en forma que sea accesible o transmitida sin el permiso previo por escrito de los autores.
ISBN: 978-84-693-4859-8
Deposito legal:
Financiacion:
Esta obra forma parte de los proyectos: SEJ2007-60110/EDUC (MEC-FEDER) y EDU201014947 (subprograma EDUC); con la colaboracion de la beca FPI BES-2008-003573 y la beca
FPU AP2007-03222.
Indice general
I
Introducci
on al lenguaje R
II
Primeras nociones
III
Manipulaci
on de Datos
17
IV
Funciones
40
Dispositivos gr
aficos
VI
Estadstica Descriptiva
VII
X
XI
XII
78
Distribuciones de probabilidad
VIII
IX
53
Regresi
on
90
104
Inferencia
113
An
alisis de la varianza
123
Combinatoria y probabilidad
Entornos gr
aficos para trabajar con R
132
153
Parte I
Introducci
on al lenguaje R
Introducci
on al lenguaje R
Introduccion al lenguaje R
Introduccion al lenguaje R
Parte II
Primeras nociones
Primeras nociones
Una vez instalado el programa, la forma mas facil de usarlo es de forma interactiva mediante
la lnea de comandos. Cuando R se inicia, aparece la ventana del programa Gui (graphical
user interface) con un mensaje de apertura.
Primeras nociones
Conceptos iniciales.
Funci
on help (ayuda)
R es un lenguaje funcional, esto es, realiza las tareas a traves de funciones. La primera funcion que necesitamos conocer es la que nos proporciona la ayuda del programa, esta es help.
Si escribimos help aparece la definicion de la funcion help, la cual nos sera u
til conocer si queremos realizar alguna modificacion en ella. Pero si lo que queremos es obtener el resultado de la
funcion, debemos escribir entre parentesis el conjunto de argumentos que quiere suministrar a
la misma, o vaco si lo que se quiere es que aparezca la ayuda sin mas. Una forma alternativa
a esta funcion es poner el caracter ? delante del elemento que queremos consultar.
> help(mean)
Cuando queremos consultar funciones especificadas por caracteres especiales, el argumento debera ir entre comillas para transformarlo en una cadena de caracteres. Por ejemplo:
help([[ ). Otra forma de realizar la misma accion es con la funcion help.search(median)
> help.search("calibration")
Una opcion interesante de la ayuda es que podemos encontrar ejemplos de uso. La forma
de ejecutar los ejemplos es escribiendo example( ) o demo( ) si se quiere una demostracion
concreta. Por ejemplo con la sentencia example(InsectSprays) obtenemos una muestra de
imagenes de diferentes graficas que podemos realizar con los datos InsectSprays.
Primeras nociones
Asignaciones
Al igual que ocurre con otros lenguajes de programacion R asigna nombres a las operaciones. Esto lo conseguiremos mediante el smbolo < , > o =.
Como para poder visualizar un dato renombrado hay de escribir el nombre despues de
haberlo asignado, es u
til utilizar los ; despues de la asignacion para ahorrarnos espacio, pero
no es bueno abusar de ello por que sera mas difcil interpretar codigos mas extensos.
Hay que tener en cuenta que R utiliza determinados terminos para referirse a algunas funciones por lo que lo mejor es evitar esos nombres a la hora de las asignaciones, por ejemplo c
se utiliza para crear vectores o t que calcula la traspuesta de un conjunto de datos (vectores,
matrices, dataframe,...), pero si nos confundimos no es dramatico, ya que podemos arreglarlo.
Habitualmente a la hora de nombrar objetos en programacion no existen reglas definidas
pero se suele seguir una cierta pauta, por ejemplo se suele nombrar marcos de datos (dataframes)
con la inicial en may
uscula, pero las variables siempre en min
uscula. Si varias funciones hacen
cosas parecidas a objetos distintos, se separan con ; (o mas facil usando clases).
> rnorm(6)->x
> x
[1] 0.1364489 -0.5514473 0.2333607 1.1652428 0.4284878 0.5159063
> X<-rnorm(5)
> X
[1] -0.482520557 -0.951955735 1.537756423 0.839669367 0.772915316
> y<-1:15; y
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
> c
function (..., recursive = FALSE) .Primitive("c")
> c<-1:3
> c
[1] 1 2 3
> #Hola
> #Espero que todo esto te sea
util
Primeras nociones
Paquetes
Como ya hemos hablado antes, R consta de un sistema base de libreras y de un conjunto
de paquetes adicionales que extienden su funcionalidad.
En esta seccion vamos a ver como se anexan (instalan) los paquetes adicionales. Tenemos
que tener en cuenta que la instalacion depende del sistema operativo con el que funcionemos:
Seg
un el sistema operativo que utilicemos tenemos varias formas distintas de instalar un
paquete:
El metodo mas sencillo consiste en es hacerlo directamente desde R, mediante la funcion
install.packages( ). Desde una ventana del sistema o desde Inicio-Ejecutar... Rcmd INSTALL paquete. Y por u
ltimo desde la interface de XEmacs.
Otra forma es descargar el archivo en formato zip (en el caso de windows), tar.gz (linux)
o tgz (en el caso de Mac) desde la web de R e instalarlo en el directorio R/.../library.
Tambien podemos instalar un libro en cualquier otro directorio del ordenador e indicarle el
camino del directorio mediante la funcion library( a , lib.loc = C : /...), siendo a el
nombre que le daremos a la biblioteca y C : /... la ruta hacia ella. (no es recomendable)
aunque la forma mas com
un es desde el men
u Paquetes > Instalar paquete(s) desde archivos
Zip locales..., seleccionaremos la librera descargada y directamente se anexara en el programa.
Si nuestro sistema operativo es Linux, tenemos dos formas distintas de instalar un paquete:
La forma mas comoda es mediante los comandos install.packages( ) o update.packages( ).
Tambien nos permiten instalarlos si no eres root en este caso debemos especificar el lib.loc..
R CMD INSTALL paquete-x.y.z.tar.gz, permite instalar paquetes, aunque uno no sea un root
(especificar el directorio).
Despues de haber instalado la librera en el programa, para poder utilizarla debemos de
cargar el paquete. Esto lo vamos a hacer de la siguiente manera:
La forma mas com
un es mediante desde el men
u Paquetes > cargar paquete..., aparecera una lista con todos las libreras instaladas y nos pedira que instalemos una de ellas,
simplemente seleccionando una la tendremos operativa.
Con la funcion search( ) podemos ver los libros que hay actualmente en memoria y con la
funcion library( ) una lista con los R packages available (libreras disponibles). Si dentro
de los parentesis ponemos el nombre de una de ellas, se cargara para su uso (aparecera en
segunda posicion el la lista de libros en memoria).
> search()
[1] ".GlobalEnv"
"package:stats"
[4] "package:grDevices" "package:utils"
[7] "package:methods"
"Autoloads"
"package:graphics"
"package:datasets"
"package:base"
Primeras nociones
> library()
> library(sampling)
> search()
[1] ".GlobalEnv"
[4] "package:MASS"
[7] "package:grDevices"
[10] "package:methods"
10
"package:sampling"
"package:stats"
"package:utils"
"Autoloads"
"package:lpSolve"
"package:graphics"
"package:datasets"
"package:base"
Funciones ls y rm
La funcion ls saca en pantalla los objetos almacenados en la memoria por el usuario, aunque
solo muestra los nombres de los mismos. Si se quiere listar solo aquellos objetos que contengan
un caracter en particular ls(pat =) (usamos la opcion pattern, que se puede abreviar como
pat) y para restringir la lista a aquellos objetos que comienzan con este caracter utilizamos el
smbolo exponente ls(pat =). Tenga en cuenta que es recomendable conocer los elementos
que R tiene en memoria, aparte de los que hemos memorizado nosotros. Esto se consigue con
la orden ls(9). La funcion ls.str( ) muestra algunos detalles de los objetos en memoria.
Al igual que antes la opcion pattern se puede usar de la misma manera con ls.str( ).
Otra opcion u
til en esta funcion es max.level que especifica el nivel de detalle de visualizacion de objetos compuestos. Hay que tener en cuenta que ls.str( ) muestra todos
los detalles de los objetos en memoria, incluyendo las columnas de los marcos de datos (data
frames), matrices y listas, lo cual puede generar una gran cantidad de informacion. Podemos
evitar mostrar todos estos detalles con la opcion max.level = 1.
> nombre<-"pepe"; x1<-5; x2<-100; b<-0.5
> ls()
[1] "b"
"nombre" "x1"
"x2"
> ls(pat="b")
[1] "b"
"nombre"
> ls(pat="^b")
[1] "b"
> ls.str()
b : num 0.5
nombre : chr "pepe"
x1 : num 5
x2 : num 100
> B <- data.frame(x1,x2,b)
> B
x1 x2
b
1 5 100 0.5
> ls.str(pat="B")
B : data.frame:
1 obs. of 3 variables:
$ x1: num 5
$ x2: num 100
$ b : num 0.5
Para borrar objetos almacenados en la memoria, utilizamos la funcion rm(), por ejemplo
rm(x) elimina el objeto x; rm(x, y) elimina ambos objetos x e y, y rm(list = ls( )) elimina
todos los objetos que esten en la memoria. Tenga en cuenta que las opciones mencionadas para
la funcion ls( ) pueden aplicarse para borrar selectivamente algunos objetos.
Contreras J.M., Molina E. y Arteaga P.
Primeras nociones
11
> rm(nombre)
> ls()
[1] "b" "B" "x1" "x2"
> #Hemos borrano "nombre"
> rm(list=ls(pat="x"))
> ls()
[1] "b" "B"
> #Hemos borrano las asignaciones que empiezan por x
> rm(list=ls())
> ls()
character(0)
> #Hemos borrano todo
Funci
on library
La funcion library gestiona los libros de la biblioteca, dando informacion sobre los existentes y cargandolos en memoria o descargandolos de la misma. Un libro esta formado por
funciones, datos y documentacion; todos ellos contenidos en un directorio que contiene varios
subdirectorios, con informaciones diversas, de acuerdo con un formato establecido. De hecho,
al cargar R, se carga al menos un primer libro denominado base.
Por ejemplo library() devuelve una lista de los libros que hay en la biblioteca predeterminada de R. library(help=base) devuelve una peque
na ayuda sobre el libro base. Si
consultamos la lista de b
usqueda observaremos los libros que hay actualmente en memoria.
> library()
Packages in library C:/PROGRA~1/R/R-210~1.1/library:
agricolae
akima
animation
base
bitops
boot
caTools
class
cluster
...
...
> search()
[1] ".GlobalEnv"
[5] "package:utils"
[8] "Autoloads"
"package:stats"
"package:datasets"
"package:base"
"package:graphics"
"package:methods"
"package:grDevices"
"package:stats"
"package:datasets"
"package:graphics"
Primeras nociones
[8] "package:methods"
12
"Autoloads"
"package:base"
prob
0.9-2
2009-1-18
Elementary Probability on Finite Sample Spaces
G. Jay Kerns <[email protected]>
G. Jay Kerns <[email protected]>
combinat, fAsianOptions, hypergeo, VGAM
no
Operaciones con n
umeros reales y complejos:
R es un lenguaje interpretado, es decir podemos escribir ordenes y R las ejecutara inmediatamente.
De hecho puede utilizar R como una calculadora, ya que es capaz de manejar todas las
operaciones elementales: suma, resta, multiplicacion, division, exponenciacion, division entera
y modulo, que se realizan mediante los smbolos: + , - , * , /, , % / % y % %.
Es importante saber que R no eval
ua una expresion hasta que tiene la certeza de que se
ha terminado su escritura. Si la expresion comienza con un parentesis, deberemos cerrar la
expresion con otro parentesis sino se considerara que no termino la accion, igualmente con
corchetes, llaves etc. En general, para cualquier funcion, su escritura sin los parentesis indica
al lenguaje que debe devolver la definicion, en tanto que al incluir parentesis, le indica que
intente ejecutarla.
> # R como calculadora
> 2+3
[1] 5
> 7*3
[1] 21
> 15/3
[1] 5
Primeras nociones
13
> 15/4
[1] 3.75
> 3^4
[1] 81
># Cociente de la divisi
on
> 15%/%4
[1] 3
># Recto de la divisi
on
> 15%%4
[1] 3
R proporciona funciones para hacer todo tipo de operaciones basicas: sumas, senos, cosenos,
races, . . .
sum( ) Suma de los elementos
sqrt( ) Raz cuadrada.
abs( ) Valor absoluto.
sin( ), cos( ), . . . Funciones trigonometricas.
log( ), exp( ) Logaritmo y exponencial.
round( ), signif ( ) Redondeo de valores numericos.
> seq(1, 9, by = 2)
[1] 1 3 5 7 9
> rep(1:3,3)
[1] 1 2 3 1 2 3 1 2 3
> sqrt(81)
[1] 9
> abs(-9)
[1] 9
> sin(-2*pi)
[1] 2.449213e-16
> log(100)
[1] 4.60517
Primeras nociones
14
> exp(3)
[1] 20.08554
> round(2.345632)
[1] 2
> round(2.3456432, 3)
[1] 2.346
> signif(2.345432, 3)
[1] 2.35
Operadores Comparativos y L
ogicos:
Los operadores comparativos y l
ogicos son muy importantes a la hora de programar funciones ya que gracias
a ellos podemos podremos hacer distinciones de datos, agrupaciones, etc. Veamos una peque
na introduccion
de ellos:
Los operadores comparativos o de relaci
on interaccionan sobre cualquier tipo de elemento devolviendo uno
o varios valores l
ogicos. Siempre necesitan dos elementos (a < b) para poder actuar.
Los operadores l
ogicos pueden actuar sobre uno o dos objetos de tipo logico, y pueden devolver uno (o
varios) valores l
ogicos.
<
>
<=
>=
==
!=
Relaci
on
menor que
mayor que
menor o igual que
mayor o igual que
igual
diferente
!x
x&y
x && y
x|y
x||y
xor(x, y)
Logicos
Negacion
conjuncion
igual ()
disyuncion
igual ()
O exclusivo ()
() Si se escriben dos smbolos repetidos, estos tienen el mismo significado que si apareciese uno, pero la
diferencia consiste en que se eval
ua primero la parte de la izquierda y, si ya se sabe el resultado (suponiendo
que se pudiera calcular la expresi
on de la derecha) no se sigue evaluando, por lo que pueden ser mas rapidos y
eliminar errores.
() Da como valor verdadero si uno y solo un argumento es valido.
Para comparar totalmente dos objetos es necesario usar la funcion identical( ).
> # Asignamos a x el valor 10
> x<-10; x
[1] 10
> # Le preguntamos si x es menor que 5
> x<5
[1] FALSE
> # Le preguntamos si x es mayor o igual que 5
> x>=5
[1] TRUE
> # Le preguntamos si x vale 5
> x==5
[1] FALSE
> # Le preguntamos si x es distinto de 5
> x!=5
[1] TRUE
Primeras nociones
15
A & B
A | B
V
V
F
F
V
F
V
F
V
F
F
F
V
V
F
F
V
F
V
F
V
V
V
F
> A<-c(TRUE,FALSE);A
[1] TRUE FALSE
> !A
[1] FALSE TRUE
> B<-c(TRUE,TRUE);B
[1] TRUE TRUE
> xor(A,B)
[1] FALSE TRUE
> # A y B
> A & B
[1] TRUE FALSE
> A && B
[1] TRUE
> # A o B
> A | B
[1] TRUE TRUE
> A || B
[1] TRUE
> # Podemos comparar los elementos x e y creados anteriormente con:
Primeras nociones
16
> x<y
[1] TRUE TRUE FALSE TRUE FALSE
> x<=y
[1] TRUE TRUE TRUE TRUE TRUE
> x>=y
[1] FALSE FALSE TRUE FALSE TRUE
> x>y
[1] FALSE FALSE FALSE FALSE FALSE
> x[x>y]
integer(0)
> # No lo forma ning
un elemento
> x[x<y]
[1] 1 2 4
> # Son los elementos de x que cumplen la condici
on
> y[x>y]
numeric(0)
> x[x<=y]
[1] 1 2 3 4 5
Parte III
Manipulaci
on de Datos
17
Manipulaci
on de Datos
Operaciones con Vectores.
El primer tipo de objeto que manejaremos es el vector (coleccion ordenada de elementos del mismo tipo).
Podemos escribir vectores de varias maneras, utilizando la opcion : (el vector comienza en el primer n
umero
suministrado y finaliza en el segundo o en un n
umero anterior sin sobrepasarlo, tanto en orden ascendente
como descendente)
o mediante la funci
on de concatenacion c( ).
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
> 10:1
[1] 10 9 8 7 6 5 4 3 2 1
> 1.5:7.5
[1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5
> c(1,2,4,3)
[1] 1 2 4 3
> c(1:5)
[1] 1 2 3 4 5
> c(1:5,2,4,-3)
[1] 1 2 3 4 5 2 4 -3
Tenemos formas adicionales de crear vectores. Una de las mas comunes es utilizando la funcion seq(a,b,c),
que genera secuencias de n
umeros reales, donde el primer elemento indicara el principio de la secuencia, el
segundo el final y el tercero el incremento que se debe usar para generar la secuencia. Aunque tambien podemos
poner la funcion de estas formas seq(length = d, f rom = a, to = b) o seq(by = c, f rom = a, to = b) siendo
d la longitud del vector.
> seq(1,10,2)
[1] 1 3 5 7 9
> seq(from = 1, to = 20, by =2)
[1] 1 3 5 7 9 11 13 15 17 19
> seq(1,10,2)
[1] 1 3 5 7 9
> seq(from = 1, to = 10, by =2)
[1] 1 3 5 7 9
> # Si lo que queremos es 6 elementos
> seq(from = 1, to = 10, length =6)
[1] 1.0 2.8 4.6 6.4 8.2 10.0
> Con el argumento along creamos un vector con los indices del vector al que llamemos
> x<-c(1,2,1,3,4)
> seq(along=x)
[1] 1 2 3 4 5
> y<-25
> seq(along=y)
18
Manipulacion de Datos
19
[1] 1
Manipulacion de Datos
20
Finalmente, expand.grid( ) crea una tabla de datos con todas las combinaciones posibles de los elementos
de los vectores o factores que proporcionemos como argumentos.
> expand.grid(edad=c(36,25), peso=c(75,60), sexo=c("Hombre","Mujer"))
edad peso
sexo
1
36
75 Hombre
2
25
75 Hombre
3
36
60 Hombre
4
25
60 Hombre
5
36
75 Mujer
6
25
75 Mujer
7
36
60 Mujer
8
25
60 Mujer
> # Crea todas las combinaciones posibles
R puede escribir vectores con caracteres o n
umeros, pero siempre entiende los elementos como si fuesen del
mismo tipo.
Un vector siempre est
a formado por elementos del mismo tipo, no pueden mezclarse n
umeros y cadenas de
caracteres (se transformara en cadenas de caracteres). Del mismo modo, si mezcla n
umeros reales y complejos,
se entenderan como complejos.
> c("Hola", "Adios")
[1] "Hola" "Adios"
> c(1, 1+2i)
[1] 1+0i 1+2i
> c(1-1i, 2)
[1] 1-1i 2+0i
> dias.semana=c("Lunes","Martes","Mi
ercoles","Jueves","Viernes","S
abado","Domingo")
> dias.semana
[1] "Lunes"
"Martes"
"Mi
ercoles" "Jueves"
"Viernes"
"S
abado"
[7] "Domingo"
Una opcion de R es que podemos asignar nombres a los elementos de un vector mediante la funcion
names(tambien se podr
a utilizar para nombrar cualquier objeto).
> x<-1:7
> x
[1] 1 2 3 4 5 6 7
> names(x)<-c("Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo")
> x
Lunes
Martes Miercoles
Jueves
Viernes
Sabado
Domingo
1
2
3
4
5
6
7
Tambien podemos conocer o cambiar el modo o tipo de los elementos que forman el vector mediante
la funcion mode (tomara los valores: logical, numeric, complex, character, null, list, function, graphics,
expression, name, frame, raw y unknown).
> y<-seq(from=3, to=11, by=2)
> y
[1] 3 5 7 9 11
> mode(y)
[1] "numeric"
> # Cambiamos y a complejo
> mode(y)<-"complex"
> y
[1] 3+0i 5+0i 7+0i 9+0i 11+0i
Manipulacion de Datos
21
Manipulacion de Datos
22
Manipulacion de Datos
23
Levels: 1 2 3 4 5
> # Tres niveles con etiquetas
> factor(1:3, labels=c("A","B","C"))
[1] A B C
Levels: A B C
> # Un vector de dos elementos con cuatro niveles
> aa<-factor(c(2,3),levels=2:5)
> aa
[1] 2 3
Levels: 2 3 4 5
> levels(aa)
[1] "2" "3" "4" "5"
> factor(c("Mujer","Mujer","Hombre"))
[1] Mujer Mujer Hombre
Levels: Hombre Mujer
> levels(factor(c("Mujer","Mujer","Hombre")))
[1] "Hombre" "Mujer"
Con la opci
on exclude, por ejemplo f actor(1 : 5, exclude = 4) excluimos los valores de los niveles que
necesitemos y con ordered especificamos si los niveles del factor estan ordenados.
> # Cinco niveles excluyendo el cuarto
> factor(1:5, exclude=4)
[1] 1
2
3
<NA> 5
Levels: 1 2 3 5
Un error muy com
un es utilizar variables aparentemente numericas en analisis estadsticos, por ejemplo no
telefonicos o codigos postales. Por ello antes de utilizar un vector con caracteres cualitativos o cuantitativos
dentro de un an
alisis, hace falta convertirlo en un factor.
Existen funciones que nos permiten convertir diferentes clases de objetos a modos diferentes. Una situacion
frecuente es la conversi
on de factores a valores numericos. En este caso, R realiza la conversion usando las
expresiones as.numeric y as.character. Para realizar la conversion manteniendo los valores literales del
factor, primero se debe convertir a car
acter y despues a numerico. Este procedimiento puede ser bastante u
til
si en un archivo una variable numerica tambien tiene valores no-numericos.
> c.p<-c(18002,18194,18199)
> c.p
[1] 18002 18194 18199
> mode(c.p)
[1] "numeric"
> codigo.postal<-factor(c.p)
> codigo.postal
[1] 18002 18194 18199
Levels: 18002 18194 18199
> f<-factor(c(1,3))
> f
[1] 1 3
Levels: 1 3
> as.numeric(f)
[1] 1 2
> # No ha guardado los valores
> # Para guardarlos primero lo convertimos en car
acter y luego en num
erico
> as.numeric(as.character(f))
[1] 1 3
Manipulacion de Datos
24
A continuaci
on tenemos una tabla con un conjunto de funciones muy u
tiles a la hora de trabajar con
vectores:
mean(x)
median(x)
sum(x)
max(x)
min(x)
range(x)
var(x)
cov(x)
cor(x,y)
sort(x)
rank(x)
order(x)
quantile(x)
cumsum(x)
cumprod(x)
cummax(x)
cummin(x)
pmax(x,y,z)
pmin(x,y,z)
> n=length(x)
> sum((x-mean(x))^2)/(n-1)
[1] 2.5
> # La varianza ser
a
> ((n-1)/n)*var(x)
[1] 2
> sum((x-mean(x))^2)/(n)
[1] 2
Manipulacion de Datos
25
> # La cuasicovarianza
> cov(x,y)
[1] 1.5
> sum((x-mean(x))*(y-mean(y)))/(n-1)
[1] 1.5
> # La covarianza ser
a
> ((n-1)/n)*cov(x,y)
[1] 1.2
> sum((x-mean(x))*(y-mean(y)))/(n)
[1] 1.2
> cor(x,y)
[1] 0.5669467
> sort(x)
[1] 1 2 3 4 5
> sort(y)
[1] 1 1 3 3 5
> rank(x)
[1] 1 2 3 4 5
> rank(y)
[1] 1.5 3.5 3.5 1.5 5.0
> order(y)
[1] 1 4 2 3 5
> quantile(x)
0% 25% 50% 75% 100%
1
2
3
4
5
> cumsum(y)
[1] 1 4 7 8 13
> cumprod(y)
[1] 1 3 9 9 45
> cummax(x)
[1] 1 2 3 4 5
> cummin(x)
[1] 1 1 1 1 1
> pmax(x,y,z)
[1] 1 3 3 4 5
> pmin(x,y,z)
[1] 1 2 3 1 3
Manipulacion de Datos
26
Manipulacion de Datos
27
>
>
>
>
>
Manipulacion de Datos
28
[2,]
16
96 144
Mensajes de aviso perdidos
In M2 * (3:6) :
longitud de objeto mayor no es m
ultiplo de la longitud de uno menor
> M2*(1:2)
[,1] [,2] [,3]
[1,]
1
9
25
[2,]
8
32
72
Tambien es posible realizar el producto matricial mediante el operador % * %.
> A1<-matrix(1:6,2,3)
> A1
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
> B1<-matrix(1:12,3,4)
> B1
[,1] [,2] [,3] [,4]
[1,]
1
4
7
10
[2,]
2
5
8
11
[3,]
3
6
9
12
> A1%*%B1
[,1] [,2] [,3] [,4]
[1,]
22
49
76 103
[2,]
28
64 100 136
> B1%*%A1
Error en B1 %*% A1 : argumentos no compatibles
> # Hay que tener en cuenta las dimensiones de las matrices
La funcion crossprod devuelve el producto matricial cruzado de dos matrices (la traspuesta de la primera
matriz, multiplicada por la segunda). Si no especifica segunda matriz, R la toma igual a la primera, con lo que
obtiene X t X.
> A1<-matrix(1:6,2,3)
> A2<-matrix(c(1,1,2,3),2)
> A1
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
> crossprod(A1)
[,1] [,2] [,3]
[1,]
5
11
17
[2,]
11
25
39
[3,]
17
39
61
> crossprod(A1,A2)
[,1] [,2]
[1,]
3
8
[2,]
7
18
[3,]
11
28
La funcion outer realiza el producto exterior de dos matrices (o vectores) sobre una funcion dada.
Tambien puede usarse en forma de operador mediante % o %, en cuyo caso la funcion utilizada es el producto.
Manipulacion de Datos
29
> x<-1:5
> y<-1.3
> outer(x,y)
[,1]
[1,] 1.3
[2,] 2.6
[3,] 3.9
[4,] 5.2
[5,] 6.5
> x%o%y
[,1]
[1,] 1.3
[2,] 2.6
[3,] 3.9
[4,] 5.2
[5,] 6.5
Mediante la funci
on t( ) calculamos la matriz traspuesta.
> A1
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
> t(A1)
[,1] [,2]
[1,]
1
2
[2,]
3
4
[3,]
5
6
La funcion diag( ) se puede usar para extraer o modificar la diagonal de una matriz o para construir
una matriz diagonal.
> m1<-matrix(1,nr=2,nc=2)
> m1
[,1] [,2]
[1,]
1
1
[2,]
1
1
> m2<-matrix(2,nr=2,nc=2)
> m2
[,1] [,2]
[1,]
2
2
[2,]
2
2
> # Unimos las dos matrices por filas
> rbind(m1,m2)
[,1] [,2]
[1,]
1
1
[2,]
1
1
[3,]
2
2
[4,]
2
2
> # Unimos las dos matrices por columnas
> cbind(m1,m2)
[,1] [,2] [,3] [,4]
[1,]
1
1
2
2
[2,]
1
1
2
2
Manipulacion de Datos
30
> diag(m1)
[1] 1 1
> diag(m2)
[1] 2 2
> diag(m1)=15
> m1
[,1] [,2]
[1,]
15
1
[2,]
1
15
> # Creamos una matriz diagonal de orden 4
> diag(4)
[,1] [,2] [,3] [,4]
[1,]
1
0
0
0
[2,]
0
1
0
0
[3,]
0
0
1
0
> v<-c(10,15,20)
> diag(v)
[,1] [,2] [,3]
[1,]
10
0
0
[2,]
0
15
0
[3,]
0
0
20
> diag(3.6,nr=2,nc=5)
[,1] [,2] [,3] [,4] [,5]
[1,] 3.6 0.0
0
0
0
[2,] 0.0 3.6
0
0
0
> # Tambi
en podemos operar
> diag(rbind(m1,m2)%*%cbind(m1,m2))
[1] 226 226
8
8
La funcion solve invierte una matriz (si se le da un argumento) y resuelve sistemas lineales de ecuaciones
(cuando se le dan dos) El primer argumento es una matriz que debe ser cuadrada no singular, y el segundo
argumento (opcional) es un vector o matriz de coeficientes. Tambien podemos utilizarla para resolver sistemas
de ecuaciones (por ejemplo x + 2y = 1, x + 3y = 2), pasando el sistema a forma matricial.
> A2
[,1] [,2]
[1,]
1
2
[2,]
1
3
> b1=c(1,2)
> b1
[1] 1 2
> solve(A2)
[,1] [,2]
[1,]
3
-2
[2,]
-1
1
> solve(A2,b1)
[1] -1 1
La funcion eigen calcula los autovalores y autovectores de una matriz cuadrada, el resultado es una lista
de dos componentes llamados values y vectors. Con la funcion det calculamos el determinante de una matriz
cuadrada. Adem
as existen funciones como svd( ) que calcula la descomposicion u*v.
> A2
Manipulacion de Datos
31
[,1] [,2]
[1,]
1
2
[2,]
1
3
> eigen(A2)
$values
[1] 3.7320508 0.2679492
$vectors
[,1]
[,2]
[1,] -0.5906905 -0.9390708
[2,] -0.8068982 0.3437238
> det(A2)
[1] 1
> svd(A2)
$d
[1] 3.8643285 0.2587772
$u
[,1]
[,2]
[1,] -0.5760484 -0.8174156
[2,] -0.8174156 0.5760484
$v
[,1]
[,2]
[1,] -0.3605967 -0.9327218
[2,] -0.9327218 0.3605967
Una opcion interesante es construir matrices uniendo otras matrices, esto lo conseguimos con las funciones
cbind() y rbind() que las une horizontalmente (modo columna) o verticalmente (modo fila) respectivamente.
> x1<-matrix(1:5,nr=3,nc=5)
> x1
[,1] [,2] [,3] [,4] [,5]
[1,]
1
4
2
5
3
[2,]
2
5
3
1
4
[3,]
3
1
4
2
5
>
> i<-matrix(c(1:5,3:1),nr=3,nc=2)
> i
[,1] [,2]
[1,]
1
4
[2,]
2
5
[3,]
3
3
> # Uno x1 y i por columnas
> x1i<-cbind(x1,i)
> x1i
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]
1
4
2
5
3
1
4
[2,]
2
5
3
1
4
2
5
[3,]
3
1
4
2
5
3
3
> # Uno x1 y x2 por filas
> x11<-rbind(x1,x1)
> x11
Manipulacion de Datos
[1,]
[2,]
[3,]
[4,]
[5,]
[6,]
32
a=c(1,3,2)
b=1.3
b=1:3
table(a,b)
b
a
1 2 3
1 1 0 0
2 0 0 1
3 0 1 0
Manipulacion de Datos
> z
, , 1
[,1] [,2]
[1,]
1
3
[2,]
2
4
, , 2
[,1] [,2]
[1,]
2
4
[2,]
3
5
, , 3
[,1] [,2]
[1,]
3
5
[2,]
4
1
> z[1,,]
[,1] [,2]
[1,]
1
2
[2,]
3
4
[3,]
5
1
> z[1,1,]
[1] 1 2 3
> z[1,1,1]
33
[,3]
5
1
[,3]
1
2
[,3]
2
3
[,3]
3
5
2
Una variable indexada puede utilizar no solo un vector de ndices, sino incluso una variable indexada de
ndices, tanto para asignar un vector a una coleccion irregular de elementos de una variable indexada como
para extraer una colecci
on irregular de elementos.
La funcion aperm permite trasponer una variable multiindexada indicando la propia variable como primer
argumento y el vector de permutaciones de ndices como segundo.
> x<-array(1:6,dim=c(2,3))
> x
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
> xt=aperm(x,c(2,1))
> xt
[,1] [,2]
[1,]
1
2
[2,]
3
4
[3,]
5
6
Listas.
Una lista se construye con la funci
on list que devuelve un objeto de tipo lista con tantos componentes como
argumentos se le suministren y es utilizado para devolver el resultado de una funcion.
> dias.semana=c("Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo")
> dias.semana
[1] "Lunes"
"Martes"
"Miercoles" "Jueves"
"Viernes"
"Sabado"
[7] "Domingo"
> list(A=dias.semana,B=1:7)
$A
[1] "Lunes"
"Martes"
"Miercoles" "Jueves"
"Viernes"
"Sabado"
Manipulacion de Datos
34
[7] "Domingo"
$B
[1] 1 2 3 4 5 6 7
Puede referirse a cada uno de los elementos de la lista de dos formas distintas: Si tiene nombre, como en
este caso, mediante el nombre de la lista, el smbolo $ y el nombre del elemento. En cualquier caso, siempre
puede referirse a el mediante el ndice de posicion entre dobles corchetes.
> list(A=dias.semana,B=1:7)$A
[1] "Lunes"
"Martes"
"Mi
ercoles" "Jueves"
> list(A=dias.semana,B=1:7)$B
[1] 1 2 3 4 5 6 7
> list(A=dias.semana,B=1:7)[[2]]
[1] 1 2 3 4 5 6 7
> list(A=dias.semana,B=1:7)[[1]]
[1] "Lunes"
"Martes"
"Mi
ercoles" "Jueves"
"Viernes"
"S
abado"
"Domingo"
"Viernes"
"S
abado"
"Domingo"
La diferencia fundamental entre las tres formas, [, [[ y $ es que la primera permite seleccionar varios
elementos, en tanto que las dos u
ltimas solo permiten seleccionar uno. Ademas, $ no permite utilizar ndices
calculados. El operador [[ necesita que se le indiquen todos los ndices (ya que debe seleccionar un solo elemento)
en tanto que [ permite obviar ndices, en cuyo caso se seleccionan todos los valores posibles. Si se aplican a una
lista, [[ devuelve el elemento de la lista especificado y [ devuelve una lista con los elementos especificados.
> lista1<-list(A=dias.semana,B=1:7)
> lista2<-list(lista1,C="Hola", D=matrix(1:8,2))
> lista1
$A
[1] "Lunes"
"Martes"
"Miercoles" "Jueves"
"Viernes"
"Sabado"
"Domingo"
"Miercoles" "Jueves"
"Viernes"
"Sabado"
"Domingo"
"Miercoles" "Jueves"
"Viernes"
"Sabado"
"Domingo"
$B
[1] 1 2 3 4 5 6 7
> lista2
[[1]]
[[1]]$A
[1] "Lunes"
"Martes"
[[1]]$B
[1] 1 2 3 4 5 6 7
$C
[1] "Hola"
$D
[1,]
[2,]
> lista2[[1]]
$A
[1] "Lunes"
"Martes"
$B
Manipulacion de Datos
35
[1] 1 2 3 4 5 6 7
> lista2[[3]]
[,1] [,2] [,3] [,4]
[1,]
1
3
5
7
[2,]
2
4
6
8
> lista2[[3]][2,4]
[1] 8
Manipulacion de Datos
36
Sexo
1 Hombre
2 Hombre
3 Mujer
Para introducir un vector de nombres como tales, sin transformarlo en factores, debe utilizar la funcion
I( ).
> nombres<-c("Pepe","Paco","Pepita")
> nombres
[1] "Pepe"
"Paco"
"Pepita"
> datos3<-data.frame(datos2, Nombres=I(nombres))
> datos3
Peso Altura
Sexo Nombres
1
90
1.90 Hombre
Pepe
2 120
1.87 Hombre
Paco
3
56
1.70 Mujer Pepita
Si desea seleccionar un subconjunto de una hoja de datos, puede hacerlo con la funcion subset. Funcion
que puede utilizar tambien en vectores.
Para realizar modificaciones en un data frame es muy u
til la funcion tansf orm.
> datos3
Peso Altura
Sexo Nombres
1
90
1.90 Hombre
Pepe
2 120
1.87 Hombre
Paco
3
56
1.70 Mujer Pepita
> subset(datos3,select=c(Sexo,Nombres))
Sexo Nombres
1 Hombre
Pepe
2 Hombre
Paco
3 Mujer Pepita
> subset(datos3,subset=c(Sexo=="Mujer"))
Peso Altura Sexo Nombres
3
56
1.7 Mujer Pepita
> transform(datos3,logPeso=log(Peso))
Peso Altura
Sexo Nombres logPeso
1
90
1.90 Hombre
Pepe 4.499810
2 120
1.87 Hombre
Paco 4.787492
3
56
1.70 Mujer Pepita 4.025352
> transform(datos3,IMC=Peso/(Altura)^2)
Peso Altura
Sexo Nombres
IMC
1
90
1.90 Hombre
Pepe 24.93075
2 120
1.87 Hombre
Paco 34.31611
3
56
1.70 Mujer Pepita 19.37716
Hay una serie de funciones que permiten comprobar si un objeto es de un tipo determinado, todas comienzan
por is., o cambiar el objeto a un tipo concreto, funciones que comienzan por as.
> x<-1:10
> is.vector(x)
[1] TRUE
> is.data.frame(x)
Manipulacion de Datos
37
[1] FALSE
> x<-as.data.frame(x)
> is.data.frame(x)
[1] TRUE
La funcion de R data.f rame concatena todas las variables en un solo conjunto de datos, tambien podemos guardar en un archivo dicho conjunto de datos utilizando la funcion write.table.
El formato del archivo guardado es .CSV (comma separated variables, variables separadas por comas), el
cual es un formato de texto muy f
acil de leer con cualquier editor de texto o con Excel. El archivo se puede ser
ledo en R a traves de la funci
on read.csv.
La notacion $ para componentes de listas, como por ejemplo cont$dom, no siempre es la mas apropiada.
En ocasiones, sera c
omodo que los componentes de una lista o de una hoja de datos pudiesen ser tratados
temporalmente como variables cuyo nombre fuese el del componente, sin tener que especificar explcitamente
el nombre de la lista.
La funcion attach( ) puede tener como argumento el nombre de una lista o de una hoja de datos y
permite conectar la lista o la hoja de datos directamente. Supongamos que abc es una hoja de datos con tres
variables, abc$u, abc$v y abc$w.
La orden attach(abc)conecta la hoja de datos colocandola en la segunda posicion de la trayectoria de
b
usqueda y, supuesto que no existen variables denominadas u, v o w en la primera posicion; u, v y w apareceran
como variables por s mismas. Sin embargo, si realiza una asignacion a una de estas variables, como por ejemplo
u v + w no se sustituye la componente u de la hoja de datos, sino que se crea una nueva variable, u, en
el directorio de trabajo, en la primera posicion de la trayectoria de b
usqueda, que enmascarara a la variable u
de la hoja de datos. Para realizar un cambio en la propia hoja de datos, basta con utilizar la notacion $, como
en lentejas$u v + w. Este nuevo valor de la componente u no sera visible de modo directo hasta que
desconecte y vuelva a conectar la hoja de datos.
Para desconectar una hoja de datos, utilice la funcion detach(). Esta funcion desconecta la entidad que
se encuentre en la segunda posici
on de la trayectoria de b
usqueda. Una vez realizada esta operacion dejaran de
existir las variables u, v y w como tales, aunque seguiran existiendo como componentes de la hoja de datos. Las
entidades que ocupan en la trayectoria de b
usqueda posiciones superiores a la segunda, pueden desconectarse
dando su posici
on o su nombre como argumento a la funcion detach. Aunque es preferimos la segunda opcion,
como por ejemplo detach(abc) o detach(abc).
Hay que tener en cuenta que la trayectoria de b
usqueda puede almacenar un n
umero finito y peque
no de
elementos, por tanto no debemos conectar una misma hoja de datos mas de una vez. Del mismo modo, es
conveniente desconectar una hoja de datos cuando termine de utilizar sus variables.
Manipulacion de Datos
38
pueden a
nadir a la funci
on tales como indicar el tipo de valores de los datos (logicos, enteros, etc.) el n
umero
de columnas, etc.
> # Leemos el archivo s.txt y lo llamo Datos
> Datos <- read.table("C:/Users/jmcontreras/Desktop/MALETA/s.txt",
header=FALSE, sep="", na.strings="NA", dec=".")
Con la funci
on View visualizamos los datos que hemos cargado en memoria anteriormente.
> View(Datos)
Manipulacion de Datos
39
La funcion write tiene como argumentos los siguientes write(x, file = data, ncolumns = , append =
FALSE, sep = ), donde x el nombre de la variable que queremos exportar, file es el nombre y tipo de fichero
que crearemos, ncolumns el n
umero de columnas y sep es el separador (en nuestro caso espacios en blanco).
El argumento append es el m
as u
til a la hora de simulaciones ya que con el podemos conservar los datos
del fichero que tuviesemos anteriormente si append=TRUE, solo que los nuevos se a
nadiran a los anteriores en
filas posteriores. Si append = FALSE machacaremos los datos anteriores por los nuevos.
Parte IV
Funciones
40
Funciones
Como hemos visto anteriormente, las funciones permiten realizar las diferentes acciones. Existen funciones
definidas (pueden ser modificadas), pero lo mas importante es que R permite crear objetos del modo function, es decir nos permite construir nuevas funciones de R que realicen tareas que no estaban definidas en el
momento de instalar el programa, que ademas pueden utilizar a su vez en expresiones posteriores ganando
considerablemente en potencia, comodidad y elegancia. Estas nuevas funciones se incorporan al lenguaje y se
utilizan posteriormente como las previamente existentes. Para leer la definicion, basta con escribir el nombre
de la funcion sin parentesis.
Nota: Para obtener ayuda sobre que es lo que hace una funcion utilizaremos la funcion help. Si necesita
ejecutar un programa del sistema operativo puede utilizar la funcion system, que permite incluso salir al sistema operativo con la orden system(cmd).
Para obtener informaci
on del sistema utilizamos shell, por ejemplo en shell(dir).
Las funciones tradicionales en cualquier lenguaje de uso matematico y estadstico, estan definidas. Entre
ellas se encuentran, entre otras, abs, sqrt, sin, cos, tan, asin, acos, atan, exp, log, log10, min, max, sum, prod,
length, mean, range, median, var, cov, summary, sort, rev, order.
> sin(1:5)
[1] 0.8414710 0.9092974
> sin(pi)
[1] 1.224606e-16
> sin(pi/2)
[1] 1
> sum(1:5)
[1] 15
> prod(1:5)
[1] 120
Definici
on de una funci
on
Una funcion se define asignando a un objeto la palabra function seguida de los argumentos que desee
dar a la funcion, escritos entre parentesis y separados por comas, seguida de la orden, entre llaves si son varias
ordenes, que desee asignar a la misma. Entre los argumentos destaca que si utiliza tres puntos seguidos, ..., ello
indica que el n
umero de argumentos es arbitrario.
41
Funciones
42
Ejemplo de creaci
on de una funci
on
> funci
on.suma<-function(A=10,B=5)
+ A+B
> funci
on.suma()
[1] 15
> funci
on.suma
function(A=10,B=5)
A+B
> funci
on.suma(10,3)
[1] 13
> funci
on.suma(12,30)
[1] 42
La funcion que acabamos de definir no se refiere a la suma de dos n
umeros, sino a la suma de dos objetos,
que podran ser vectores, matrices, variables indexadas, etc. Aunque si le asignamos dos valores concretos los
sumara, como hemos visto en el ejemplo anterior.
Si desea poner de manifiesto el valor devuelto, puede utilizar la funcion return que termina la funcion
y devuelve su argumento. Cuando se encuentra esta funcion se detiene la ejecucion y se devuelven los valores
indicados.
> primera.funci
on<-function(A=1,B=2)
+ {
+ #devuelve A+B
+ return(A+B)
+ }
> primera.funci
on()
[1] 3
> primera.funci
on(2,4)
[1] 6
Es posible acceder a los argumentos de una funcion mediante la funcion formals.
> #Almacenamos los valores actuales en argumentos
> formals(primera.funci
on)
$A
[1] 1
$B
[1] 2
> formals(primera.funci
on)->argumentos
> argumentos
$A
[1] 1
Funciones
43
$B
[1] 2
> # Modificamos los valores
> formals(primera.funci
on)=alist(X=,Y=-1)
> primera.funci
on
function (X, Y = -1)
{
return(A + B)
}
> # Recuperamos los valores almacenados
> formals(primera.funci
on)=argumentos
> primera.funci
on
function (A = 1, B = 2)
{
return(A + B)
}
Tambien podemos acceder al cuerpo de la misma mediante la funcion body.
> # Con body almacenamos los valores actuales en cuerpo
> body(primera.funci
on)->cuerpo
> cuerpo
{
return(A + B)
}
> # Modificamos los valores
> body(primera.funci
on)<-expression(A*B)
> primera.funci
on
function (A = 1, B = 2)
A * B
> # Recuperamos los valores almacenados
> body(primera.funci
on)=cuerpo
> primera.funci
on
function (A = 1, B = 2)
{
return(A + B)
}
La orden m
as interesante para modificar funciones es edit, con ella podemos editar la funcion que
necesitemos y adaptarla a nuestras necesidades.
> edit(primera.funci
on)
function (A = 1, B = 2)
{
return(A + B)
}
Aparecera una ventana editable donde podremos cambiar la orden a nuestro antojo.
Funciones
44
Funciones elementales
Como pretendemos que este sea una introduccion al uso de R sobretodo para su uso estadstico, empezaremos con la funci
on m
as com
un en este area: la media.
Funci
on media
Es una funci
on de un solo argumento (si no se especifica lo tomaremos por NA (valor nulo)y el resultado
sera NA). En caso de que se le suministre un argumento, no se comprueba si es valido o no, sino que suponiendo
que es un vector, se eliminan del mismo los elementos correspondientes a NA. Para ello se utiliza la negacion !
y la condicion de ser un valor no disponible.
> media<-function(x=NA)
+ {
+ x<-x[!is.na(x)]
+ sum(x)/length(x)
+ }
> media(c(2,4,1,3,6,7))
[1] 3.833333
> media(c(2,4,1,3,6,NA))
[1] 3.2
Aunque R ya tiene implementada como vimos anteriormente la orden mean que calcula la media de los
valores que le indiquemos.
> mean(c(2,4,1,3,6,7))
[1] 3.833333
Funci
on varianza
Tenemos la opci
on de calcular la varianza de dos maneras:
La definicion de la varianza poblacional como V arianza =
>
+
+
+
+
+
(x
x)2
:
n
Varianza<-function(x=NA)
{
n<-length(x)
v<-sum((x-(sum(x)/n))^2)/n
return(v)
}
> Varianza(1:4)
[1] 1.25
> Varianza(c(2,4,1,3,6,7))
[1] 4.472222
Hay que tener en cuenta que R tiene implementada la orden var que calcula la varianza muestral o
cuasivarianza, por lo que divide por n-1 en vez de por n.
> var(c(2,4,1,3,6,7))
[1] 5.366667
Si lo que queremos es calcular la cuasivarianza muestral tenemos que modificar la anterior funcion.
Funciones
>
+
+
+
+
+
45
Cuasivarianza<-function(x=NA)
{
n<-length(x)
cv<-sum((x-(sum(x)/n))^2)/(n-1)
return(cv)
}
> Cuasivarianza(c(2,4,1,3,6,7))
[1] 5.366667
> var(c(2,4,1,3,6,7))
[1] 5.366667
> # Vemos que ambas coinciden
Otra forma de calcular la varianza es mediante la formula de la relacion entre los momentos.
>
+
+
+
+
+
>
>
+
+
+
+
+
Koning<-function(x=NA)
{
n<-length(x)
v<-mean(x^2)-(mean(x))^2/(n)
return(v)
}
# o
Koning<-function(x=NA)
{
n<-length(x)
v<-sum(x^2)/n-(sum(x)/n)^2
return(v)
}
> Koning(c(2,4,1,3,6,7))
[1] 4.472222
> Koning(1:5)
[1] 2
Pero si lo que queremos es trabajar con var pero queremos que la varianza sea la poblacional lo mejor
es multiplicar por n1
n .
> var(1:5)
[1] 2.5
> # calculamos la longitud del vector
> n<-length(1:5)
> n
[1] 5
> var(1:5)*(n-1)/n
[1] 2
> # Comprobamos que coinciden
> Varianza(1:5)
[1] 2
Funci
on Desviaci
on Tpica
La definicion de la Desviaci
on Tpica poblacional es DT =
Por tanto la definici
on es:
qP
(x
x)2
:
n
Funciones
46
> DT<-function(x=NA)
+ {
+ n<-length(x)
+ v<-sqrt(sum((x-(sum(x)/n))^2)/n)
+ return(v)
+ }
> DT(1:3)
[1] 0.8164966
> DT(c(1,3,4,2,6,4))
[1] 1.598611
Si como con la varianza lo que queremos es que haga referencia solo a la muestra tenemos que dividir por
n-1 en vez de por n.
> DTm<-function(x=NA)
+
{
+
n<-length(x)
+
v<-sqrt(sum((x-(sum(x)/n))^2)/(n-1))
+
return(v)
+
}
> DTm(1:3)
[1] 1
> DTm(c(1,3,4,2,6,4))
[1] 1.75119
Funci
on Covarianza
Definimos la covarianza poblacional de dos conjuntos de datos como Covarianza =
P
(x
x)(y
y)
:
n
> Covarianza<-function(x=NA,y=NA)
+ {
+ n<-length(x) # o la de y
+ cv<-sum((x-(sum(x)/n))^2*(y-(sum(y)/n))^2)/n
+ return(cv)
+ }
> Covarianza(1:4,2:5)
[1] 2.5625
> x<-c(1,3,5,2,3,4)
> y<-c(3,2,1,6,3,2)
> Covarianza(x,y)
[1] 4.046296
Si lo que queremos es la covarianza muestral lo que tenemos que hacer es dividir por n-1 en vez de n.
> CovarianzaM<-function(x=NA,y=NA)
+ {
+ n<-length(x) # o la de y
+ cvm<-sum((x-(sum(x)/n))^2*(y-(sum(y)/n))^2)/(n-1)
+ return(cvm)
+ }
> CovarianzaM(x,y)
[1] 4.855556
Funciones
47
Elementos u
tiles a la hora de programar
Operadores de relaci
on
Con ! se indica la negaci
on, con & la conjuncion y con | la disyuncion. Estos dos u
ltimos, si se escriben
repetidos tienen el mismo significado, pero se eval
ua primero la parte de la izquierda y, si ya se sabe el resultado
(suponiendo que se pudiera calcular la expresion de la derecha) no se sigue evaluando, por lo que pueden ser
mas rapidos y eliminar errores. , ,=,=,== son respectivamente los smbolos de menor, mayor, menor o
igual, mayor o igual, e igual. Advierta que este u
ltimo se escribe con dos signos de igualdad.
Estructuras condicionales.
Son aquellas que, seg
un el resultado de una comparacion, realizan una u otra accion. La primera estructura
es if (condicion) acci
on1 [else acci
on2]
> # Creamos una funci
on que calcule el logaritmo de un n
umero
> logaritmo<-function(x)
+ {
+ if(is.numeric(x)&& min(x)!=0)
+ log(x)
+ else{stop("x no es num
erico o es cero")}
+ }
> logaritmo(3)
[1] 1.098612
> logaritmo(10)
[1] 2.302585
> logaritmo(e)
Error en logaritmo(e) : objeto e no encontrado
> logaritmo("e")
Error en logaritmo("e") : x no es num
erico o es cero
> logaritmo(exp(1))
[1] 1
La segunda estructura es ifelse(condici
on, accion en caso cierto, accion en caso falso).
> Inverso<-function(x)
+ ifelse(x==0,NA,1/x)
> Inverso(-2:3)
[1] -0.5000000 -1.0000000
NA 1.0000000 0.5000000 0.3333333
> Inverso(-10:10)
[1] -0.1000000 -0.1111111 -0.1250000 -0.1428571 -0.1666667 -0.2000000 -0.2500000 -0.3333333
[9] -0.5000000 -1.0000000
NA 1.0000000 0.5000000 0.3333333 0.2500000 0.2000000
[17] 0.1666667 0.1428571 0.1250000 0.1111111 0.1000000
La tercera estructura es switch(expresi
on,[valor-1=]accion-1,....,[valor-n=]accion-n).
> n<-3
> switch(n,"Uno", "Dos","Tres")
[1] "Tres"
> n<-1
> switch(n,"Uno", "Dos","Tres")
[1] "Uno"
> n<-5
> Decidir<-function(x)
+ switch(x,n=cat("Has dicho n min
uscula\n"),
Funciones
48
Estructuras de repetici
on definida e indefinida
Hay tres tipos de estructuras:
for (variable in valores) acci
on, while (condicion) accion y repeat accion.
La estructura for asigna a variable cada uno de los valores y realiza la accion para cada uno. La estructura while eval
ua la condici
on y mientras esta es cierta se eval
ua la accion. La estructura repeat eval
ua
la accion indefinidamente. En los tres casos, el valor del ciclo completo es el de la u
ltima evaluacion de la accion.
Las expresiones pueden contener alg
un condicional como if asociado con las funciones next o break.
La estructura next indica que debe terminarse la iteracion actual y pasar a la siguiente. La estructura
break indica que debe terminarse el ciclo actual.
> for(i in -5:5)
+ {cat(i,"\t", i^3,"\n")
+ }
-5
-125
-4
-64
-3
-27
-2
-8
-1
-1
0
0
1
1
2
8
3
27
4
64
5
125
> for(i in -5:5)
Funciones
49
Invisible
La funcion invisible indica que un objeto no debe mostrarse. La sintaxis es invisible(x) siendo x
cualquier objeto que es devuelto a su vez por la funcion. Esta funcion se usa muy a menudo para no presentar
directamente informaciones devueltas por funciones que, sin embargo, pueden ser utilizadas. Para hacerlo visible
basta con utilizar parentesis.
> x<-2
> (x<-2)
[1] 2
> {x<-2}
> invisible(x)
> x
[1] 2
> (x)
[1] 2
> {x}
Funciones
50
[1] 2
> {x<-1;y<-3;z<-12}
> ({x<-1;y<-3;z<-12})
[1] 12
> x<-y<-z
> x
[1] 12
> y
[1] 12
Ejemplos de funciones
Factorial de un n
umero
> factorial<-function(n)
+ {
+ f<-1
+ if(n>1)
+ for(i in 1:n)
+ f<-f*i
+ return(f)
+ }
> factorial(3)
[1] 6
> factorial(25)
[1] 1.551121e+25
> factorial(0)
[1] 1
Dos procedimientos alternativos a la funcion anterior seran los siguientes. La funcion factorial.3 consume
recursos debido a la recursividad y la funci
on factorial.2 los consume porque genera todos los factores antes de
multiplicarlos, consumiendo memoria.
> factorial.3<-function(n)
+ {
+ f<-1
+ while(n>0)
+ {
+ f<-n*f
+ n<-n-1
+ }
+ return(f)
+ }
> factorial.3(3)
[1] 6
> factorial.3(25)
[1] 1.551121e+25
> factorial.3(0)
[1] 1
> # o
> factorial.2<-function(n)
+ {
+ if(n>1)
Funciones
51
+ f<-n*factorial.2(n-1)
+ else f<-1
+ return(f)
+ }
> factorial.2(3)
[1] 6
> factorial.2(25)
[1] 1.551121e+25
> factorial.2(0)
[1] 1
Progresi
on aritm
etica
Podemos construir tres funciones para implementarla: la primera corresponde a la forma explcita, la
segunda a la forma recursiva y la tercera a la forma recursiva vectorial.
> arit.1<-function(n=1,a1=1,d=1) a1+d*(n-1)
> arit.2<-function(n=1,a1=1,d=1)
+ {
+ if(n>1)
+ {return(arit.2(n-1,a1,d)+d)}
+ else
+ (return(a1))
+ }
> arit.3<-function(n=1,a1=1,d=1)
+ {
+ A=1:n
+ A[1]=a1
+ for(i in 2:n)A[i]=A[i-1]+d
+ return(A[n])
+ }
> arit.1(10)
[1] 10
> arit.2(10)
[1] 10
> arit.3(10)
[1] 10
> # Si queremos comprobar el tiempo que emplea cada una...
Progresi
on geom
etrica
> P.geometrica<-function(n=1,a1=1,r=1)
+ {
+ a1+r^(n-1)
+ }
> P.geometrica
function(n=1,a1=1,r=1)
{
a1+r^(n-1)
}
> P.geometrica()
[1] 2
> P.geometrica(2,3,2)
[1] 5
Funciones
52
Factorial de un n
umero
> n<-10
> # Se crean un par vectores vac
os
> pares<-c()
> impares<-c()
> for(i in 1:n){
#
+ if(i%%2==0) pares<-c(pares,i)
# Si es par
+ else impares<-c(impares,i)}
# Si es impar
> pares
[1] 2 4 6 8 10
> impares
[1] 1 3 5 7 9
Parte V
Dispositivos gr
aficos
53
Dispositivos gr
aficos
Los graficos disponibles en R son todos de gran calidad y poseen una versatilidad muy grande. Para
hacernos una idea (a modo de ejemplo), podemos ejecutar la funcion demo:
> demo("graphics")
54
Dispositivos graficos
55
La orden Devices indica que dispositivos graficos estan disponibles en el sistema en que trabajamos.
Windows , puede utilizar las funciones x11, win.print, pictex, png, jpeg, bmp, win.metafile y postscript. En
cada caso, se abre el dispositivo gr
afico y no se devuelve nada a R.
Funci
on x11.
La funcion x11 abre una ventana gr
afica a la que iran dirigidos los resultados graficos desde ese momento.
Los argumentos de la funci
on, todos opcionales, son width, height y pointsize.
Funci
on pictex.
La funcion pictex genera gr
aficos que pueden utilizarse en TEX y en LATEX. Para utilizarlo en LATEX,
debe incluir la biblioteca pictex.
Dispositivos graficos
56
funciones gr
aficas b
asicas
Algunos de los gr
aficos m
as usuales pueden generarse a partir de basicas tales como:
abline( ) Funci
on que a
nade una o m
as lneas rectas.
plot( ) Funci
on generica para representar en el plano xy puntos, lneas, etc.
barplot( ) Diagramas de barras.
pie( ) Diagramas de sectores.
hist( ) Histogramas.
boxplot( ) Diagramas de box-and-whisker.
stripplot( ) Similares a boxplot( ) con puntos.
sunf lowerplot( ) Representaci
on en el plano xy de diagramas de girasol.
qqnor( ) Diagramas de cuantil a cuantil frente a la distribucion normal.
qqplot( ) Diagramas de cuantil a cuantil de dos muestras.
qqline( ) Representa la lnea que pasa por el primer y el tercer cuartil.
Para crear gr
aficos m
as completos podemos ayudarnos de las siguientes funciones:
lines( ) A
nade lneas a un gr
afico.
points( ) A
nade puntos a un gr
afico.
segments( ) A
nade segmentos a un grafico.
arrows( ) A
nade flechas a un gr
afico.
polygons( ) A
nade polgonos a un gr
afico.
rect( ) A
nade rect
angulos a un gr
afico.
abline( ) A
nade una recta de pendiente e interseccion dada.
curve( ) Representa una funci
on dada.
Veamos a ver algunos de las funciones descritas anteriormente:
plot
plot es una funci
on generica que crea un grafico en el dispositivo grafico actual. Ademas existen funciones
especficas en las que funciona de modo especial, como por ejemplo para data.frame, lm, etc.
> x<-seq(-10,10)
> x
[1] -10 -9 -8 -7 -6 -5 -4 -3 -2
[20]
9 10
> plot(x,x,xlim=c(0,10),ylim=c(0,10))
-1
Dispositivos graficos
57
Lo complicamos un poco m
as.
> plot(1:100,(1:100)^2,type="l")
#
>
#
>
#
>
Generamos un gr
afico de dos variables comprendidas entre -4 y 4
plot(-4:4, -4:4, type = "n")
Representamos 20 n
umeros aleatorios de una distribuci
on normal en rojo
points(rnorm(20), rnorm(20), col = "red")
Representamos 10 n
umeros aleatorios de una distribuci
on normal en azul y m
as grandes
points(rnorm(10), rnorm(10), col = "blue", cex = 3)
Dispositivos graficos
58
Utilizamos la funci
on abline para crear un conjunto de lneas que separen en filas la grafica.
>
+
for(i in 1:10)
abline(h=i,col=i)
Y tambien para crear un conjunto de lneas que separen las lneas por columnas.
>
+
for(i in 1:10)
abline(v=i,col=i)
Dispositivos graficos
59
>
>
>
>
Dispositivos graficos
>
>
>
>
60
polygon
La funcion polygon dibuja un polgono cuyos vertices se dan a partir de dos vectores x e y.
>
>
>
>
plot(0,0,type="n",xlim=c(-5,5),ylim=c(-5,5))
x <-c(0,4,2,-2,-4)
y <-c(-4,0,4,4,0)
polygon(x,y,col="red",border="black")
Dispositivos graficos
61
Tambien podemos utilizar polygon para crear graficos mas complejos como:
>
>
>
>
>
>
n <- 100
xx <- c(0:n, n:0)
yy <- c(c(0,cumsum(stats::rnorm(n))), rev(c(0,cumsum(stats::rnorm(n)))))
plot
(xx, yy, type="n", xlab="Tiempo", ylab="Distancia")
polygon(xx, yy, col="gray", border = "red")
title("Distancia entre los movimientos brownianos")
rect
Con la funci
on rect creamos rect
angulos del color que deseemos.
>
>
>
>
>
Dispositivos graficos
62
arrows y segments
Con la funci
on arrows creamos flechas entre puntos de un par de variables. Consegments creamos
figuras o segmentos a partir de los valores.
> x <- 1:12
> y <- c(10,2,3,10,11,5,6,3,8,11,9,12)
> plot(x,y, main="flechas y segmentos")
> # Flechas
> arrows(x[s], y[s], x[s+1], y[s+1], col= 1:3)
>
>
>
>
# Segmentos
# Volvemos a crear el diagrama de puntos
plot(x,y, main="flechas y segmentos")
segments(x[s], y[s], x[s+1], y[s+1], col= pink)
Dispositivos graficos
63
curve
Con la funci
on curve creamos funciones no lineales, tanto polinomiales como trigonometricas.
> curve(sin, -2*pi, 2*pi)
> curve(tan)
> # Si borramos la gr
afica anterior sale diferente
Dispositivos graficos
64
> # Polinomiales
> curve(x^3-3*x, -2, 2)
Dispositivos graficos
65
Funci
on text.
Una funcion muy u
til es text ya que nos permite a
nadir texto a un grafico existente.
> curve(sin(x),-pi,pi,col="red")
> text(-2,0.5,"seno de x", col="blue")
Gr
aficos estadsticos
barplot
Los diagramas de barras los creamos con la funcion barplot
Empezamos con un ejemplo f
acil, supongamos que hemos recogido unos datos que hemos codificado con
escalas del 1 al 4. Queremos hacer un diagrama de barras con los resultados para cada una de los valores de
las variables.
>
>
>
x
1
7
>
>
>
x<-c(1,2,3,1,2,1,2,4,1,3,2,4,1,2,3,1,2,4,2,1)
# Calculamos la frecuencia acumulada de cada una de las variables
table(x)
2 3 4
7 3 3
frec.x<-table(x)
# Creamos el diagrama de barras con las leyendas
barplot(frec.x, main="Frecuencia relativa", xlab="Valores de la variable")
Dispositivos graficos
66
Vamos a ponerle nombre a las variables y cambiar las barras de vertical a horizontal.
> barplot(frec.x, main="Frecuencia relativa", xlab="valores de la variable",
+ horiz=TRUE,names.arg=c("Menores de 18", "De 18 a 45", "De 45 a 65",
+ "M
as de 65"))
Vamos ahora a complicar un poco los graficos haciendo graficos de barras acumulados:
># Representamos un diagrama de barras con las variables x,y y z;
># agrupadas una al lado de la otra (para juntarlas cambiamos TRUE por FALSE);
># de grosor 45,50 y35;
># con los colores 1 y 2 (negro y rojo) y
># con la leyenda hombre y mujer
> barplot(height = cbind(x = c(4, 9), y = c(8, 2), z = c(3, 7) ), beside = TRUE,
+ width = c(45, 50, 35), col = c(1, 2), legend.text = c("hombre", "mujer"))
Dispositivos graficos
67
pie
Los diagramas de sectores para datos cualitativos los creamos con la funcion pie
Por ejemplo un diagrama b
asico sera:
>
>
>
>
Dispositivos graficos
68
Veamos un ejemplo concreto. Calculamos un diagrama de sectores de la variable Provincias de los alumnos
de 5.
> # Cierro el visor de gr
aficas
> graphics.off()
> # Abro el visor de gr
aficas
> x11()
> Provincias.estudiantes<-c("GR", "CO", "MA", "GR","GR", "MA", "GR","GR", "CO")
> Provincias.estudiantes
[1] "GR" "CO" "MA" "GR" "GR" "MA" "GR" "GR" "CO"
> table(Provincias.estudiantes)
Provincias.estudiantes
CO GR MA
2 5 2
> pie(table(Provincias.estudiantes), col=c("red","blue","green"))
> title("Provincias de nacimiento")
Dispositivos graficos
>
>
>
>
>
>
69
hist
Los histogramas para variables continuas lo representamos con la funcion hist
> # Representamos un histograma de la variable x, con x 1000 datos normales
> x<-rnorm(1000)
> hist(x)
Como vemos crea un histograma con los datos y como estos datos son normales el histograma se asemeja
a la curva normal. Pero R asigna el n
umero de intervalos y la amplitud de ellos. Si queremos modificarlos
utilizamos los argumentos break que indican los puntos de corte junto con otros argumentos para darles
efectos visuales.
Dispositivos graficos
70
># creamos 13 intervalos (12 puntos de corte), de color azul y lineas rosas
> hist(x, freq = FALSE, breaks = 12, col="lightblue", border="pink")
># creamos 4 intervalos (3 puntos de corte), de color azul y lineas rosas
> hist(x, freq = FALSE, breaks = 3, col="red", border="green")
Como vimos anteriormente podemos dibujar el histograma junto con grafica de la normal para ver si los
datos se distribuyen o no normalmente.
> x<-rnorm(1000)
> hist(x,col="red",freq=F,xlim=c(-5,5))
> curve(dnorm(x),-5,5,add=T,col="blue")
boxplots
Con la funci
on boxplots se pueden crear diagramas de cajas para una o varias funciones. Para nuestros
ejemplos vamos a utilizar unos de los datos que R proporciona, la base de datos mtcars.
Mazda RX4
Mazda RX4 Wag
Datsun 710
..
.
mpg
21.0
21.0
22.8
..
.
cyl
6
6
4
..
.
disp
160.0
160.0
108.0
..
.
hp
110
110
93
..
.
drat
3.90
3.90
3.85
..
.
wt
2.620
2.875
2.320
..
.
qsec
16.46
17.02
18.61
..
.
vs
0
0
1
..
.
am
1
1
1
..
.
gear
4
4
4
..
.
carb
4
4
1
..
.
Volvo 142E
21.4
121.0
109
4.11
2.780
18.60
Dispositivos graficos
71
Podemos diferenciar con distintos colores la grafica con los argumentos de boxplot.
> boxplot(mpg~cyl,data=mtcars, main="Kilometraje",
+
xlab="Cilindros", ylab="Kil
ometro por litro", col=(c("gold","darkgreen")))
dotchart
Con la funci
on dotchartcreamos diagramas de puntos por escalas (Cleveland dot plot). Utilizamos para
ello los datos de R VADeaths.
50-54
55-59
60-64
65-69
70-74
Rural Male
11.7
18.1
26.9
41.0
66.0
Rural Female
8.7
11.7
20.3
30.9
54.3
Urban Male
15.4
24.3
37.0
54.6
71.1
Urban Female
8.4
13.6
19.3
35.1
50.0
Dispositivos graficos
72
Dispositivos graficos
73
Funci
on symbols
Esta funcion permite dibujar crculos, cuadrados, rectangulos, estrellas, termometros y cajas en una posicion
determinada de un gr
afico, indicando adem
as el tama
no que deben tener.
> x=1:12
> z<-c(1,2,3,1,2,1,5,2,2,4,5,2)
> symbols(x,z,circles=z,xlim=c(-1,12),ylim=c(0, 5),bg=1:10)
par
Entre los argumentos de la funci
on par hay algunos que permiten presentar graficos m
ultiples. As, el
argumento mfcol=c(m,n), divide el dispositivo grafico en mxn partes iguales, que se rellenan por columnas,
analogamente mfrow=c(m,n) rellena por filas.
>
>
>
>
x=1:10
y=(3:12)^3
par(mfrow=c(2,3))
plot(x)
Dispositivos graficos
>
>
>
>
>
74
plot(y)
plot(x,y)
plot(x^2,y)
plot(x,y^2)
plot(x^2,y^2)
pairs
Esta funcion permite crear una matriz de diagramas de puntos entre mas de dos variables.
>
>
>
>
x<-1:20
y<-rnorm(20)
z<-y^3
pairs(~x+y+z)
Dispositivos graficos
75
Tambien podemos hacer diagramas de puntos en 3D con la funcion scatterplot3d del paquete scatterplot3d.
>
>
>
>
library(scatterplot3d)
# Tomamos los datos mtcars
attach(mtcars)
scatterplot3d(wt,disp,mpg, main="Diagrama de puntos en 3D ")
stars
La funcion stars realiza un diagrama de estrellas, una por individuo, con informacion de todas las variables.
> stars(cbind(1:16,2*(16:1)),draw.segments=TRUE)
Fractal con R
Como vamos a mostrar R proporciona el entorno grafico suficiente par desarrollar simulaciones de valores
para construir fractales. Tomemos un ejemplo para crear uno:
> # Creamos una funci
on para dibujar nuestro ejemplo
> f1=function(numero = 100)
{
Dispositivos graficos
76
f1=function(numero = 100)
{
x = vector(mode = "numeric", length = numero)
y = vector(mode = "numeric", length = numero)
x[1] = 1
y[1] = 1
for(i in 2:numero)
{
if(sample(2,1) == 2)
{m = 1}
else
{m = -1}
x[i] = 0.5 * x[i - 1] + 0.5 * y[i - 1] + m
y[i] = -0.5 * x[i - 1] + 0.5 * y[i - 1] + m
}
return(list(x = x[2:numero], y = y[2:numero]))
}
xx<-f1(10000)
plot(xx)
plot(xx, col="green")
Dispositivos graficos
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
>
>
77
Parte VI
Estadstica Descriptiva
78
Estadstica Descriptiva
La estadstica descriptiva es una parte importante de la Estadstica que se dedica a analizar y representar
los datos. Su finalidad es obtener informaci
on, analizarla, elaborarla y simplificarla lo necesario para que pueda
ser interpretada c
omoda y r
apidamente y, por tanto, pueda utilizarse eficazmente para el fin que se desee.
Veremos como calcular tablas de frecuencias (absolutas, relativas y acumuladas), medidas de tendencia
central, de posici
on, dispersi
on, de asimetra, etc.
Empecemos con una muestra de resultados del lanzamiento de un dado 25 veces, los resultados obtenidos
son: {1,2,5,3,6,4,2,1,2,4,1,5,3,2,4,1,6,2,3,1,6,2,4,2,1}.
Utilizamos la funci
on table para calcular la frecuencia absoluta de cada valor de la variable. Para el calculo
de la frecuencia relativa dividimos table entre la longitud del conjunto de datos (length). Para calcular el
total de una variable utilizamos addmargins y para calcular la frecuencia acumulada utilizamos cumsum.
> dados<-c(1,2,5,3,6,4,2,1,2,4,1,5,3,2,4,1,6,2,3,1,6,2,4,2,1)
> table(x)
x
1 2 3 4
7 7 3 3
> dados<-c(1,2,5,3,6,4,2,1,2,4,1,5,3,2,4,1,6,2,3,1,6,2,4,2,1)
> table(dados)
dados
1 2 3 4 5 6
6 7 3 4 2 3
> # Calculamos la frecuencia absoluta de cada valor de la variable
> table(dados)/length(dados)
dados
1
2
3
4
5
6
0.24 0.28 0.12 0.16 0.08 0.12
> # O con:
> table(dados)/sum(table(dados))
dados
1
2
3
4
5
6
0.24 0.28 0.12 0.16 0.08 0.12
> # Calculamos la frecuencia relativa de cada valor de la variable
> addmargins(table(dados))
dados
1
2
3
4
5
6 Sum
6
7
3
4
2
3 25
> # Calculamos la frecuencia absoluta y el total de la variable
> addmargins(table(dados)/length(dados))
dados
1
2
3
4
5
6 Sum
0.24 0.28 0.12 0.16 0.08 0.12 1.00
79
Estadstica Descriptiva
80
Con la funci
on summary nos muestra el resumen estadstico de las variables que les indiquemos. Para
cada variable nos muestra el valor mnimo de esta variable, el primer y tercer cuartil, la mediana, la media y
el maximo:
> x
[1] 12 13 12 13 12 15 14 12 13 15
> summary(x)
Min. 1st Qu. Median
Mean 3rd Qu.
12.00
12.00
13.00
13.10
13.75
Max.
15.00
Otra funcion interesante es fivenum que calcula un resumen de los 5 elementos de Tukey (el mnimo,
los cuartiles y el m
aximo) para los datos de entrada que suelen dar una buena idea del comportamiento de la
distribucion.
> x=c(1:5,5:1,4,2,3,2)
> summary(x)
Min. 1st Qu. Median
Mean 3rd Qu.
Max.
1.000
2.000
3.000
2.929
4.000
5.000
> fivenum(x)
[1] 1 2 3 4 5
> # Devuelve el m
nimo, 1o cuartil, mediana, 3o cuartil y m
aximo
otra funcion que calcula un resumen estadstico es stat.desc del paquete pastecs, computa un conjunto
de medidas de tendencia central y de dispersion.
Estadstica Descriptiva
>
+
+
>
81
max
69.0000000
var
191.9602273
range
sum
47.0000000 1317.0000000
std.dev
coef.var
13.8549712
0.3471633
>
(x)
n
Como vimos anteriormente podemos calcular la media de un conjunto de datos creando nuestra propia
funcion o de una forma m
as sencilla a partir de la funcion mean.
> # En este ejemplo vamos a introducir los datos con la funci
on data.entry
> # Creamos un vector vac
o
> x<-c()
> # Introducimos los datos
> data.entry(x)
Error en de.ncols(sdata) : wrong argument to dataentry
> # He de asignarle al vector por lo menos un valor, le pongo el primero
> x<-c(12)
> data.entry(x)
> x
[1] 12 13 14 12 14 15 12 14 15 10
> mean(x)
[1] 13.1
Media geom
etrica
La media geometrica es otra forma de describir el valor central de un conjunto de datos, se define como:
Estadstica Descriptiva
82
log x
=
1X
log xi
n i=1
> x<-c(1:5,4:1,3)
> x
[1] 1 2 3 4 5 4 3 2 1 3
> # Calculamos la media geom
etrica calculando la media del logaritmo
> mean(log(x))
[1] 0.9064158
La media geometrica calculada con la ecuacion anterior esta expresada en una escala logartmica, para
volver a la escala original, utilizamos la funcion exponencial antilogaritmo.
> exp(mean(log(x)))
[1] 2.475434
Moda
En estadstica, la moda es el valor con una mayor frecuencia en una distribucion de datos.
M oda = max{fi : i {1, . . . , n}}
Hablaremos de una distribuci
on bimodal de los datos cuando encontremos dos modas, es decir, dos datos
que tengan la misma frecuencia absoluta maxima. Si todas las variables tienen la misma frecuencia diremos
que no hay moda.
El intervalo modal es el de mayor frecuencia absoluta. Cuando tratamos con datos agrupados antes de
definir la moda, se ha de definir el intervalo modal. La moda, cuando los datos estan agrupados, es un punto
que divide al intervalo modal en dos partes de la forma p y c-p, siendo c la amplitud del intervalo, que verifiquen
que:
ni ni1
p
=
cp
ni ni+1
Siendo la frecuencia absoluta del intervalo modal las frecuencias absolutas de los intervalos anterior y posterior, respectivamente, al intervalo modal.
R no proporciona una funci
on que calcule la moda, pero nos la arreglaremos para calcularlos
> edad <- c(22,22,23,24,26,27,28,29,29,29,
+ 31,33,34,35,35,35,36,38,39,42,44,44,45,45,
+ 45,47,48,52,59,66,67,69,69)
> table(edad)
edad
22 23 24 26 27 28 29 31 33 34 35 36 38 39 42 44 45 47 48 52 59 66 67 69
2 1 1 1 1 1 3 1 1 1 3 1 1 1 1 2 3 1 1 1 1 1 1 2
> max(table(edad))
[1] 3
> # Por lo tanto la moda es 29,35 y 45
Hay paquetes que la incorporan, como puede ser prettyR que con la funcion Mode calcula la moda de
una variable (pero solo en el caso de que sea unimodal)
Estadstica Descriptiva
83
> library(prettyR)
> Mode(edad)
[1] ">1 mode"
> x<-c(1, 2, 3, 4, 5, 4, 3, 2, 1, 3)
> x
[1] 1 2 3 4 5 4 3 2 1 3
> Mode(x)
[1] "3"
Podemos distinguir tambien si los datos son continuos o discretos
> # x discreta
> modad <- function(x) as.numeric(names(which.max(table(x))))
> # x es continua
> modac <- function(x){
+
dd <- density(x)
+
dd$x[which.max(dd$y)]
+
}
> #
Ejemplo
> # x es discreta
> x <- rpois(100, 10)
> modad(x)
[1] 10
> table(x)
x
1 4 5 6 7 8 9 10 11 12 13 14 15 18
1 4 8 4 10 7 13 15 10 9 9 4 5 1
> # x es continua
> x <- rgamma(100, 3, 4)
> modac(x)
[1] 0.6471526
> dd <- density(x)
> plot(dd, type = l, las = 1)
> rug(x)
> abline(v = dd$x[which.max(dd$y)], col = 2)
Mediana
La mediana es el valor de la variable que deja el mismo n
umero de datos antes y despues que el, una
vez ordenados estos. De acuerdo con esta definicion el conjunto de datos menores o iguales que la mediana
representaran el 50 % de los datos, y los que sean mayores que la mediana representaran el otro 50 % del total
de datos de la muestra. La mediana coincide con el percentil 50, con el segundo cuartil y con el quinto decil.
Estadstica Descriptiva
84
Cuantiles
Los cuantiles son valores de la distribucion que la dividen en partes iguales, es decir, en intervalos, que
comprenden el mismo n
umero de valores. Los mas usados son los cuartiles, los deciles y los percentiles.
Los percentiles son 99 valores que dividen en cien partes iguales el conjunto de datos ordenados. Ejemplo,
el percentil de orden 15 deja por debajo al 15 % de las observaciones, y por encima queda el 85 %
Los cuartiles son los tres valores que dividen al conjunto de datos ordenados en cuatro partes iguales, son
un caso particular de los percentiles:
El primer cuartil Q1 es el menor valor que es mayor que una cuarta parte de los datos
El segundo cuartil Q2 (la mediana), es el menor valor que es mayor que la mitad de los datos
El tercer cuartil Q3 es el menor valor que es mayor que tres cuartas partes de los datos
Los deciles son los nueve valores que dividen al conjunto de datos ordenados en diez partes iguales, son
tambien un caso particular de los percentiles.
> # Calculamo el 1o y 3o cuartil
> # el cuartil uno deja el 25% a la izquierda
> quantile(edad, probs=.25)
25%
26.5
> # el cuartil tres deja el 75% a la izquierda
> quantile(edad, probs=.75)
75%
35
> # el decil tres deja el 30% a la izquierda
> quantile(edad, probs=.3)
30%
27.4
> # el decil ocho deja el 80% a la izquierda
> quantile(edad, probs=.8)
80%
35
> # el percentil ochenta y uno deja el 81% a la izquierda
> quantile(edad, probs=.81)
81%
35
Estadstica Descriptiva
85
Medidas de dispersi
on
Rango
Se denomina rango estadstico o recorrido estadstico al intervalo de menor tama
no que contiene a los
datos; es calculable mediante la resta del valor mnimo al valor maximo; por ello, comparte unidades con los
datos. Permitiendo obtener as una idea de la dispersion de los datos.
Rango = max(x) mn(x)
> edad <- c(22,22,23,24,26,27,28,29,29,29, 31,33,34,35,35,35,36,38,39)
> range(edad)
[1] 22 39
> # Veamos que coinciden con los resultados de summary
> summary(edad)
Min. 1st Qu. Median
Mean 3rd Qu.
Max.
22.00
26.50
29.00
30.26
35.00
39.00
> # Lo creamos nosotros
> min(edad)
[1] 22
> max(edad)
[1] 39
> rango<-c(min(edad), max(edad))
> rango
[1] 22 39
Rango Medio
El rango medio de un conjunto de valores numericos es la media de los dos valores extremos (menor y
mayor valor), o la mitad del camino entre el dato mnimo y el dato Maximo.
Rango M edio =
max(x) + mn(x)
2
Rango intercuartlico
Al igual que ocurre con otras medidas esta no esta explcitamente implementada. Pero podemos programarla
a partir de otras que si lo est
an.
> quantile(edad,.75)-quantile(edad,.25)
75%
8.5
Estadstica Descriptiva
86
Varianza
Para conocer con detalle un conjunto de datos, no basta con conocer las medidas de tendencia central,
sino que necesitamos conocer tambien la desviacion que representan los datos en su distribucion respecto de
la media aritmetica de dicha distribuci
on, con objeto de tener una vision de los mismos mas acorde con la
realidad a la hora de describirlos e interpretarlos para la toma de decisiones.
La varianza de una variable aleatoria es una medida de dispersion definida como la esperanza del cuadrado
de la desviacion de dicha variable respecto a su media.
P
(x x
)2
V arianza =
n
R no calcula como vimos anteriormente la varianza poblacional sino que calcula la muestral, por tanto el
divisor es n 1 en vez de n.
> edad <- c(22,22,23,24,26,27,28,29,29,29, 31,33,34,35,35,35,36,38,39)
> var(edad)
[1] 29.20468
> sum((edad-mean(edad))^2)/(length(edad))
[1] 27.66759
> sum((edad-mean(edad))^2)/(length(edad)-1)
[1] 29.20468
> #Si lo que queremos es calcular la poblacional multiplicamos por n-1/n
> n<-length(edad)
> var(edad)*(n-1)/n
[1] 27.66759
Desviaci
on Tpica
La desviaci
on est
andar o desviaci
on tpica es una medida de dispersion para variables de gran utilidad en
la estadstica descriptiva.
Se define como la raz cuadrada de la varianza. Junto con este valor, la desviacion tpica es una medida
(cuadratica) que informa de la media de distancias que tienen los datos respecto de su media aritmetica,
expresada en las mismas unidades que la variable.
P
p
(x x
)2
DT = (
)
n
R no calcula como vimos anteriormente la varianza poblacional sino que calcula la muestral, por tanto el
divisor es n 1 en vez de n. Para calcularla utilizaremos la funcion sd.
> # Muestral
> sd(edad)
[1] 5.404135
> sqrt(var(edad))
[1] 5.404135
> # Poblacional
> sd(edad)*(n-1)/n
[1] 5.119707
> sqrt(var(edad))*(n-1)/n
[1] 5.119707
Estadstica Descriptiva
87
Coeficiente de variaci
on de Pearson
Cuando se quiere comparar el grado de dispersion de dos distribuciones que no vienen dadas en las mismas
unidades o que las medias no son iguales se utiliza el coeficiente de variacion de Pearson que se define como el
cociente entre la desviaci
on tpica y el valor absoluto de la media aritmetica.
CV =
DT
x
Medidas de forma
las medidas de forma comparan la forma que tiene la representacion grafica, bien sea el histograma o el
diagrama de barras de la distribuci
on, con la distribucion normal.
Medida de la asimetra
Diremos que una distribuci
on es simetrica cuando su mediana, su moda y su media aritmetica coinciden.
Por lo tanto, diremos que una distribuci
on es asimetrica a la derecha si las frecuencias (absolutas o relativas)
descienden mas lentamente por la derecha que por la izquierda y si las frecuencias descienden mas lentamente
por la izquierda que por la derecha diremos que la distribucion es asimetrica a la izquierda.
Existen varias medidas de la asimetra de una distribucion de frecuencias. Una de ellas es el Coeficiente de
Asimetra de Pearson:
x
Mo
DT
El coeficiente de asimetra s
olo viene definido como funcion en algunos paquetes, pero vamos a crear una
funcion que lo calcule a partir de la definici
on:
CAP =
Estadstica Descriptiva
88
Pn
x)
i=1 (xi
CAP =
n
3
DTn1
> asim<-function(x)
+ {
+ as<-sum((x-mean(x))^3/length(x))/(sd(x))^3
+ return(as)
+ }
> asim(edad)
[1] -0.0588123
Como hemos dicho anteriormente existen paquetes como fBasics que tienen implementadas funciones de
asimetra como skewness que calcula el coeficiente de asimetra de Pearson.
> library(fBasics)
> skewness(edad)
[1] -0.0588123
attr(,"method")
[1] "moment"
> x <- runif(30)
> skewness(x)
[1] -0.02627598
attr(,"method")
[1] "moment"
Medida de la curtosis
Las medidas de curtosis miden la mayor o menor cantidad de datos que se agrupan en torno a la moda. Se
definen 3 tipos de distribuciones seg
un su grado de curtosis:
Distribuci
on mesoc
urtica: presenta un grado de concentracion medio alrededor de los valores centrales
de la variable (el mismo que presenta una distribucion normal).
Distribuci
on leptoc
urtica: presenta un elevado grado de concentracion alrededor de los valores centrales
de la variable.
Distribuci
on platic
urtica: presenta un reducido grado de concentracion alrededor de los valores centrales
de la variable.
Se define como:
M4
4
Utilizaremos el paquete fBasics que tiene implementada la funcion kurtosis que calcula el coeficiente
de curtosis de un conjunto de datos.
> kurtosis(edad)
[1] -1.372259
attr(,"method")
[1] "excess"
> x <- runif(30)
> kurtosis(x)
[1] -1.434423
attr(,"method")
[1] "excess"
Estadstica Descriptiva
89
Parte VII
Distribuciones de probabilidad
90
Distribuciones de probabilidad
Cuando una variable aleatoria toma diversos valores, la probabilidad asociada a cada uno de tales valores
puede ser organizada como una distribuci
on de probabilidad, la cual es la distribucion de las probabilidades
asociadas a cada uno de los valores de la variable aleatoria.
Las distribuciones de probabilidad pueden representarse a traves de una tabla, una grafica o una formula,
en cuyo caso tal regla de correspondencia se le denomina funcion de probabilidad.
Las distribuciones de probabilidad para variables pueden ser discretas, cuando la variable aleatoria tomaba
un valor en concreto o continuas cuando los valores no son concretos y pueden ser cualquier valor de un intervalo.
R tiene definidas algunas de las m
as importantes funciones de distribucion, en la siguiente tabla indicamos
la funcion y la distribuci
on que representan (discreta o continuas).
Funcion
beta
binom
cauchy
exp
chisq
fisher
gamma
geom
hyper
lnorm
logis
nbinom
norm
pois
t
unif
weibull
wilcox
Distribucion
beta
binomial
Cauchy
exponencial
chi-cuadrado
F
gamma
geometrica
hipergeometrica
lognormal
logstica
binomial negativa
normal
Poisson
t-Student
uniforme
Weibull
Wilcoxon
dxxx(x,
pxxx(q,
qxxx(p,
rxxx(n,
...)
...)
...)
...)
Donde xxx indica el nombre de cualquiera de las distribuciones, x y q son vectores que toman valores en
el soporte de la distribuci
on, p es un vector de probabilidades y n es un valor entero.
91
Distribuciones de probabilidad
92
Distribuciones de probabilidad
93
Distribuci
on Binomial
La distribuci
on binomial es una distribucion de probabilidad discreta que mide el n
umero de exitos en una
secuencia de n ensayos independientes de Bernoulli con una probabilidad fija p de ocurrencia del exito entre
los ensayos.
Un experimento de Bernoulli se caracteriza por ser dicotomico, esto es, solo son posibles dos resultados. A
uno de estos se denomina exito y tiene una probabilidad de ocurrencia p y al otro, fracaso, con una probabilidad
q = 1 - p. En la distribuci
on binomial el anterior experimento se repite n veces, de forma independiente, y se
trata de calcular la probabilidad de un determinado n
umero de exitos. Para n = 1, la binomial se convierte,
de hecho, en una distribuci
on de Bernoulli.
Para representar que una variable aleatoria X sigue una distribucion binomial de parametros n y p, se
escribe:
X B(n, p)
f (x) =
n
x
Para obtener valores que se basen en la distribucion binomial, R dispone de cuatro funciones basados en
binom:
dbinom(x, size, prob, log = F); Devuelve resultados de la funcion de densidad.
pbinom(q, size, prob, lower.tail = T, log.p = F); Devuelve resultados de la funcion de distribucion
acumulada.
qbinom(p, size, prob, lower.tail = T, log.p = F); Devuelve resultados de los cuantiles de la binomial.
rbinom(n, size, prob); Devuelve un vector de valores binomiales aleatorios.
Con:
x, q: Vector de cuantiles.
p: Vector de probabilidades.
n: N
umero de observaciones
size: N
umeros de ensayos(debe ser cero o mas).
prob: Probabilidad de exito en cada ensayo.
log, log.p: Par
ametro booleano, si es TRUE, las probabilidades p se ofrecen como log(p).
lower.tail: Par
ametro booleano, si es TRUE (por defecto), las probabilidades son P [X x], de lo
contrario, P [X > x].
Distribuciones de probabilidad
94
Distribuci
on Geom
etrica
La distribuci
on Geometrica es una serie de ensayos de Bernoulli independientes, con probabilidad constante
p de exito, donde la variable aleatoria X denota el n
umero de ensayos hasta el primer exito.
Entonces X tiene una distribuci
on geometrica con parametro p.
X G(p)
f (x) = p(1 p)x1 ; con x = {0, 1}
Para obtener valores que se basen en la distribucion Geometrica, R dispone de cuatro funciones basados
engeom:
dgeom(x, prob, log = F); Devuelve resultados de la funcion de densidad.
pgeom(q, prob, lower.tail = T, log.p = F); Devuelve resultados de la funcion de distribucion acumulada.
qgeom(p, prob, lower.tail = T, log.p = F); Devuelve resultados de los cuantiles de la Geometrica.
rgeom(n, prob); Devuelve un vector de valores binomiales aleatorios.
Distribuciones de probabilidad
95
Con:
x, q: Vector de cuantiles que representa el n
umero de fallos antes del primer exito.
p: Vector de probabilidades.
n: N
umeros de valores aleatorios a devolver.
prob: Probabilidad de exito en cada ensayo.
log, log.p: Par
ametro booleano, si es TRUE, las probabilidades p se ofrecen como log(p).
lower.tail: Par
ametro booleano, si es TRUE (por defecto), las probabilidades son P [X x], de lo
contrario, P [X > x].
> # Calculamos la P(X=4) de una G(0.5); representa el n
umero de fallos antes del primer
exito
> dgeom(4, 0.5)
[1] 0.03125
> # Calculamos la P(X>4) de una G(0.5)
> pgeom(4, 0.5, lower.tail = F)
[1] 0.03125
> # Que en este caso coincide con dgeom(4, 0.5)
> # Lo comprobamos; P(X > 4) = 1 - P(X<=3) = 1 - [P(X=0)+P(X=1)+P(X=2)+P(X=3)+P(X=4)]
> 1 - (dgeom(0, 0.5) + dgeom(1, 0.5) + dgeom(2, 0.5)+ dgeom(3, 0.5) + dgeom(4, 0.5))
[1] 0.03125
Distribuci
on Binomial Negativa
Surge de un contexto semejante al que conduce a la distribucion geometrica. La distribucion que asigna a
la variable Y, el n
umero de ensayo en el que ocurre el r-esimo exito.
Entonces X tiene una distribuci
on Binomial Negativa.
X BN (x, r, p)
Su funcion de probabilidad es:
P (y) =
x1
r1
Para obtener valores que se basen en la distribucion Binomial Negativa, R dispone de cuatro funciones
basados en nbinom:
dnbinom(x, size, prob, mu, log = F); Devuelve resultados de la funcion de densidad.
pnbinom(q, size, prob, mu, lower.tail = T, log.p = F); Devuelve resultados de la funcion de distribucion
acumulada.
qnbinom(p, size, prob, mu, lower.tail = T, log.p = F); Devuelve resultados de los cuantiles de la Binomial
Negativa.
rnbinom(n, size, prob, mu); Devuelve un vector de valores binomiales aleatorios.
Con:
x, q: Vector de cuantiles (Valores enteros positivos). Corresponde a n
umero de pruebas falladas.
q: Vector de cuantiles.
p: Vector de probabilidades.
n: N
umeros de valores aleatorios a devolver.
Distribuciones de probabilidad
96
Distribuci
on De Poisson
La distribuci
on de Poisson es una distribucion de probabilidad discreta. Expresa la probabilidad de un
n
umero k de eventos ocurriendo en un tiempo fijo si estos eventos ocurren con una frecuencia media conocida
y son independientes del tiempo discurrido desde el u
ltimo evento.
X P ()
La funcion de densidad de la distribuci
on de Poisson es:
e k
k!
Para obtener valores que se basen en la distribucion de Poisson, R dispone de cuatro funciones basados
enpois:
f (k, ) =
Distribuciones de probabilidad
97
f (x) =
Distribuciones de probabilidad
98
Distribuci
on t-Student
La distribuci
on t-Student es una distribucion de probabilidad que surge del problema de estimar la media
de una poblacion normalmente distribuida cuando el tama
no de la muestra es peque
no.
Aparece de manera natural al realizar la prueba t de Student para la determinacion de las diferencias entre
dos medias muestrales y para la construcci
on del intervalo de confianza para la diferencia entre las medias de
dos poblaciones cuando se desconoce la desviacion tpica de una poblacion y esta debe ser estimada a partir
de los datos de una muestra.
La distribuci
on t de Student es la distribucion de probabilidad del cociente:
Z
p
V /
donde:
1. Z tiene una distribuci
on normal de media nula y varianza 1
2. V tiene una distribuci
on chi-cuadrado con grados de libertad
3. Z y V son independientes
La funcion de densidad de t es
(( + 1)/2)
f (t) =
(1 + t2 /)(+1)/2
(/2)
Para obtener valores que se basen en la distribucion t-Student, R dispone de cuatro funciones basados en
t:
dt(x, df, ncp, log = F); Devuelve resultados de la funcion de densidad.
pt(q, df, ncp, lower.tail = T, log.p = F); Devuelve resultados de la funcion de distribucion acumulada.
qt(p, df, ncp, lower.tail = T, log.p = F); Devuelve resultados de los cuantiles de la t-Student.
rt(n, df, ncp); Devuelve un vector de valores t-Student aleatorios.
Distribuciones de probabilidad
99
Con:
x, q: Vector de cuantiles.
p: Vector de probabilidades.
n: N
umeros de observaciones.
df: Grados de libertad.
ncp: Par
ametro que determina la centralidad de la grafica t-Student. Si se omite, el estudio se realiza
con la gr
afica centralizada en 0.
log, log.p: Par
ametro booleano, si es TRUE, las probabilidades p son devueltas como log (p).
lower.tail: Par
ametro booleano, si es TRUE (por defecto), las probabilidades son P [X x], de lo
contrario, P [X > x].
> # Calcular P(T >= 1.3) con 7 grados de libertad.
> pt(1.3, 7, lower.tail = F)
[1] 0.1173839
> # Calcular P(T < 2.30) con 20 grados de libertad.
> pt(2.30,20, lower.tail = T)
[1] 0.9838263
> # P(T >= t) = 0.05 con 25 grados de libertad.
> qt(0.05, 25, lower.tail = F)
[1] 1.708141
> # Calcular 5 n
umeros aleatorios con 25 grados de libertad.
> rt(5, 25)
[1] 0.6513232 0.7946921 0.5891572 0.8046254 2.4434150
Distribuci
on Chi-cuadrado
En estadstica, la distribuci
on 2 (de Pearson) es una distribucion de probabilidad continua con un
parametro k que representa los grados de libertad de la variable aleatoria:
X = Z12 + + Zk2
donde Zi son variables de distribuci
on normal, de media cero y varianza uno. El que la variable aleatoria
X tenga esta distribuci
on se representa habitualmente as:
X 2k
Su funcion de densidad es:
f (x; k) =
1
2k/2 (k/2)
x(k/2)1 ex/2
para x 0,
para x < 0
donde es la funci
on gamma: (z) = 0 tz1 et dt. Si n es un entero positivo, entonces (n) = (n 1)!.
Para obtener valores que se basen en la distribucion chi-Cuadrada, R dispone de cuatro funciones basados
en chisq:
dchisq(x, df, ncp=0, log = F); Devuelve resultados de la funcion de densidad.
pchisq(q, df, ncp=0, lower.tail = T, log.p = F); Devuelve resultados de la funcion de distribucion
acumulada.
qchisq(p, df, ncp=0, lower.tail = T, log.p = F); Devuelve resultados de los cuantiles de la chi-Cuadrada.
rchisq(n, df, ncp=0); Devuelve un vector de valores chi-Cuadrados aleatorios.
Distribuciones de probabilidad
100
Con:
x, q: Vector de cuantiles.
p: Vector de probabilidades.
n: N
umeros de observaciones.
df: Grados de libertad.
ncp: Par
ametro que determina la centralidad de la grafica chi-Cuadrados. Si se omite, el estudio se
realiza con la gr
afica centralizada en 0.
log, log.p: Par
ametro booleano, si es TRUE, las probabilidades p son devueltas como log (p).
lower.tail: Par
ametro booleano, si es TRUE (por defecto), las probabilidades son P [X x], de lo
contrario, P [X > x].
> # Calcular X^2(0.52, 7) con 7 grados de libertad.
> qchisq(0.52, 7, lower.tail = F)
[1] 6.17039
> # P(X^2 < x) = 0.80 con 25 grados de libertad
> qchisq(0.8, 25, lower.tail = T)
[1] 30.6752
> # P(X^2 >= 18.49) con 24 grados de libertad.
> pchisq(18.49, 24, lower.tail = F)
[1] 0.7786126
> # Calcular 5 n
umeros aleatorios de una dist. Chi-cuadrado con 24 grados de libertad.
> rchisq(5, 24)
[1] 18.84684 20.79490 12.11334 19.63524 32.99550
Distribuci
on F de Snedecor
La distribuci
on F de Snedecor es una distribucion de probabilidad continua. Una variable aleatoria de
distribucion F se construye como el siguiente cociente:
F =
U1 /d1
U2 /d2
donde
U1 y U2 siguen una distribuci
on ji-cuadrada con d1 y d2 grados de libertad respectivamente, y
U1 y U2 son estadsticamente independientes.
La funcion de densidad de una F(d1, d2) viene dada por
1
g(x) =
B(d1 /2, d2 /2)
d1 x
d1 x + d2
d1 /2
1
d1 x
d1 x + d2
d2 /2
x1
Para obtener valores que se basen en la distribucion F de Snedecor, R dispone de cuatro funciones basados
en f:
df(x, df1, df2, ncp, log = F); Devuelve resultados de la funcion de densidad.
pf(q, df1, df2, ncp, lower.tail = T, log.p = F); Devuelve resultados de la funcion de distribucion acumulada.
qf(p, df1, df2, ncp, lower.tail = T, log.p = F); Devuelve resultados de los cuantiles de la distribucion F.
rf(n, df1, df2, ncp); Devuelve un vector de valores de la distribucion F aleatorios.
Con:
Distribuciones de probabilidad
101
x, q: Vector de cuantiles.
p: Vector de probabilidades.
n: N
umeros de observaciones.
df1, df2: Grados de libertad, df1 corresponde al numerador y df2 al denominador.
ncp: Par
ametro que determina la centralidad de la grafica de la distribucion F. Si se omite, el estudio
se realiza con la gr
afica no centralizada.
log, log.p: Par
ametro booleano, si es TRUE, las probabilidades p son devueltas como log (p).
lower.tail: Par
ametro booleano, si es TRUE (por defecto), las probabilidades son P [X x], de lo
contrario, P [X > x].
> # Calcular F(0.15, 3, 2). con 3 y 2 grados de libertad.
> qf(0.15, 3, 2, lower.tail=F)
[1] 5.825814
> # P(F < f) = 0.025 con df1 = 20 y df2 = Infinito.
> qf(0.025, 20, Inf, lower.tail=T)
[1] 0.4795389
> # P(F >= 198.50) con df1 = 10 y df2 = 2.
> pf(198.50, 10, 2, lower.tail=F)
[1] 0.005022592
> # Calcular 5 n
umeros aleatorios de una dist. F de Snedecor con 24 y 10 grados de libertad.
> rf(5,24,10)
[1] 5.1400002 0.5186619 0.5719656 0.9080902 0.8035864
Distribuci
on beta
En estadstica la distribuci
on beta es una distribucion de probabilidad continua con dos parametros a y b
cuya funcion de densidad para valores 0 < x < 1 es
f (x) =
(a + b) a1
x
(1 x)b1
(a)(b)
R
Donde es la funci
on gamma: (z) = 0 tz1 et dt. Si n es un entero positivo, entonces (n) = (n 1)!.
Para obtener valores que se basen en la distribucion Beta, R dispone de cuatro funciones basados en beta:
dbeta(x, shape1, shape2, ncp = 0, log = F); Devuelve resultados de la funcion de densidad.
pbeta(q, shape1, shape2, ncp = 0, lower.tail = T, log.p = F); Devuelve resultados de la funcion de
distribuci
on acumulada.
qbeta(p, shape1, shape2, ncp = 0, lower.tail = T, log.p = F); Devuelve resultados de los cuantiles de la
distribuci
on Beta.
rbeta(n, shape1, shape2, ncp = 0); Devuelve un vector de valores de la distribucion Beta aleatorios.
Con:
x, q: Vector de cuantiles.
p: Vector de probabilidades.
n: N
umeros de observaciones.
shape1, shape2: Par
ametros de la Distribucion Beta. Shape1 = y Shape2 = . Ambos deben ser
positivos.
ncp: Par
ametro l
ogico que determina si la distribucion es central o no.
Distribuciones de probabilidad
102
Distribuci
on gamma
La distribuci
on gamma es una distribuci
on de probabilidad continua con dos parametros k y cuya funcion
de densidad para valores x > 0 es
f (x) = k ex
xk1
(k)
Aqu e es el n
umero e y es la funci
on gamma.
Para obtener valores que se basen en la distribucion Beta, R dispone de cuatro funciones basados en beta:
dgamma(x, shape, rate, scale = 1/rate, log = F); Devuelve resultados de la funcion de densidad.
pgamma(q, shape, rate, scale = 1/rate, lower.tail = T, log.p = F); Devuelve resultados de la funcion
acumulada.
qgamma(p, shape, rate, scale = 1/rate, lower.tail = T, log.p = F); Devuelve resultados de los cuantiles
de la distribuci
on Gamma.
rgamma(n, shape, rate, scale = 1/rate); Devuelve un vector de valores de la distribucion Gamma aleatorios.
Con:
x, q: Vector de cuantiles.
p: Vector de probabilidades.
n: N
umeros de observaciones.
rate: Alternativa para especificar el valor de escala (Scale). Por defecto, su valor es igual a 1.
shape, scale: Par
ametros de la Distribucion Gamma. Shape = a y Scale = s = 1/rate. Debe ser estrictamente positivo el par
ametro Scale.
log, log.p: Par
ametro booleano, si es TRUE, las probabilidades p son devueltas como log (p).
lower.tail: Par
ametro booleano, si es TRUE (por defecto), las probabilidades son P [X x], de lo
contrario, P [X > x].
Distribuciones de probabilidad
> # Mediante una distribuci
on gamma con ALPHA = 3 y BETA = 0.5.
> # Calcule la probabilidad de que sea mejor de 10
> pgamma(10, 3, rate = 0.5, lower.tail = F)
[1] 0.1246520
> # Entre 4 y 8
> pgamma(8, 3, rate = 0.5, lower.tail = T) - pgamma(4, 3, rate = 0.5, lower.tail = T)
[1] 0.4385731
> # P(X <x) = 0.7
> qgamma(0.7, 3, rate = 0.5, lower.tail = T)
[1] 7.231135
> # P(X > x) = 0.5
> qgamma(0.5, 3, rate = 0.5, lower.tail = F)
[1] 5.348121
> # Calcular 5 n
umeros aleatorios de una dist. gamma con ALPHA = 3 y BETA = 0.5
> rgamma(5, 3, rate = 0.5)
[1] 2.904413 6.250474 12.627805 11.155582 4.750176
103
Parte VIII
Regresi
on
104
Regresi
on
La regresion es una tecnica estadstica que analiza la relacion de dos o mas variables que principalmente se
utilizada para inferir datos a partir de otros y hallar una respuesta de lo que puede suceder. Esta nos permite
conocer el cambio en una de las variables llamadas respuesta y que corresponde a otra conocida como variable
explicativa.
Se pueden encontrar varios tipos de regresion, por ejemplo:
Regresion lineal simple
Regresion m
ultiple ( varias variables)
Regresion logstica
Algunas ecuaciones regresi
on son:
Regresion Lineal : y = A + Bx
Regresion Logartmica : y = A + BLn(x)
Regresion Exponencial : y = Ac(bx)
Regresion Cuadr
atica : y = A + Bx +Cx2
Regresi
on lineal
La funcion en R para obtener modelos de regresion lineal simple, Y=aX+b, es lm, aunque tambien se
puede utilizar esta funci
on para el an
alisis de la varianza y analisis de covarianza.
>
>
>
>
>
Call:
lm(formula = a.docencia ~ edad)
Coefficients:
(Intercept)
1.3081
edad
0.1156
Hay que tener en cuenta que el orden en el que se escriben las variables es de gran importancia, en este caso
la variable dependiente es los a
nos de docencia, por lo que pretendemos una ecuacion de regresion ajustada del
tipo:
y = b0 + b1 x
105
Regresion
106
Con y (edad) y x (a
nos de docencia).
Siendo Intercept = b0 , la ordenada en el origen de la recta de regresion y x = b1 , valor numerico del
estimador.
Por lo tanto, la recta es: y(x) = (1,3081) (0,1156)x
> # X=edad y Y=a~
nos de docencia
> lm(edad~a.docencia)->r2
> r2
Call:
lm(formula = edad ~ a.docencia)
Coefficients:
(Intercept)
a.docencia
33.7407
0.4562
Ahora la variable dependiente es edad, por lo que pretendemos una ecuacion de regresion ajustada del tipo:
x = a0 + a1 y
En este caso x(y) = (33,7407) (0,4562)y
Es importante tener controlados los elementos de la regresion, para ver cual es cada uno utilizamos el
argumento coefficients o coef.
> coef(r1)
(Intercept)
edad
1.308086
0.115639
> r1$coefficients
(Intercept)
edad
1.308086
0.115639
> r1$coefficients[1]
(Intercept)
1.308086
> r1$coefficients[2]
edad
0.115639
> r2$coefficients
(Intercept) a.docencia
33.740741
0.456229
> r2$coefficients[1]
(Intercept)
33.74074
> r2$coefficients[2]
a.docencia
0.456229
Vamos a dibujar la recta de regresi
on para un ejemplo cualquiera:
>
>
>
>
>
Regresion
>
>
>
>
>
>
>
>
107
# Definimos el eje X
litros <- seq(0:length(x))
# Defino la recta
precio <- (ryx$coefficients[1])+ (ryx$coefficients[2])*aceite# Ecuaci
on ajustada
#Dibujo los puntos, se~
nalados con una X
plot(x, y, pch="X", col=2, xlab="Litros", ylab="Precio")
#Dibujo la recta
lines(precio, col=4)
> predict(ryx)
1
2
3
4
5
6
7
209.72222 108.33333 260.41667 209.72222 311.11111 159.02778 57.63889
8
159.02778
> # Son los valores de y cuando aplicamos la recta de regresi
on a los calores de x
Si lo que queremos es ajustar el modelo para poder usarlo posteriormente para predecir datos utilizaremos
la funcion predict. Esta funci
on obtiene todas las posibles predicciones para la variable x seg
un la posicion
en la que se encuentren sus datos.
Regresion
108
4
-9.722222
5
38.888889
6
40.972222
7
-7.638889
Pero para tener un resumen de las caractersticas mas importantes de un modelo de regresion utilizaremos
la funcion summary.
> summary(ryx)
Call:
lm(formula = y ~ x)
Residuals:
Min
1Q Median
-59.72 -16.32 -8.68
3Q
39.41
Max
41.67
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 361.806
36.482
9.917 6.07e-05 ***
x
-50.694
9.581 -5.291 0.00185 **
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 40.65 on 6 degrees of freedom
Multiple R-squared: 0.8235,
Adjusted R-squared: 0.7941
F-statistic:
28 on 1 and 6 DF, p-value: 0.001845
Donde Residuals es un resumen de los residuos obtenidos por el modelo. Coefficients es una tabla con
Estimate (valores de las estimaciones), sus errores estandar, el valor del estadstico y p-valor para las pruebas
de hipotesis de los estimadores. Residual standard error es el valor del error estandar del residuo. Multiple
R-squarede valor del coeficiente de determinacion. Y Ajusted R-squared es el valor ajustado del coeficiente de
determinacion. El coeficiente de determinacion es 0.8235 y el p-valor es 0.001845 por lo que existen diferencias
significativas.
Regresi
on lineal sin t
ermino independiente
Si lo que pretendemos es calcular una ecuacion de regresion lineal sin termino independiente, Y=aX,
tenemos que utilizar una variante de la anterior. Con lm(y 0 + x) calculamos la pendiente (a) de la recta de
regresion Y = aX. Aunque tambien es posible calcularlo con lm(y x 1).
>
>
>
>
x <- c(3, 5, 2, 3, 1, 4, 6, 4)
y <- c(150, 150, 250, 200, 350, 200, 50, 125)
# Recta de regresi
on sin termino independiente
lm(y~0+x)
Regresion
109
Call:
lm(formula = y ~ 0 + x)
Coefficients:
x
36.64
> # Otra forma de calcularlo es con la orden lm(y~x-1)
> lm(y~x-1)
Call:
lm(formula = y ~ x - 1)
Coefficients:
x
36.64
Regresi
on Polinomial
Para calcular la funci
on de regresi
on polinomial Y = a0 + a1 X + a2 X 2 + . . . + ap X p utilizamos la funcion
2
3
p
lm(y x + I(x ) + I(x ) + ... + I(x )).
> # Cuadr
atica
> lm(y~x+x^2)
Call:
lm(formula = y ~ x + x^2)
Coefficients:
(Intercept)
x
361.81
-50.69
> # C
ubica
> lm(y~x+I(x^2)+I(x^3))
Call:
lm(formula = y ~ x + I(x^2) + I(x^3))
Coefficients:
(Intercept)
x
I(x^2)
596.820
-314.035
80.044
> # De grado cuatro
> lm(y~x+I(x^2)+I(x^3)+I(x^4))
I(x^3)
-7.127
Call:
lm(formula = y ~ x + I(x^2) + I(x^3) + I(x^4))
Coefficients:
(Intercept)
404.112
x
14.090
I(x^2)
-94.435
I(x^3)
29.331
I(x^4)
-2.604
Regresion
110
Regresi
on Polinomial sin t
ermino independiente
Como ocurra anteriormente calculamos la funcion de regresion polinomial Y = a1 X + a2 X 2 + . . . + ap X p
con lm(y 0 + x + I(x2 ) + I(x3 ) + ... + I(xp )).
> lm(y~0+x+x^2)
Call:
lm(formula = y ~ 0 + x + x^2)
Coefficients:
x
36.64
> lm(y~0+x+I(x^2)+I(x^3))
Call:
lm(formula = y ~ 0 + x + I(x^2) + I(x^3))
Coefficients:
x
I(x^2)
326.50 -113.84
I(x^3)
10.31
> lm(y~0+x+I(x^2)+I(x^3)+I(x^4))
Call:
lm(formula = y ~ 0 + x + I(x^2) + I(x^3) + I(x^4))
Coefficients:
x
I(x^2)
659.318 -420.796
I(x^3)
94.894
I(x^4)
-7.145
> # Tambi
en se calcula con lm(formula = y ~ x + x^2 - 1)
> lm(y~x+x^2-1)
Call:
lm(formula = y ~ x + x^2 - 1)
Coefficients:
x
36.64
Regresi
on Potencial
Para calcular la funci
on de regresi
on potencial Y = aX b utilizamos la funcion lm(log(y) log(x)).
> lm(log(y)~log(x))
Call:
lm(formula = log(y) ~ log(x))
Coefficients:
(Intercept)
6.0369
log(x)
-0.8338
Regresion
111
Regresi
on exponencial
Para calcular la funci
on de regresi
on potencial Y = ea+bX utilizamos la funcion lm(log(y)x).
> lm(log(y)~x)
Call:
lm(formula = log(y) ~ x)
Coefficients:
(Intercept)
6.2048
x
-0.3179
Regresi
on logartmica
Para calcular la funci
on de regresi
on logartmica Y = a + b log(x) utilizamos la funcion lm(y log(x)).
> lm(y~log(x))
Call:
lm(formula = y ~ log(x))
Coefficients:
(Intercept)
350.1
log(x)
-146.3
Regresi
on hiperb
olica
Para calcular la funci
on de regresi
on hiperbolica Y = a +
b
x
> lm(y~I(1/x))
Call:
lm(formula = y ~ I(1/x))
Coefficients:
(Intercept)
72.45
I(1/x)
295.18
Regresion
112
Regresi
on doble inversa
Para calcular la funci
on de regresi
on hiperbolica Y =
1
b
a+ x
> lm(I(y)~I(1/x))
Call:
lm(formula = I(y) ~ I(1/x))
Coefficients:
(Intercept)
72.45
I(1/x)
295.18
Coeficiente de correlaci
on
Para obtener el modelo de regresi
on no es suficiente con establecer la regresion, ya que es necesario evaluar
que lo bueno que es el modelo de regresi
on obtenido. El coeficiente de correlacion mide el grado de relacion
existente entre las variables. El valor de este coeficiente varia entre -1 y 1, pero en la practica se trabaja con
el valor absoluto de R.
El coeficiente de correlaci
on entre dos variables aleatorias X e Y es el cociente de su covarianza por el
producto de sus desviaciones tpicas.
xy
x y
El valor del coeficiente de correlaci
on se clasifica seg
un el valor de r:
r=
Parte IX
Inferencia
113
Inferencia
La inferencia estadstica es una parte de la Estadstica que comprende los metodos y procedimientos para
deducir propiedades (hacer inferencias) de una poblacion, a partir de una peque
na parte de la misma (muestra).
La bondad de estas deducciones se mide en terminos probabilsticos, es decir, toda inferencia se acompa
na
de su probabilidad de acierto.
Muestreo aleatorio
Muestreo aleatorio simple
Selecciona muestras mediante metodos que permiten que cada posible muestra tenga igual probabilidad de
ser seleccionada y que cada elemento de la poblacion total tenga una oportunidad igual de ser incluido en la
muestra.
Un muestreo aleatorio para un tama
no especificado lo realizamos con sample. Esta funcion se puede
aplicar tanto a muestras con reemplazamiento como sin reemplazamiento indicando en ella tal reemplazamiento
con el argumento replace = TRUE o sin el con replace = FALSE(por definicion el argumento se toma
como FALSE).
> x <- 1:12
> # Muestra aleatoria sin reemplazamiento del mismo tama~
no
> sample(x)
[1] 10 2 5 11 4 8 6 7 12 9 1 3
> # Muestra aleatoria con reemplazamiento del mismo tama~
no
> sample(x,replace=TRUE)
[1] 8 10 6 5 3 6 6 5 10 5 5 10
> # Muestras de tama~
no 3 con y sin remplazamiento
> sample(x,3,replace=TRUE)
[1] 12 10 10
> sample(x,3)
[1] 7 11 5
> # Muestra aleatoria con reemplazamiento de 100 elementos
> # de una Bernoulli
> sample(c(0,1), 100, replace = TRUE)
[1] 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1
[38] 0 1 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0
[75] 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 1 1 1
114
Inferencia
115
Muestreo estratificado
En el muestreo estratificado dividimos la poblacion en grupos relativamente homogeneos, llamados estratos.
Despues seleccionamos aleatoriamente de cada estrato un n
umero especfico de elementos correspondientes a
la fraccion de ese estrato en la poblaci
on como un todo o extraemos un n
umero igual de elementos de cada
estrato y damos peso a los resultados de acuerdo con la porcion del estrato con respecto a la poblacion total.
Con cualquiera de estos planteamientos, el muestreo estratificado garantiza que cada elemento de la
poblacion tenga posibilidad de ser seleccionado. Este metodo resulta apropiado cuando la poblacion ya esta dividida en grupos de diferentes tama
nos y deseamos tomar en cuenta este hecho (por ejemplo: categoras
profesionales de la poblaci
on).
Para calcular un muestreo sistem
atico volvemos a utilizar el paquete pps y su orden especifica ppssstrat
para calcular una muestra por muestreo estratificado.
> library(pps)
> tama~
nos<-c(10, 20, 30, 40, 50, 100, 90, 80, 70, 60)
> # Indicamos el estrato al que pertenece cada tama~
no
> estratos <- c(1,1,1,2,2,3,3,3,3,3)
> # n es un vector que contienen el tama~
no de la muestra en cada estrato
> n <- c(2,1,3)
> ppssstrat(tama~
nos,estratos,n)
[1] 2 3 5 6 7 9
Inferencia
116
Estimaci
on de par
ametros; Test de hip
otesis
En muchas ocasiones el objetivo de la Estadstica es hacer inferencia con respecto a parametros poblacionales desconocidos, basadas en la informacion obtenida mediante datos muestrales. Estas inferencias se
expresan de dos maneras, como estimaciones de los parametros o con tests de hipotesis.
Con frecuencia, los problemas a los que nos enfrentamos no se refieren solo a la estimacion de un parametro
poblacional, sino a la toma de decisiones basadas en los datos. Por ejemplo cuando un investigador pretende
demostrar que el f
armaco z es m
as efectivo para el tratamiento de cierta enfermedad que el farmaco w.
Contraste de normalidad
Un caso especfico de ajuste a una distribucion teorica es la correspondiente a la distribucion normal. Este
contraste se realiza para comprobar si se verifica la hipotesis de normalidad necesaria para que el resultado de
algunos analisis sea fiable, como por ejemplo para el ANOVA.
Para comprobar la hip
otesis nula de que la muestra ha sido extrada de una poblacion con distribucion de
probabilidad normal se puede realizar un estudio grafico y/o analtico.
Prueba de Kolmogorov-Smirnov
Cuando la prueba Kolmogorov-Smirnov se aplica para contrastar la hipotesis de normalidad de la poblacion,
el estadstico de prueba es la m
axima diferencia. La distribucion del estadstico de Kolmogorov-Smirnov es
independiente de la distribuci
on poblacional especificada en la hipotesis nula y los valores crticos de este
estadstico estan tabulados. Para aplicar el test utilizamos la funcion ks.test.
> x<-exp(rnorm(25))
> ks.test(x, "pnorm", mean = mean(x), sd = sd(x))
One-sample Kolmogorov-Smirnov test
data: x
D = 0.383, p-value = 0.0008265
alternative hypothesis: two-sided
Por lo tanto como el p-valor es menor que el nivel de significacion rechazo la hipotesis alternativa de que
la distribucion es normal.
Si queremos comprobar si dos muestras son normales utilizamos la misma funcion:
> y<-rnorm(25)
> ks.test(x, y, "pnorm", mean = mean(x), sd = sd(x))
Two-sample Kolmogorov-Smirnov test
data: x and y
D = 0.68, p-value = 8.494e-06
alternative hypothesis: two-sided
Por lo tanto como el p-valor es menor que el nivel de significacion rechazo la hipotesis alternativa de que
las dos muestras pertenecen a la misma distribucion, en este casi la normal.
Aparte de comprobar si la distribuci
on es la normal tambien podemos utilizar otras distribuciones (exponencial, uniforme, gamma, poisson,..)
Inferencia
117
Prueba de Shapiro-Wilk
Cuando la muestra es como m
aximo de tama
no 50 se puede contrastar la normalidad con la prueba de
shapiro Shapiro-Wilk. Para efectuarla se calcula la media y la varianza muestral y se ordenan las observaciones de menor a mayor. A continuaci
on se calculan las diferencias entre: el primero y el u
ltimo; el segundo y
el pen
ultimo; el tercero y el antepen
ultimo, etc. y se corrigen con unos coeficientes tabulados por Shapiro y Wilk.
Se rechazar
a la hip
otesis nula de normalidad si el estadstico es menor que el valor crtico proporcionado
por los datos y el nivel de significaci
on dado.
Para aplicar el test utilizamos la funci
on shapiro.test.
> shapiro.test(x)
Shapiro-Wilk normality test
data: x
W = 0.3722, p-value = 2.538e-09
Por lo tanto como el p-valor es menor que el nivel de significacion rechazo la hipotesis alternativa de que
la distribucion es normal.
Opciones gr
aficas de normalidad
Los graficos Q-Q (Qviene de cuantil) son un metodo grafico para el diagnostico de diferencias entre la
distribucion de probabilidad de una poblaci
on de la que se ha extrado una muestra aleatoria y una distribucion
usada para la comparaci
on.
Un ejemplo del tipo de diferencias que pueden comprobarse es la no-normalidad de la distribucion de una
variable en una poblaci
on. Para una muestra de tama
no n, se dibujan n puntos con los (n+1)-cuantiles de la
distribucion de comparaci
on, por ejemplo, la distribucion normal, en el eje horizontal el estadstico de k-esimo
orden, (para k = 1, ..., n) de la muestra en el eje vertical. Si la distribucion de la variable es la misma que la
distribucion de comparaci
on se obtendr
a, aproximadamente, una lnea recta, especialmente cerca de su centro.
En el caso de que se den desviaciones sustanciales de la linealidad, los estadsticos rechazan la hipotesis nula
de similitud.
> x<-exp(rnorm(25))
> qqnorm(x)
> qqline(x,lty=2)
Inferencia
118
Como vemos hay diferencias entre los valores y la recta por lo que no son normales.
Tambien podemos hacer la comparaci
on de los datos con la distribucion normal a partir del histograma.
Si el histograma de los datos se asemeja a la distribucion normal diremos que los datos son normales.
> y<-rnorm(25)
> hist(y)
Podemos comprobar si el histograma coincide con la distribucion normal dibujando ambas graficas. Utilizamos el paquete agricolae y la funci
on normal.freq.
>
>
>
>
>
>
>
library(agricolae)
# Cogemos los datos que nos proporciona el paquete
data(growth)
attach(growth)
#startgraph
h1<-hist(height,col="red",xlim=c(6,14))
normal.freq(h1,col="blue")
Inferencia
119
> h2<-graph.freq(height,col="yellow",xlim=c(6,14),frequency=2)
> normal.freq(h2,frequency=2)
Contraste de medias
Un contraste de hip
otesis (tambien denominado test de hipotesis o prueba de significacion) es una metodologa
de inferencia estadstica para juzgar si una propiedad que se supone cumple una poblacion estadstica es compatible con lo observado en una muestra de dicha poblacion.
Mediante esta teora, se aborda el problema estadstico considerando una hipotesis determinada (hipotesis
nula) H0 e hipotesis alternativa, H1 , y se intenta dirimir cual de las dos es la hipotesis verdadera, tras aplicar
el problema estadstico a un cierto n
umero de experimentos.
Posteriormente se puede evaluar la probabilidad de haber obtenido los datos observados si esa hipotesis
es correcta. El valor de esta probabilidad coincide con el p-valor que nos proporciona cada test estadstico, de
modo que cuanto menor sea este m
as improbable resulta que la hipotesis inicial se verifique.
Inferencia
120
Inferencia
121
Inferencia
122
Por tanto en los dos ejemplo, al ser el p-valor mayor que el nivel de significacion afirmamos que las
distribucion experimental se asemeja a la te
orica.
En el caso comparaci
on de dos variables cualitativas la hipotesis nula va a ser la de no relacion o independencia.
> aa=rbind(c(17,35),c(8,53),c(22,491))
> aa
[,1] [,2]
[1,]
17
35
[2,]
8
53
[3,]
22 491
> chisq.test(aa)
Pearsons Chi-squared test
data: aa
X-squared = 57.9122, df = 2, p-value = 2.658e-13
Mensajes de aviso perdidos
In chisq.test(aa) : Chi-squared approximation may be incorrect
Como el p-valor es muy peque
no rechazamos la hipotesis nula de independencia por lo que las dos variables
de la tabla de contingencia estaran relacionadas.
Parte X
An
alisis de la varianza
123
An
alisis de la varianza
El analisis de la varianza o an
alisis de varianza (ANOVA) es un conjunto de modelos estadsticos y sus
procedimientos asociados, en el cual la varianza esta particionada en ciertos componentes debidos a diferentes variables explicativas. El an
alisis de varianza sirve para comparar si los valores de un conjunto de datos
numericos son significativamente distintos a los valores de otro o mas conjuntos de datos. El procedimiento
para comparar estos valores est
a basado en la varianza global observada en los grupos de datos numericos a
comparar. Tpicamente, el an
alisis de varianza se utiliza para asociar una probabilidad a la conclusion de que
la media de un grupo de puntuaciones es distinta de la media de otro grupo de puntuaciones.
El ANOVA parte de algunos supuestos que han de cumplirse:
La variable dependiente debe medirse al menos a nivel de intervalo.
Independencia de las observaciones.
La distribuci
on de los residuales debe ser normal.
Homocedasticidad: homogeneidad de las varianzas.
El metodo consiste en la descomposici
on de la suma de cuadrados en componentes relativos a los factores
contemplados en el modelo.
SST otal = SSError + SSF actores
El analisis de varianza se realiza mediante de pruebas de significacion usando la distribucion F de Snedecor.
Dise
no de un factor equilibrado
La hipotesis que se pone a prueba en el ANOVA de un factor es que las medias poblacionales son iguales. Si
las medias poblacionales son iguales, eso significa que los grupos no difieren y que, en consecuencia, la variable
independiente o factor es independiente de la variable dependiente.
124
Analisis de la varianza
125
Median
4.900
Max.
7.000
$Nivel.C
Min. 1st Qu.
4.300
4.500
Median
4.900
Max.
7.400
Asumimos que la variable valores sigue una distribucion normal con varianza com
un para las tres poblaciones, la tabla de an
alisis de la varianza la podemos crear a partir de la funcion aov que muestra un analisis
Analisis de la varianza
126
Niveles Residuals
3.29378 31.67200
2
42
Otra posibilidad es definir el modelo lineal y posteriormente obtener la tabla del ANOVA.
> regresi
on <- lm(valores ~ Niveles)
> anova(regresi
on)
Analysis of Variance Table
Response: valores
Df Sum Sq Mean Sq F value Pr(>F)
Niveles
2 3.294 1.6469 2.1839 0.1252
Residuals 42 31.672 0.7541
Como el p-valor es mayor que el nivel de significacion se concluye que no hay diferencias significativas entre
los tres niveles. Las estimaciones de los par
ametros se obtienen con la funcion model.tables.
> model.tables(anova)
Tables of effects
Niveles
Niveles
Nivel.A Nivel.B Nivel.C
-0.2511 -0.1244 0.3756
> model.tables(anova, type = "mean")
Tables of means
Grand mean
5.137778
Niveles
Niveles
Nivel.A Nivel.B Nivel.C
4.887
5.013
5.513
> # Obtenemos m
as informaci
on con summary.
> summary(anova)
Analisis de la varianza
Niveles
Residuals
127
Veamos un ejemplo con datos faltantes. Queremos ver si hay diferencias entre las valoraciones de cuatro
jugadores de baloncesto, teniendo en cuenta que no han jugado todos los partidos.
Las valoraciones son:
Jugador
jugador.A
jugador.B
jugador.C
jugador.D
20
10
5
1
10
25
10
5
15
13
15
-5
-10
15
20
5
1
30
5
2
12
8
15
0
-3
7
25
4
NA
0
2
6
NA
15
13
NA
Median
11.5
Max.
30.0
$Juan
Min. 1st Qu.
2.0
5.0
Median
11.5
Max.
25.0
$Pedro
Min. 1st Qu.
-5.00
0.75
Median
3.00
Max.
6.00
NAs
2.00
NA
10
5
NA
Analisis de la varianza
128
diff
lwr
upr
p adj
6.871429 -3.790324 17.5331811 0.3165254
5.071429 -5.590324 15.7331811 0.5753988
-4.178571 -15.375651 7.0185084 0.7431954
Analisis de la varianza
129
Juan-Paco
-1.800000 -11.475383 7.8753828 0.9573021
Pedro-Paco -11.050000 -21.312293 -0.7877068 0.0309962
Pedro-Juan -9.250000 -19.512293 1.0122932 0.0891511
> plot(TukeyHSD(anv))
Dise
no de dos factores
Queremos comparar si la acidez depende de la edad del vino y del vi
nedo.
> tapply(acidez, edad, summary)
$1
Min. 1st Qu. Median
Mean 3rd Qu.
1.8
1.9
2.0
2.0
2.1
Max.
2.2
$2
Min. 1st Qu.
2.20
2.50
Median
2.60
Max.
2.80
$3
Min. 1st Qu.
1.60
1.80
Median
1.90
Max.
2.00
$4
Min. 1st Qu.
2.00
2.10
Median
2.10
Max.
2.40
Max.
2.200
$2
Min. 1st Qu.
Median
Max.
Analisis de la varianza
1.900
1.975
2.100
$3
Min. 1st Qu.
1.600
1.750
130
2.175
2.300
2.600
Median
2.000
Max.
2.700
$4
Min. 1st Qu.
2.000
2.000
Median
2.200
Max.
2.500
$5
Min. 1st Qu.
1.900
1.900
Median
2.000
Max.
2.800
>
>
stripchart(acidez ~ edad)
stripchart(acidez ~ vi~
nedo)
>
>
interaction.plot(edad, vi~
nedo, acidez, legend = F)
interaction.plot(vi~
nedo, edad, acidez, legend = F)
Analisis de la varianza
131
A la vista de las gr
aficas, no hay datos atpicos, asimetras o heterocedasticidad. Tampoco parece haber
interacciones.
Calculamos la tabla de ANOVA
> reg2 <- lm(acidez ~ edad +
> anova(reg2)
Analysis of Variance Table
vi~
nedo)
Response: acidez
Df Sum Sq Mean Sq F value
Pr(>F)
edad
3 1.432 0.47733 14.0392 0.0003137 ***
vi~
nedo
4 0.088 0.02200 0.6471 0.6395716
Residuals 12 0.408 0.03400
--Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Como vemos hay diferencias significativas entre la edad pero no entre los vi
nedos.
Parte XI
Combinatoria y probabilidad
132
Combinatoria y probabilidad
La probabilidad mide la frecuencia con la que se obtiene un resultado (o conjunto de resultados) al llevar
a cabo un experimento aleatorio, del que se conocen todos los resultados posibles, bajo condiciones suficientemente estables. La teora de la probabilidad se usa extensamente en areas como la estadstica, la fsica, la
matematica, la ciencia y la filosofa para sacar conclusiones sobre la probabilidad de sucesos potenciales y la
mecanica subyacente de sistemas complejos.
Para este captulo vamos a utilizar el paquete prob dise
nada por G. Jay Kerns de la Youngstown State
University. Para ense
nar c
omo funciona la probabilidad lo primero que vamos a construir son diferentes espacios
muestrales y servirnos de la combinatoria para ver las diferentes variantes de estos.
Espacio muestral
El primer paso es crear un espacio muestral, es decir el conjunto de posibles resultados simples de un
experimento. La forma m
as simple de un espacio muestral esta representado por un conjunto de datos, cada
uno correspondiente a un resultado del experimento. Sin embargo, esta estructura no es lo suficientemente rica
para describir algunas de las aplicaciones m
as interesantes de probabilidad nos encontraremos. Hay que tener
en cuenta que el programa genera la mayor parte de los espacios muestrales mediante la orden expand.grid
del paquete basico, aunque tambien lo podemos construir con la funcion combn del paquete combinat.
Por ejemplo para calcular el espacios muestral del experimento de lanzar una moneda, cuyos resultados
pueden ser cara o cruz (heads and tails), podemos configurar el espacio muestral con la funcion tosscoin.
Hemos modificado la orden, que denominamos EMmonedas para adaptarla al Espa
nol para que sea mas
comoda su interpretaci
on.
>
>
+
+
+
+
+
+
+
+
+
133
Combinatoria y probabilidad
134
1
Cara
Cara
2
Cruz
Cara
3
Cara
Cruz
4
Cruz
Cruz
> # Calcular el espacio muestral de la variable aleatoria tirar tres monedas.
> EMmonedas(3)
Lanzamiento 1 Lanzamiento 2 Lanzamiento 3
1
Cara
Cara
Cara
2
Cruz
Cara
Cara
3
Cara
Cruz
Cara
4
Cruz
Cruz
Cara
5
Cara
Cara
Cruz
6
Cruz
Cara
Cruz
7
Cara
Cruz
Cruz
8
Cruz
Cruz
Cruz
Consideramos ahora el lanzamiento de un dado no sesgado, es decir, con la misma probabilidad de ocurrencia de cualquiera de las caras. Para ello utilizamos la funcion rolldie( ) del paquete prob o la modificacion
EMdados( )
>
>
+
+
+
+
+
+
+
+
+
> # Calcular
> EMdados(2)
X1 X2
1
1 1
2
2 1
Combinatoria y probabilidad
135
3
3 1
4
4 1
5
5 1
6
6 1
7
1 2
8
2 2
9
3 2
10 4 2
11 5 2
12 6 2
13 1 3
14 2 3
15 3 3
16 4 3
17 5 3
18 6 3
19 1 4
20 2 4
21 3 4
22 4 4
23 5 4
24 6 4
25 1 5
26 2 5
27 3 5
28 4 5
29 5 5
30 6 5
31 1 6
32 2 6
33 3 6
34 4 6
35 5 6
36 6 6
> # Calcular el espacio muestral de la variable aleatoria tirar dos dados de 4 lados.
> EMdadoslado(2,4)
X1 X2
1
1 1
2
2 1
3
3 1
4
4 1
5
1 2
6
2 2
7
3 2
8
4 2
9
1 3
10 2 3
11 3 3
12 4 3
13 1 4
14 2 4
15 3 4
16 4 4
Si lo que queremos es simular un juego con cartas podemos utilizar la funcion cards que nos muestra
Combinatoria y probabilidad
136
Combinatoria y probabilidad
137
Combinatoria y probabilidad
20 Amarilla
21
Azul
138
Azul
Azul
En muchos casos, no necesitamos generar los espacios muestrales de interes, sino que es suficiente simplemente con contar el n
umero de resultados. La funcion nsamp calculara el n
umero de filas de un espacio
muestral hechas por urnsamples. Los argumentos son: nsamp(n, k, replace = FALSE, ordered = FALSE), con
n el n
umero de elementos que forman la poblacion, k el n
umero de elementos que forman la muestra, replace
es un valor logico que indica si hay o no reemplazamiento y ordered es otro valor logico que indica si hay o no
orden o repetici
on.
> # No de elementos de la muestra del espacio muestral de elegir de
> # elementos muestras de 2, con reemplazamiento y sin repetici
on.
> nsamp(n=3, k=2, replace = TRUE, ordered = TRUE)
[1] 9
> # No de elementos de la muestra del espacio muestral de elegir de
> # elementos muestras de 2, con reemplazamiento y con repetici
on.
> nsamp(n=3, k=2, replace = TRUE, ordered = FALSE)
[1] 6
> # No de elementos de la muestra del espacio muestral de elegir de
> # elementos muestras de 2, sin reemplazamiento y con repetici
on.
> nsamp(n=3, k=2, replace = FALSE, ordered = TRUE)
[1] 6
> # No de elementos de la muestra del espacio muestral de elegir de
> # elementos muestras de 2, sin reemplazamiento y sin repetici
on.
> nsamp(n=3, k=2, replace = FALSE, ordered = FALSE)
[1] 3
una poblaci
on de 3
una poblaci
on de 3
una poblaci
on de 3
una poblaci
on de 3
replace = TRUE
replace = FALSE
ordered = TRUE
nk
ordered = FALSE
n!
nk!
(n1+k)!
(n1)!k!
n!
(nk)!k!
Vamos a utilizar esta orden a la hora de calcular combinaciones y variaciones con o sin repeticion.
a) Combinaciones:
Podemos determinar el n
umero de subgrupos de elementos que se pueden formar con los n.elementos de
una nuestra. Cada subgrupo se diferencia del resto en los elementos que lo componen, sin que influya el orden.
Por ejemplo, calcular las posibles combinaciones de 2 elementos que se pueden formar con los n
umeros 1, 2 y 3.
Se pueden establecer 3 parejas diferentes: (1,2), (1,3) y (2,3). En el calculo de combinaciones las parejas (1,2)
y (2,1) se consideran identicas, por lo que s
olo se cuentan una vez.
Para calcular el n
umero de combinaciones se aplica la siguiente formula:
Cn,k =
n!
= 220
(n k)!k!
La expresion Cn,k representa las combinaciones de n elementos, formando subgrupos de k elementos. Por
ejemplo C12,4 son las combinaciones de 12 elementos agrupandolos en subgrupos de 4 elementos:
12!
(12 4)!4!
Con la orden nsamp tendramos que indicar que no habra reemplazamiento ni repeticion mediante los
comandos replace = FALSE y ordered = FALSE.
Combinatoria y probabilidad
139
(n 1 + k)!
(n 1)!k!
Por ejemplo las combinaciones de 12 elementos con repeticion, agrupandolos en subgrupos de 3, en los que
2 o los 3 elementos podran estar repetidos seran:
CR12,3 =
(12 1 + 3)!
= 364
(12 1)!3!
Es decir, podramos formar 364 subgrupos diferentes de 3 elementos. El codigo en R, mediante los comandos
replace = TRUE y ordered = FALSE sera:
> # Combinaciones con repetici
on de 12 elementos agrup
andolos en subgrupos de 3 elementos.
> nsamp(n=12, k=3, replace = TRUE, ordered = FALSE)
[1] 364
c) Variaciones:
Para calcular el n
umero de subgrupos de elementos que se pueden establecer con los k elementos de una
muestra en el que cada subgrupo se diferencia del resto en los elementos que lo componen en el orden de dichos
elementos (es lo que le diferencia de las combinaciones). Por ejemplo, para calcular las posibles variaciones de
2 elementos que se pueden establecer con los n
umeros 1, 2 y 3, tendramos 6 posibles parejas: (1,2), (1,3), (2,1),
(2,3), (3,1) y (3,3). En este caso los subgrupos (1,2) y (2,1) se consideran distintos.
Para calcular el n
umero de variaciones se aplica la siguiente formula:
Vn,k =
n!
n k!
La expresion Vn,k representa las variaciones de n elementos, formando subgrupos de k elementos. En este
caso un subgrupo se diferenciar
a del resto, bien por los elementos que lo forman, o bien por el orden de dichos
elementos. Por ejemplo: V12,3 son las variaciones de 12 elementos agrupandolos en subgrupos de 3 elementos:
12!
= 1320
12 3!
Es decir, podramos formar 1320 subgrupos diferentes de 3 elementos, a partir de los 12 elementos. El
codigo en R, mediante los comandos replace = FALSE y ordered = TRUE sera:
V12,3 =
Combinatoria y probabilidad
140
Sin repetici
on
Con Repetici
on
Combinaciones
nsamp(n, k, replace = FALSE, ordered = FALSE)
nsamp(n, k, replace = TRUE, ordered = FALSE)
Sin repetici
on
Con Repetici
on
Variaciones
nsamp(n, k, replace= FALSE, ordered = TRUE)
nsamp(n, k, replace = TRUE, ordered = TRUE)
Espacio muestral
Un espacio probabilstico est
a definido como una terna (, B, P ) compuesta por un espacio medible (, B)
y la funcion de probabilidad P definida para todo suceso perteneciente a B, de manera que satisfaga los conocidos como axiomas de probabilidad:
1. Certeza de la presentaci
on de en el experimento estocastico.
P () = 1
2. La probabilidad de un suceso E es un n
umero comprendido entre 0 y 1.
0 P (E) 1
3. La probabilidad de la presentaci
on de uno de los sucesos indicados, es igual a la suma de las probabilidades
de cada uno de esos sucesos, siempre que se trate de sucesos mutuamente excluyentes.
P (ni=1 Ei ) = P (E1 ) + ... + P (En )
Para todo conjunto E1 + ... + En de sucesos disjuntos, es decir Ei Ej = para todo i 6= j
El package prob nos permite tratar un espacio probabilstico como un objeto de resultados S y un vector
de probabilidades que llamaremos probs con valores correspondientes a las probabilidades de cada resultado
S. Cuando S es un conjunto de datos, es posible a
nadir una columna llamada probs a S por lo que el espacio
de probabilidad ser
a simplemente un conjunto de datos al podemos llamar el espacio. En el caso de que S sea
una lista, podemos combinar los resultados y probs en una lista mas grande, por lo que el espacio tendra dos
componentes: resultados y probs. El u
nico requisito es que las entradas de probs no puedan ser negativas y su
suma (probs) sea uno.
Combinatoria y probabilidad
141
Para lograr esto en R, podemos usar la funcion probspace. La sintaxis general es probspace(x, probs),
donde x es un espacio muestral de resultados y probs es un vector (de la misma longitud que el n
umero de
resultados en x). Vamos a utilizar algunos ejemplos para demostrar algunas de las opciones mas comunes de
la funcion y de conceptos b
asicos.
Ejemplos:
El modelo de equiprobabilidad
El modelo de equiprobabilidad afirma que todos los resultados del espacio muestral tienen la misma probabilidad, por lo tanto, si un espacio muestra los resultados de n elementos, entonces probs sera un vector de
longitud n con entradas identicas 1/n. La forma mas rapida de generar probs es con la funcion rep. Vamos a
comenzar con el experimento de lanzar un dado normal por lo que n = 6. Vamos a construir el espacio muestral,
generando el vector probs, y ponerlos juntos con probspace.
# Calculamos los valores de la variable aleatoria de lanzar un dado con la funci
on rolldie que simula el
> resultados = rolldie(1); resultados
X1
1 1
2 2
3 3
4 4
5 5
6 6
> # Llamamos p al vector de probabilidades simples
> p = rep(1/6, times = 6); p
[1] 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
> probspace(resultados, probs = p)
X1
probs
1 1 0.1666667
2 2 0.1666667
3 3 0.1666667
4 4 0.1666667
5 5 0.1666667
6 6 0.1666667
> # Otra forma es mediante el vector 1:6
> probspace(1:6, probs = p)
X1
probs
1 1 0.1666667
2 2 0.1666667
3 3 0.1666667
4 4 0.1666667
5 5 0.1666667
6 6 0.1666667
Ademas, puesto que el modelo de la misma probabilidad juega un papel fundamental en el estudio de la
probabilidad, la funci
on probspace asignar
a las probabilidades si no se especifica el vector probs. De este modo,
se obtiene la misma respuesta con:
> probspace(1:6)
x
probs
1 1 0.1666667
2 2 0.1666667
Combinatoria y probabilidad
3
4
5
6
>
1
2
3
4
5
6
142
3 0.1666667
4 0.1666667
5 0.1666667
6 0.1666667
probspace(resultados)
X1
probs
1 0.1666667
2 0.1666667
3 0.1666667
4 0.1666667
5 0.1666667
6 0.1666667
Modificamos nuestra funci
on para adaptarla al espa
nol:
Combinatoria y probabilidad
143
Combinatoria y probabilidad
144
# Utilizamos la funci
on cards del paquete prob para crear
# el espacio muestral de sacar una carta de una baraja
E = cards()
# Tomamos el subconjunto de las cartas que son corazones
subset(E, suit == "Heart")
rank suit
27
2 Heart
28
3 Heart
29
4 Heart
30
5 Heart
31
6 Heart
32
7 Heart
33
8 Heart
34
9 Heart
35
10 Heart
36
J Heart
37
Q Heart
38
K Heart
39
A Heart
> # Tomamos el subconjunto de las cartas que su valor est
a entre 2 y 5
> subset(E, rank %in% 2:5)
rank
suit
1
2
Club
2
3
Club
3
4
Club
4
5
Club
14
2 Diamond
15
3 Diamond
16
4 Diamond
17
5 Diamond
27
2
Heart
28
3
Heart
29
4
Heart
30
5
Heart
40
2
Spade
41
3
Spade
42
4
Spade
43
5
Spade
Tambien podemos tomar el subconjunto de elementos que cumplen alguna expresion matematica. Por
ejemplo vamos a tomar del espacio muestral del experimento lanzamiento de tres dados aquellos subconjuntos
que cumplan alguna condici
on matem
atica.
> # Tomamos el espacio muestral del experimento: lanzamiento de tres dados
> F<-rolldie(3)
> # Calculamos el subconjunto que cumpla que su suma sea mayor o igual que 18
Combinatoria y probabilidad
145
Combinatoria y probabilidad
>
>
>
>
>
146
Combinatoria y probabilidad
206
212
2
2
5
6
147
6
6
library(prob)
# Vamos a calcular
S = cards()
A = subset(S, suit
# Corazones
B = subset(S, rank
# Valores del 2 al
# Uni
on
union(A, B)
rank
suit
1
2
Club
2
3
Club
14
2 Diamond
15
3 Diamond
27
2
Heart
28
3
Heart
29
4
Heart
30
5
Heart
31
6
Heart
32
7
Heart
AB
AB
A\B
union(A,B)
intersect(A,B)
setdiff(A,B)
Combinatoria y probabilidad
148
33
8
Heart
34
9
Heart
35
10
Heart
36
J
Heart
37
Q
Heart
38
K
Heart
39
A
Heart
40
2
Spade
41
3
Spade
> # Intersecci
on
> intersect(A, B)
rank suit
27
2 Heart
28
3 Heart
> # Diferencia A menos B
> setdiff(A, B)
rank suit
29
4 Heart
30
5 Heart
31
6 Heart
32
7 Heart
33
8 Heart
34
9 Heart
35
10 Heart
36
J Heart
37
Q Heart
38
K Heart
39
A Heart
> # Diferencia B menos A
> setdiff(B, A)
rank
suit
1
2
Club
2
3
Club
14
2 Diamond
15
3 Diamond
40
2
Spade
41
3
Spade
La funcion setdiff no es simetrica. Podemos calcular el complemento de un conjunto A, elementos de S que
no estan en A, mediante setdiff (S, A).
> # Complementario de A
> NoA<-setdiff(S, A)
> NoA
rank
suit
1
2
Club
2
3
Club
3
4
Club
4
5
Club
5
6
Club
6
7
Club
7
8
Club
8
9
Club
9
10
Club
Combinatoria y probabilidad
10
J
Club
11
Q
Club
12
K
Club
13
A
Club
14
2 Diamond
15
3 Diamond
16
4 Diamond
17
5 Diamond
18
6 Diamond
19
7 Diamond
20
8 Diamond
21
9 Diamond
22
10 Diamond
23
J Diamond
24
Q Diamond
25
K Diamond
26
A Diamond
40
2
Spade
41
3
Spade
42
4
Spade
43
5
Spade
44
6
Spade
45
7
Spade
46
8
Spade
47
9
Spade
48
10
Spade
49
J
Spade
50
Q
Spade
51
K
Spade
52
A
Spade
> # Complementario de B
> NoB<-setdiff(S, B)
> NoB
rank
suit
3
4
Club
4
5
Club
5
6
Club
6
7
Club
7
8
Club
8
9
Club
9
10
Club
10
J
Club
11
Q
Club
12
K
Club
13
A
Club
16
4 Diamond
17
5 Diamond
18
6 Diamond
19
7 Diamond
20
8 Diamond
21
9 Diamond
22
10 Diamond
23
J Diamond
24
Q Diamond
149
Combinatoria y probabilidad
150
25
K Diamond
26
A Diamond
29
4
Heart
30
5
Heart
31
6
Heart
32
7
Heart
33
8
Heart
34
9
Heart
35
10
Heart
36
J
Heart
37
Q
Heart
38
K
Heart
39
A
Heart
42
4
Spade
43
5
Spade
44
6
Spade
45
7
Spade
46
8
Spade
47
9
Spade
48
10
Spade
49
J
Spade
50
Q
Spade
51
K
Spade
52
A
Spade
> # Complementario del complementario de B
> NoNoB<-setdiff(S, setdiff(S, B))
> NoNoB
rank
suit
1
2
Club
2
3
Club
14
2 Diamond
15
3 Diamond
27
2
Heart
28
3
Heart
40
2
Spade
41
3
Spade
> B
rank
suit
1
2
Club
2
3
Club
14
2 Diamond
15
3 Diamond
27
2
Heart
28
3
Heart
40
2
Spade
41
3
Spade
C
alculo de probabilidades
Para calcular probabilidades asociadas con subconjuntos utilizamos la funcion prob. Consideremos el
experimento de sacar una carta de una baraja de naipes. Denotamos el espacio de probabilidad asociada con
el experimento como S y los subconjuntos A (corazones) y B (cartas con valor entre 2 y 3).
Combinatoria y probabilidad
151
Probabilidad condicional
Probabilidad condicionada es la probabilidad de que ocurra un evento A, sabiendo que tambien sucede
otro evento B.
P (A | B) =
P (A B)
P (B)
Para calcular la probabilidad condicional es necesario usar el argumento given en la funcion prob.
> S = cards(makespace = TRUE)
> A = subset(S, suit == "Heart")
> B = subset(S, rank %in% 2:3)
> # Probabilidad de A dado B
> prob(A, given = B)
[1] 0.25
> # Probabilidad de A dado que los valores est
an entre 2 y 3
> prob(S, suit == "Heart", given = rank %in% 2:3)
[1] 0.25
> # Coinciden
> # Probabilidad de B dado A
> prob(B, given = A)
[1] 0.1538462
> # Vemos si coincide con la definici
on de probabilidad condicionada
> prob(intersect(A, B))/prob(B)
[1] 0.25
Tri
angulo de Pascal
Un elemento muy u
til a la hora de la combinatoria y la probabilidad es el triangulo de Pascal definido como
un conjunto infinito de n
umeros enteros ordenados en forma de triangulo que expresan coeficientes binomiales.
El interes del Tri
angulo de Pascal radica en que permite calcular de forma sencilla n
umeros combinatorios
aplicables al binomio de Newton.
Vamos a calcular el Tri
angulo de Pascal con la funcion:
TPascal <- function(filas){
aux <- matrix(nrow=filas+1,ncol=filas)
Combinatoria y probabilidad
for (j in 1:filas){
aux[1,j] <- "-"
}
for (i in 1:filas+1){
for (j in 0:filas)
aux[i,j] <- "."
}
for(i in 1:filas+1){
j <- 1
aux[i,j] <- 1
while(i-1 > j){
aux[i,j+1] <- factorial(i-2)/(factorial(j)*(factorial((i-2)-j)))
j <- j+1
}
}
print(data.frame(aux,check.names=F), row.names = FALSE)
}
> Tri
angulo de Pascal de orden 15
> TPascal(15)
1 2 3
4
5
6
7
8
9
10
11 12 13 14 15
- - - - - 1 . .
.
.
.
.
.
.
.
.
. . . .
1 1 .
.
.
.
.
.
.
.
.
. . . .
1 2 1
.
.
.
.
.
.
.
.
. . . .
1 3 3
1
.
.
.
.
.
.
.
. . . .
1 4 6
4
1
.
.
.
.
.
.
. . . .
1 5 10 10
5
1
.
.
.
.
.
. . . .
1 6 15 20
15
6
1
.
.
.
.
. . . .
1 7 21 35
35
21
7
1
.
.
.
. . . .
1 8 28 56
70
56
28
8
1
.
.
. . . .
1 9 36 84 126 126
84
36
9
1
.
. . . .
1 10 45 120 210 252 210 120
45
10
1
. . . .
1 11 55 165 330 462 462 330 165
55
11
1 . . .
1 12 66 220 495 792 924 792 495 220
66 12 1 . .
1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1 .
1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
152
Parte XII
Entornos gr
aficos para trabajar con R
153
Entornos gr
aficos para trabajar con R
R, a primera vista, parece un entorno solo para personas con grandes conocimientos en Estadstica o en
programacion, lo que no es cierto ya que a diferencia de otros lenguajes este es muy facil de aprender. Para los
no iniciados en R (aunque siempre es necesario tener conocimientos como los explicados anteriormente) cuenta
con entornos m
as amables que presentan un aspecto mas habitual para los usuarios.
En este captulo haremos una presentacion de algunos de ellos, como el modulo R commander que se
ha convertido en el reclamo principal de R para no utilizar apenas programacion. Pero como veremos en el
mercado existen varios con sus virtudes y defectos.
R-commander
El R-commander (paquete Rcmdr) es una interfaz grafica que se compone de una ventana que contiene
varios men
us, botones y campos de informacion. Por defecto R Commander consiste en una barra de men
us,
una barra de herramientas, una ventana de instrucciones, una ventana de salida y una ventana de mensajes.
Las instrucciones para leer, escribir, transformar y analizar datos se ejecutan usando la barra de men
u de la
parte superior de la ventana de R Commander. La mayor parte de los items de este men
u le guiaran mediante
ventanas de dialogo, preguntando m
as all
a de la especificacion.
154
155
En la u
ltima ventana se generar
a informacion o un errores si la orden o las ordenes enviadas son incompletas.
156
Para instalar R-Comander hay que instalar el paquete Rcmdr. En el caso de este paquete se van a instalar
muchos otros paquetes (dependencias), que son necesarios para que puedan funcionar todas las opciones de los
men
us del entorno gr
afico.
Cada vez que se quiera abrir el R Commander hay que teclear library(Rcmdr) en la consola de comandos,
o entrar en el men
u Paquetes -Cargar paquete... y seleccionar Rcmd en la ventana que aparece.
Tinn-R
Tinn-R es un editor de archivos que mejora al bloc de notas de Windows ya que contiene mejoras para
permitir el uso de sintaxis de R. Tambien proporciona un men
u y una barra de herramientas adicional que se
comunica y llama al R-gui que nos permite ejecutar el codigo en el mismo programa.
RKWard
RKWard ha sido desarrollado como una herramienta que combina el potencial de R con la facilidad de uso
de otros paquetes estadsticos comerciales sin perder acceso a los beneficios del trabajo por lnea de comandos
o con guiones.
Gracias a su sistema de complementos RKWard ampla constantemente el n
umero de funciones a las cuales
se puede acceder sin necesidad de escribir el codigo directamente. Estos componentes permiten que, a partir
de una interfaz gr
afica de usuario, se generen instrucciones en R para las operaciones estadsticas mas usuales
o complejas. De esta manera, incluso sin tener conocimientos profundos sobre el lenguaje es posible realizar
analisis de datos avanzados o gr
aficas elaboradas. Los resultados de las computaciones son formateados y
presentados como HTML, haciendo posible, con un solo clic y arrastre, exportar tablas y graficos hacia, por
ejemplo, suites ofim
aticas.
157
Incluye un visor del espacio de trabajo, donde se tiene acceso a los paquetes, funciones y variables cargados por R o importados de otras fuentes. Cuenta ademas con visor de archivos, y ventanas de edicion de
conjuntos de datos, visualizaci
on del contenido de las variables, ayuda, bitacora de comandos y la salida HTML.
Igualmente ofrece componentes que ayudan en la edicion de codigo y ejecucion directa de ordenes, como la
ventana de guiones y la consola de R, donde se pueden introducir comandos o programas completos como se
hara en la interfaz de texto original de R, con ayudas adicionales como coloreado de sintaxis documentacion de
funciones mientras se escribe, y con la caracterstica de captura de graficas o dialogos emergentes producidos
ofreciendo opciones adicionales de manipulacion, guardado y exportacion de estos.
Otros
Existen mas entornos gr
aficos iguales de u
tiles que los anteriores, cada uno con sus ventajas e inconvenientes.
Una lista de ellos es:
JGR o Java GUI for R, una terminal de R multiplataforma basada en Java
RExcel, que permite usar R y Rcmdr desde Microsoft Excel
rggobi
Sage
Statistical Lab
nexusBPM
RWorkBench
Referencias
1. Aqueronte; http://unbarquero.blogspot.com/
2. Arriaza A. J., Fern
andez F. y col. (2008), Estadstica Basica con R y R-Commander, Servicio de Publicaciones de la Universidad de C
adiz
3. Carmona F., Ejercicios de An
alisis de la Varianza con R
4. Crawley M.J.(2007), The R Book, Hardcover
5. Gonzalez A. y Gonz
alez S.(2000), Introduccion a R: Notas sobre R: Un entorno de programacion para
Analisis de Datos y Gr
aficos, R Development Core Team
158