Está en la página 1de 10

Probabilidad y Estadstica con R

1. Introducci on a R
La idea de este texto es que, dado que R ofrece una gran variedad de posibilidades, introducir
algunos conceptos y nociones del software.
R es un sistema para analisis estadsticos y gr acos creado por Ross Ihaka y Robert Gentleman.
Se dice que la naturaleza de R es doble: la de programa y la de lenguaje de programaci on; y es
considerado como un dialecto del lenguaje S creado por los Laboratorios AT&T Bell.
R se distribuye gratuitamente bajo los terminos de la GNU (General Public Licence); su desar-
rollo y distribuci on son llevados a cabo por varios estadsticos conocidos como el Grupo Nuclear de
Desarrollo de R.
Los archivos necesarios para instalar R se distribuyen desde el sitio de internet Comprehensive
R Archive Network (CRAN) junto con las instrucciones de instalacion.
Al principio, R puede parecer demasiado complejo para el no-especialista. Esto no es cierto nece-
sariamente, de hecho, una de las caractersticas mas sobresalientes de R es su enorme exibilidad.
Mientras que programas m as clasicos muestran directamente los resultados de un an alisis, R guarda
estos resultados como un objeto, de tal manera que se puede hacer un an alisis sin necesidad de
mostrar su resultado inmediatamente.
R es un lenguaje Orientado a Objetos: bajo este complejo termino se esconde la simplicidad
y exibilidad de R. El hecho que R es un lenguaje de programacion puede desaminar a muchos
usuarios que piensan que no tienen alma de programadores. Esto no es necesariamente cierto por
dos razones. Primero R es un lenguaje interpretado (como Java) y no compilado (como C, C++,
Fortran, Pascal, . . . ), lo cual signica que los comandos escritos en el teclado son ejecutados
directamente sin necesidad de construir ejecutables. Como segunda medida, la sint axis de R es muy
simple e intuitiva. Por ejemplo, una regresi on lineal se puede ejecutar con el comando lm(y,x).
Para que una funci on sea ejecutada en R debe estar siempre acompa nada de parentesis, inclusive
en el caso que no haya nada dentro de los mismos (por ej., ls()). Si se escribe el nombre de la
funci on sin los parentesis, R mostrar a el contenido (c odigo) mismo de la funci on. Pero no hablemos
de la programacion en R antes de haberlo instalado.
1.1. Instalaci on de R
La idea de esta seccci on es guiar la instalaci on de R en nuestro equipo (el equipo de la Facultad
ya tiene cargado el programa as que para el laboratorio no sera necesaria la instalaci on, sin embargo
sera recomendable instalarlo en su equipo personal para asignaturas posteriores). Empecemos...
Primero entremos al sitio http://www.r-project.org
De click en el link CRAN (ubicada en la barra lateral izquierda en la seccion de Download,
Packages.
Aqu se muestran varios sitios de donde se puede descargar el programa, estos sitios son
llamados mirrors. Para que la descarga no lleve demasiado tiempo se recomienda bajarlo de
alg un sitio con el mismo huso horario que nosotros.
Una vez que se selecciona el mirror, se debe bajar el paquete seg un el sistema operativo que
se tenga
Si usted vive en un mundo de Windows de click en base y descargue dando click en el link
Download R-3.0.0 for Windows
Si su equipo es Macintosh, una vez seleeccionado el mirror, encuentre la liga MacOS X que
llevar a al paquete que se necesita descargar: R-3.0.0.pkg
Si su equipo trabaja con LINUX, estamos liados porque nunca he trabajado con R for LINUX
jejeje!
Ahora ejecute el archivo que ha bajado, si se desea instalarlo de una vez
2. Manejo de datos en R
2.1. Creacion, listado y remoci on de objetos en memoria
Un objeto puede ser creado con el operador asignar el cual se denota como una echa con el
signo menos y el smbolo > o < dependiendo de la direccion en que asigna el objeto:
> n <- 15
> n
[1] 15
> 5 -> n
> n
[1] 5
> x <- 1
> X <- 10
> x
[1] 1
> X
[1] 10
Asignacion con = versus <
La asignacion = puede causar confusi on si se trata de entender la sintaxis como una ecuaci on
matem atica. Si se escribe x = 2x+1 como una ecuacion matem atica, esta tiene una unica soluci on
y es -1. Sin embargo, en R, la misma expresion x=2*x+1, se interpreta como asignar el valor de
2*x+1 a la variable x. Esto actualiza el valor previo de x. As si x tiene el valor de 2 antes de esta
lnea, esta instrucci on la deja con un valor de 5 (pues 2 2 + 1 = 5).
Este tipo de confusi on puede ser minimizada usando el operador < . La expresi on en R,
x<-2*x+1 hace que visualmente la confusion sea menor, y la direcci on de la echa aclara a un m as
la actualizacion del valor de x. De hecho, > tambien se utiliza para asignar valores de izquierda
a derecha (el de la izquierda es ya conocido y el de la derecha es el que se va a denir o actualizar).
2
2.2. Generaci on de datos
2.2.1. Secuencias Regulares
Una secuencia regular de n umeros enteros, por ejemplo de 1 hasta 30, se puede generar con:
> x <- 1:30
El vector resultante x tiene 30 elementos. El operador : tiene prioridad sobre otros operadores
aritmeticos en una expresion:
> 1:10-1
[1] 0 1 2 3 4 5 6 7 8 9
> 1:(10-1)
[1] 1 2 3 4 5 6 7 8 9
La funcion seq puede generar sucesiones de n umeros reales:
> seq(1, 5, 0.5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
donde el primer n umero indica el principio de la sucesion, el segundo el nal y el tercero el
incremento que se debe usar para generar la sucesion. Tambien se puede usar:
> seq(length=9, from=1, to=5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
Tambien se pueden escribir los valores directamente usando la funcion contanear, c:
> c(1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
Si se quiere, tambien es posible introducir datos directamente desde el teclado usando la funcion
scan sin opciones:
> z <- scan()
1: 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 10: Read 9 items
> z
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
La funcion rep crea un vector con elementos identicos:
> rep(1, 30)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
La funci on sequence crea una serie de secuencias de n umeros enteros donde cada secuencia
termina en el n umero (o n umeros) especicado(s) como argumento(s). Por ejemplo,
> sequence(4:5)
[1] 1 2 3 4 1 2 3 4 5
> sequence(c(10,5))
[1] 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5
3
2.2.2. Matrices
Para generar vectores, normalmente se utiliza la funcion c de concatenar:
Ejemplo 2.1 (concatenar)
>v1<-c(3.1,4,5,6)
>v2<-c(1,2)
> c(v1,v2)
[1] 3.1 4.0 5.0 6.0 1.0 2.0
Hay varias maneras de generar una matriz. A continuacion se mostrar a como se construye un
vector de 10 ceros con las instrucciones c y rep:
>a<-c(rep(0,10))
Para convertir al objeto a en una matriz de 2 5, se utiliza la funcion dim:
>dim(a)<-c(2,5)
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 0 0 0
Para acceder al elemento a23 y modicarlo:
> a[2,3]<-8
Para modicar la columna 5:
> a[,5]<-c(2,2)
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 2
[2,] 0 0 8 0 2
Otra manera de construir matrices es utilizando la funcion matrix:
Ejemplo 2.2 (Creacion de matrices)
Para generar una matriz de 2 2 con valor 1:
> m1 <- matrix(1, nr = 2, nc = 2)
Para generar una matriz de 2 2 con valor 2:
> m2 <- matrix(2, nr = 2, nc = 2)
Las funciones cbind() y rbind() construyen matrices uniendo otras matrices (o vectores), hor-
izontalmente (modo columna) o verticalmente (modo la), respectivamente.
En la asignaci on
4
> X <- cbind(arg 1, arg 2, arg 3, ...)
los argumentos pueden ser vectores de cualquier longitud o matrices con el mismo n umero de
las. El resultado es una matriz cuyas columnas son los argumentos concatenados, arg 1, arg 2, . .
.
Ejemplo 2.3 (Creacion de matrices)
> rbind(m1, m2)
[,1] [,2]
[1,] 1 1
[2,] 1 1
[3,] 2 2
[4,] 2 2
> cbind(m1, m2)
[,1] [,2] [,3] [,4]
[1,] 1 1 2 2
[2,] 1 1 2 2
El operador para el producto de dos matrices es % %. Por ejemplo, considerando las dos
matrices m1 y m2:
> rbind(m1, m2) %*% cbind(m1, m2)
[,1] [,2] [,3] [,4]
[1,] 2 2 4 4
[2,] 2 2 4 4
[3,] 4 4 8 8
[4,] 4 4 8 8
> cbind(m1, m2) %*% rbind(m1, m2)
[,1] [,2]
[1,] 10 10
[2,] 10 10
La transposicion de una matriz se realiza con la funci on t; esta funcion tambien funciona con
marcos de datos.
> a<-c(1,2,3,4,5,6)
> d<-matrix(a,nrow=2)
> d
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> t(d)
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
5
Una restriccion en un vector de datos es que todos los valores tienen que ser del mismo tipo.
De manera general, estos pueden ser booleanos, numericos, de caracteres alfabeticos (strings.
en
programaci on orientada a objetos).
Ejemplo 2.4 (tipos de datos)
> simpsons=c("Homero","Marge","Bart","Lisa","Maggie")
> simpsons
[1] "Homero" "Marge" "Bart" "Lisa" "Maggie"
Ya se han visto ejemplos en los que los vectores de datos son numericos, en el caso de strings
estos se introducen con comillas dobles () o con comillas simples ().
NOTA: Si en un vector de datos se introducen datos string y datos numericos interpre-
tar a todo el vector como string y no se podr am realizar operaciones aritmeticas sobre los datos
numericos (pues los trata como letras).
Un vector de datos puede tener sus entradas etiquetadas o con un nombre. Dichas etiquetas
aparecer an cuando se haga referencia explcita al vector. La funci on names() es usada para esto.
Ejemplo 2.5 (Etiquetas a las variables)
> names(simpsons)=c("papa","mam a","hijo","hija mayor","hija menor")
> names(simpsons)
[1] "papa" "mam a" "hijo" "hija mayor" "hija menor"
> simpsons
pap a mama hijo hija mayor hija menor
"Homero" "Marge" "Bart" "Lisa" "Maggie"
> vecinos=c(simpsons,"Flanders")
> vecinos
pap a mama hijo hija mayor hija menor
"Homero" "Marge" "Bart" "Lisa" "Maggie" "Flanders"
Note que las etiquetas no inuyen en la naturaleza del vector, se hizo un concatenamiento de
simpsons con Flanders sin importar que Flanders no tuviera etiqueta.
3. Algunos ejemplos de probabilidad
Ejemplo 3.1 (Ensayos Bernoulli)
Un primer ejemplo muy sencillo es el lanzamiento de una moneda (ensayo Bernoulli). En R se
puede simular el lanzamiento de la moneda repetidamente sin necedidad de hacerlo fsicamente
con la funcion rbinom(), y de hecho, esta funci on se puede implementar para cualquier ensayo
Bernoulli. Para lanzar 10 veces una moneda justa la instruccion en R es la siguiente:
> rbinom(10,1,1/2)
[1] 1 0 1 1 0 1 0 1 0 0
> rbinom(10,1,1/2)
[1] 0 1 1 1 1 1 0 1 0 0
> rbinom(10,1,1/2)
[1] 0 1 0 0 1 1 0 1 1 1
6
Esta funci on tiene tres par ametros: el primer par ametro es el n umero de lanzamientos, el segundo
par ametro identica al 1 con exito y el tercer parametro es la probabilidad de exito.
3.0.3. Expresiones Booleanas
Como en todos los lenguajes de programaci on, se puede comparar n umeros usando igual, no-
igual, menor que, menor o igual que, mayor, etc. Tales comparaciones tambien pueden ser hechas
usando operaciones Booleanas y, o y no. Los simbolos que se utilizan para estas operaciones
son
Operaci on Notaci on en R
y &&
o ||
no !
igual ==
no igual !=
menor que <
menor o igual que <=
mayor que >
mayor o igual que >=
Sin embargo, a diferencia de otros programas, R permite comparar vectores como si fueran
n umeros individuales. El resultado de esta comparaci on es otro vector. Por ejemplo, para comparar
ensayos Bernoulli con 1 como exito la instrucci on es la siguiente:
> rbinom(10,1,1/2)==1
[1] TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
> rbinom(10,1,1/2)==1
[1] FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE
> rbinom(10,1,1/2)==1
[1] TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
y el vector resultante es un vector con valores Booleanos, en el cual en vez de 0s y 1s hay
FALSEs y TRUEs, respectivamente.
Si se le colocan parentesis rectangulares a la instrucci on anterior se puede ver en que n umero
de ensayo ocurrieron los exitos
> (1:10)[rbinom(10,1,1/2)==1]
[1] 2 3 5 6 7 8 9
> (1:10)[rbinom(10,1,1/2)==1]
[1] 1 4 9
> (1:10)[rbinom(10,1,1/2)==1]
[1] 2 5 7 8
NOTA IMPORTANTE: Como se est an haciendo simulaciones cada que se ejecuta la instruccion
nuevos vectors de ceros y unos se generan.
Se puede crear una funcion en general, que diga en que que n umero de ensayo se obtuvieron los
soles en n lanzamientos con probabilidad p de obtener sol
7
soles<-function(n,p)(1:n)[rbinom(n,1,p)==1]
Por ejemplo, si queremos saber en que intentos cae sol en 25 lanzamientos con una moneda
justa (i.e. p =
1
2
)
> soles(25,1/2)
[1] 5 6 10 12 13 16 19 20 23 24 25
> soles(25,1/2)
[1] 1 5 7 11 12 13 15 20 21 22 23
> soles(25,1/2)
[1] 3 4 7 9 10 11 16 17 18 20 22 23
Ejemplo 3.2 (Volados)
Se lanza una moneda dos veces y se observa qe cay o aguila o sol. Por ejemplo (A, S) establece
que el primer resultado fue aguila y el segundo fue sol. El conjunto {(A, S), (A, A), (S, S), (S, A)}
es el conjunto de todos los posibles resultados. Si X denota el n umero de soles, entonces X puede
tomar los valores 0, 1 o 2. Si dicha moneda es justa, entonces P(X = 0) =
1
4
, P(X = 1) =
1
2
y
P(X = 2) =
1
4
.
Se har a un diagrama de picos de una distribuci on. El diagrama de picos muestra las proba-
bilidades de para cada valor en el rango de una variable aleatoria, y es importante notar que s olo
hace sentido esta gr aca (por el momento) para variables aleatorias discretas. En R, los comandos
para hacer una gr aca de picos:
> k=0:4
> p=c(1,2,3,2,1)/9
> plot(k,p,type="h",xlab="k",ylab="Probabilidad", ylim=c(0,max(p)))
> points(k,p,pch=16,cex=1)
Nota: El argumento type=h dibuja las lneas verticales del diagrama de picos
Ejemplo 3.3 (El problema de los cumplea nos)
Si n estudiantes se seleccionan aleatoriamente en un salon de clases, cu al es la probabilidad de
que al menos dos de ellos cumplan a nos el mismo da? S olo con nes didacticos, se supondr a que
un a no tiene 365 das (i.e. no se consideran a nos bisiestos) y tambien se supondr a que es igual de
probable cumplir a nos en todos los das del a no. Denamos los siguientes eventos:
B: Al menos dos estudiantes cumplan a nos el mismo da. Entonces, B
c
es el evento de que los n
estudiantes cumplan a nos en distintos das. Notese que
P(B
c
) =
365!
(365 n)!365
n
y por lo tanto
P(B) = 1
365!
(365 n)!365
n
. Se crear a una funcion en R para ver el comportamiento de esta probabilidad al variar el n umero
de estudiantes
8
> cumplea~nos<-function(n)1-factorial(365)/(factorial(365-n)*365^n)
> cumplea~nos(1)
[1] NaN Mensajes de aviso perdidos 1: In factorial(365) : value out
of range in gammafn 2: In factorial(365 - n) : value out of range
in gammafn
> cumplea~nos(100)
[1] NaN Mensajes de aviso perdidos 1: In factorial(365) : value out
of range in gammafn 2: In factorial(365 - n) : value out of range
in gammafn
> cumplea~nos(360)
[1] NaN Mensajes de aviso perdidos In factorial(365) : value out of
range in gammafn
R (como esperabamos) tiene problema en calucular 365!. Para solucionar este problema se
obtendr a el logfactorial de la expresi on del complemento
> nocumplea~nos<-function(n)exp(lfactorial(365)-lfactorial(365-n)-n*log(365))
> nocumplea~nos(2)
[1] 0.9972603
> nocumplea~nos(150)
[1] 2.451222e-16
> nocumplea~nos(c(20,22,25,30))
[1] 0.5885616 0.5243047 0.4313003 0.2936838
> plot(1:100,nocumplea~nos(1:100))
La sentencia plot, graca como funci on de n la log-probabilidad de que niguno cumpla a nos en
el mismo da
4. Un poco acerca de generacion de datos aleatorios
Se hablara un poco acerca de la generaci on de variables aleatorias, y no es el n de este texto
tener una discusi on acerca de la aleatoriedad de datos generados por un determinado algoritmo.
Por el momento se restringir a la atenci on al uso de la funci on sample() de R.
R generar a observaciones de una variable aleatoria discreta con la funcion sample(). Si el vector
k contiene los valores de los cuales se obtendr a la muestra, y p contiene las probabilidades de cada
valor, entonces el comando sample(k,size=1,prob=p) seleccionar a uno de los valores de k con las
probabilidades especicadas por p.
Ejemplo 4.1 (Simulacion de Volados)
Ya se estudio el ejemplo del lanzamiento de una moneda justa y denota el n umero de soles. Se
podra simular este experimento sin la necesidad de lanzar una moneda dos veces, sino de manera
computacional (en R) de la siguiente manera:
> k=0:2
> p=c(1,2,1)/4
> sample(k,size=1,prob=p)
[1] 1
9
> sample(k,size=1,prob=p)
[1] 1
> sample(k,size=1,prob=p)
[1] 2
Si no se escribe un valor para prob=, este por default tomar a los valores de k equiprobables. Se
puede usar esto pasa simular el lanzamiento de un par de dados y sumar sus valores (i.e. la suma
de las caras obtenidas en el lanzamiento de dos dados)
> sample(1:6,size=1)+sample(1:6,size=1)
[1] 7
> sample(1:6,size=1)+sample(1:6,size=1)
[1] 8
> sample(1:6,size=1)+sample(1:6,size=1)
[1] 5
Muestras aleatorias generadas por sample()
La funci on sample() generar a una muestra de tama no n de una distribuci on discreta especican-
do size=n. El muestreo se realizar a con reemplazo si se escribe la instruccion replace=TRUE. Esto
es importante si se desea una muestra aleatoria independiente (y obviamente, por su naturaleza,
identicamente distribuida). El valor por default es sin reemplazo.
Ejemplo 4.2 (Mas de Volados)
Considerese el lanzamiento de una moneda 10 veces y el de un dado 10 veces
> sample(0:1,size=10,replace=TRUE)
[1] 1 1 0 0 1 0 1 1 1 1
> sample(1:6,size=10,replace=TRUE)
[1] 3 3 6 6 6 1 2 4 4 3
> sample(1:6,size=10,replace=TRUE)+sample(1:6,size=10,replace=TRUE)
[1] 5 7 9 11 9 7 9 4 9 6
10

También podría gustarte