• No se han encontrado resultados

Clase 2 Curso de Bioestadística 2017

N/A
N/A
Protected

Academic year: 2021

Share "Clase 2 Curso de Bioestadística 2017"

Copied!
9
0
0

Texto completo

(1)

Clase 2

Curso de Bioestadística

2017

Condicionales y bucles.

Rtiene disponible una construcción condicional de la forma:

if ( condición a verificar ) {expresiones a evaluar si se cumple la condición} else {expresiones a evaluar si no se cumple la condición}

donde condicion a verificar evalúa una condición y debe devolver un valor: TRUE o FALSE. Si el resultado es TRUE, entonces devolverá el resultado de “expresiones a evaluar si se cumple la condición” y si es FALSE el de “expresiones a evaluar si no se cumple la condición”. No es obligatorio incluir el else, pudiendo usarse de la forma:

if ( condición a verificar ) {expresiones a evaluar si se cumple la condición} El siguiente ejemplo utiliza if para decir si la variable entero es par o impar. entero <- 2 # Tenemos una variable entera, en este caso vale 2.

if (entero %% 2 == 0) print('el numero es par') else print('el numero es impar') ## [1] "el numero es par"

Para construir un loop se puede usar el comando “for” que tiene la siguiente forma: for ( índice in etiquetas ) { expresiones a evaluar }

donde índice es la variable que varía en el loop, típicamente usamos una letra. expr 1 es un vector (generalmente es una secuencia, como por ejemplo 1:10), y expresiones a evaluar es generalmente un grupo de expresiones, donde alguna de ellas depende de la variable sobre la que estamos iterando.

Supongamos que tenemos el vector numérico y: y <- c(3, 2, 0, 6, 1, 0)

y que para cada elemento de y queremos ver si es igual o no a 0. Si lo es, remplazaremos el elemento con el número 10.

for (i in 1:length(y)){ if (y[i] == 0) y[i] <- 10

}

Este ejercicio muestra una combinacion de un for y un if que se puede hacer también con una sola función ifelse:

(2)

ifelse(condición, expresión si se cumple la condición, expresión si no se cumple)

La condición se puede hacer con vectores (u otros objetos que veremos más adelante) y devuelve un objeto igual cambiando los lugares donde se cumplió la condición por los resultados de las expresiones correspondientes. El ejemplo anterior queda:

y <- c(3, 2, 0, 6, 1, 0)

y <- ifelse(y==0, 10, y) # O simplemente sobreescribir. y

## [1] 3 2 10 6 1 10

Ejercicio 1 Dado el vector: v <- c(4, 5, 9, 2, 1, 4), remplazar las coordendas impares de v por

el número 1.

Otro bucle de interés es poder ejecutar expresiones sin una cantidad de veces predefinida como lo tiene el for. Este cometido lo cumple el siguiente:

while ( condición ) {expresiones}

Tal como se lee, mientras se cumpla la “condición” se va a ejecutar “expresiones” tantas veces como sea necesario. Es importante tener en expresiones el control de los argumentos de la condición para que en algún momento el while se deje de ejecutar. Para el curso, tiene más sentido usarlo con la función de la siguiente sección (generar eventos aleatorios hasta observar algo, por ejemplo).

Como comentario, solo queda decir que todo lo que se hace con un for se puede hacer con un while, la diferencia está en el tamaño de memoria usado y el tiempo de ejecución. Mientras un for suele ser más rápido, es necesario crear el vector etiquetas el cual ocupa cierta cantidad de memoria RAM, con lo cual, el vector etiquetas tiene una limitante (debe poder ser contenido en la RAM). Eso no sucede con while porque simplemente no se recorre un conjunto de etiquetas, el espacio usado es solo el espacio necesario para la variable necesaria en la condición, que en general, es de tamaño despreciable, con lo cual el while puede sustituir a un for en condiciones donde el for no es posible. Con esta observación es natural pensar que el while sea un mejor bucle, pero el precio a pagar el poco uso de memoria es el tiempo de ejecución, recorrer un conjunto de etiquetas es temporalmente menos costoso que ir controlando condiciones (la condición del while). Esto para el curso no es relevante, lo importante es tener el resultado, solo queda el comentario a modo de información.

Simular variables

Muchas veces queremos obtener valores aleatorios, para realizar ciertas simulaciones. Si bien hay muchas funciones para hacerlo, una de las más simples es la función sample y se puede pensar que es la realización de un sorteo aleatorio de un conjunto de etiquetas, elementos o individuos, pudiendo ser con o sin reemplazo. Esto permite poder generar sin necesidad de tener que realizarlo en persona, tiradas de monedas, tiradas de dados, extracciones de subgrupos aleatorios de personas de una población determinada, con las ventajas de ser más rápido y fácil, pudiendo realizase cuantas veces se desee sin un costo temporal significativo.

Ejemplos:

(3)

Moneda <- c("Cara", "Numero") sample(Moneda, 1)

## [1] "Numero"

2. Tirar una moneda equilibrada 10 veces:

sample(Moneda, 10, replace = TRUE)

## [1] "Numero" "Numero" "Cara" "Cara" "Cara" "Numero" "Numero" ## [8] "Cara" "Cara" "Numero"

3. Tirar un dado equilibrado:

dado <- 1:6

sample(dado, 1) ## [1] 6

4. Tirar un dado no equilibrado:

Supongamos que tenemos un dado fallado ya que las probabilidades de salir el 1, 2,. . . ,6 son respectivamente: P(“sale el 1”) = 1/12, P(“sale el 2”) = 1/12, P(“sale el 3”) = 1/12, P(“sale el 4”) = 1/12, P(“sale el 5”) = 1/3 y P(“sale el 6”) = 1/3. Luego, simulamos una tirada de este dado así:

sample(dado, 1, prob= c(1/12, 1/12, 1/12, 1/12, 1/3, 1/3)) ## [1] 6

Ejercicio 2 Simular la tirada de tres dados equilibrados. Sumar las salidas correspondientes a

los tres dados. Repetir lo anterior varias veces, ¿le da siempre lo mismo?

Simulación de variables aleatorias.

La siguiente tabla resume cómo simular una M.A.S. (Muestra aleatoria simple) x1, x2, . . . , xncorrespondiente

a n variables aleatorias X1, X2, . . . , Xn i.i.d (Independientes y con Idéntica Distribución) para las

distribuciones más conocidas:

Distribución Simulación

X ~ N(µ, σ) rnorm(n, mean= mu, sd= sigma) X ~ Exp(λ) rexp(n, rate= lambda)

X ~ Poisson(λ) rpois(n, lambda)

X ~ Bin(N, p) rbinom(n, size= N, prob= p) X ~ Geo(p) rgeo(n, prob= p)

X ~ BinNeg(k, p) rnbinom(n, size= k, prob= p) X ~ Unif(a, b) runif(n, min= a, max= b)

(4)

anteriores con un while.

Por ejemplo: jugar a tirar tres dados, el juego termina cuando se saca por segunda vez una suma de 3 entre todos los dados.

# Tirar tres dados es como sacar de un conjunto de etiquetas numeradas del 1 al 6, tres # consecutivas y con reposición al conjunto la etiqueta extraída en cada oportunidad. # Esto simula este experimento individual:

sample(1:6, 3, replace=TRUE) ## [1] 5 1 5

# Lo que va a decir si el while termina es algún indicador reportando si la

# suma fue 3 por segunda vez o no. Por ejemplo, antes del while se puede crear una # variable que sea cant_tres, inicializada en 0 porque antes de empezar a jugar # no hay jugadas que hayan sumado 3 y que por cada vez que una jugada sume 3, # la variable cant_tres aumente en 1. Esto se controla con un if.

sum( sample(1:6, 3, replace=TRUE) ) == 3 ## [1] FALSE

# Esto suma el resultado de cada dado y verifica si la suma es 3 o no.

# Además hay que tener un registro de la cantidad de veces que se jugó; similarmente se # puede crear una variable jugadas que comienza valiendo 0 porque antes de empezar # a jugar no hay jugadas hechas. Luego, cada vez que se ejecute la expresión del # while, jugada debe aumentar en 1 sin importar si se suma 3 o no.

# Todo quedaría así: jugadas <- 0

cant_tres <- 0

while ( cant_tres < 2 ) {

jugadas <- jugadas + 1 # Aumenta la cantidad de jugadas. valores <- sample(1:6, 3, replace=TRUE) # Se juega

if ( sum(valores) == 3 ) cant_tres <- cant_tres + 1 # Verifica si gana. }

# PARA ESTA SIMULACION: print(

paste('Se necesito jugar', jugadas, 'veces para observar una suma de 3, por segunda vez.') )

## [1] "Se necesito jugar 45 veces para observar una suma de 3, por segunda vez."

Ejercicio 3 Reproducir el experimento anterior que consiste en tirar tres dados hasta que la suma

de 3 por segunda vez. Determinar la cantidad de veces que fue necesario tirar tres dados. Repetir el procedimiento anterior varias veces, ¿da siempre lo mismo?.

El experimento anterior simula una sola vez el experimento que consiste en tirar tres dados hasta que la suma de 3 por seguna vez. Puede resultar más interesante simular el experimento anterior muchas veces y llevar un

(5)

registro de la cantidad de jugadas necesarias para cada vez. Podemos llevar eso a cabo con un for combinado con lo que hicimos antes. Es decir que dentro de cada iteración del for vamos a ejecutar un while. Observar cómo lo hacemos:

n <- 12 # cantidad de veces que vamos a repetir el experimento

repeticiones <- rep(0, n) # en este vector vamos a registrar la cantidad de jugadas necesarias # en cada repetición del experimento.

for (i in 1:n) { jugadas <- 0 cant_tres <- 0 while ( cant_tres < 2 ) {

jugadas <- jugadas + 1 # Aumenta la cantidad de jugadas. valores <- sample(1:6, 3, replace=TRUE) # Se juega

if ( sum(valores) == 3 ) cant_tres <- cant_tres + 1 # Verifica si gana. }

repeticiones[i] <- jugadas print(

paste('Se necesito jugar', jugadas, 'veces para observar una suma de 3, por segunda vez.') )

}

## [1] "Se necesito jugar 153 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 311 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 448 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 184 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 235 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 789 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 163 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 272 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 723 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 389 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 278 veces para observar una suma de 3, por segunda vez." ## [1] "Se necesito jugar 747 veces para observar una suma de 3, por segunda vez."

Observar que dentro del for anotamos la secuencia que usamos antes para simular una jugada. Una forma de mostrar la cantidad de veces que tuvimos que jugar en cada repetición del experimento es mediante la función barplot:

(6)

Cantidad de veces que se tuvo que jugar en cada repetición:

0

200

400

600

Otra forma de presentar resultados de un experimento aleatorio es mediante un histograma, que es lo que presentamos en la siguiente sección.

Ejercicio 4 Reproducir las líneas anteriores.

Ejercicio 5 Observar la ayuda de la función barplot().

Histogramas:

El lenguaje R dispone de varias funciones preparadas para la representación gráfica de datos y estas serán muy importantes a lo largo del curso. En la próxima clase de R las estudiaremos con más cuidado. Por ahora, analizaremos el uso de la función hist() (histograma).

Un histograma es una representación gráfica de un vector de coordenadas numéricas x = (x1, . . . , xn) en

forma de barras, donde la superficie de cada barra es proporcional a la frecuencia con que los valores xicaen

en intervalos (bases de las barras) definidos por defecto por R o que uno puede construir “a mano”. hist(x) devuelve el histograma del vector x.

Veamos ejemplos de cómo usar la función hist().

v <- c(1, 1.6, 3, 7, 3, 3.1, 5.4, 5.5, 6, 8, 9, 8, 8.3)

Este es el histograma con la partición de los intervalos (bases de las barras) que R define por defecto. hist(v)

(7)

Histogram of v

v

Frequency

0

2

4

6

8

10

0.0

1.5

3.0

Observar que, por defecto, el histograma está graficando barras en la que la altura de cada barra indica la frecuencia de los datos en cada intervalo, es decir, la cantidad de datos que cayeron en cada intervalo. Por ejemplo, hay dos coordenadas de v entre 0 y 2, por lo que la barra entre 0 y 2 tiene altura 2.

Podría interesarnos tener la frecuencia relativa de cada intervalo, es decir, que la altura de la barra corre-spondiente al intervalo [0,2] sea 2

13 ya que solo 2 de las 13 coordenadas de v cayeron en ese intervalo. Eso lo

arreglamos poniendo como parámetro: probability = TRUE. hist(v, probability = TRUE)

Histogram of v

v

Density

0

2

4

6

8

10

0.00

0.06

0.12

Ejercicio 6 Observar la ayuda de la función hist().

Otro de los parámetros que podemos cambiarle a la función hist() es la cantidad de intervalos que se va a considerar. Incluso podemos acomodar los intervalos de manera tal que no todos tengan la misma longitud. Todos estos arreglos se hacen con el parámetro breaks=. A breaks podemos pasarle un número (la cantidad de intervalos de igual longitud que queremos para el histograma), un vector que indique el inicio y fin de cada intervalo (si no queremos que tengan la misma longitud) o el nombre de alguna regla para partir en intervalos (las más comunes son “sturges” y “scott”). Veamos tres ejemplos:

(8)

Histograma usando el argumento breaks="scott"

v

Frequency

0

2

4

6

8

10

0

2

4

6

8

hist(v, breaks= c(0, 2, 5, 8.3, 10),

main= 'Histograma usando una "partición personalizada"', col= "green")

Histograma usando una "partición personalizada"

v

Density

0

2

4

6

8

10

0.00

0.10

hist(v, breaks=8,

main= 'Histograma partiendo el rango de v en 8 intervalos', col= "yellow")

Histograma partiendo el rango de v en 8 intervalos

v

Frequency

2

4

6

8

0.0

1.5

3.0

(9)

Finalmente, podemos mejorar la presentación del histograma agregándole como argumento los siguientes parámetros:

• main Para agregarle un título al histograma (main=“título entre comillas”) • xlab Para ponerle un nombre al eje de las x (xlab=“título para el eje de las x”) • ylab Para ponerle un nombre al eje de las y (ylab=“titulo para el eje de las y”.)

• xlim=, ylim= Especifica los límites inferiores y superiores de los ejes. (xlim= c(0, 2) graficará los valores de x entre 0 y 2.)

• col Es el color usado para las barras. (col=“Nombre del color en Inglés” o un número ; usar colours() para ver qué colores hay).

Ejercicio 7: Simular una M.A.S. de tamaño n=1000 correspondientes a una variable aleatoria

N(µ = 1, σ2= 9). Llamarle v al vector obtenido.

a) Realizar varios histogramas de v cambiando los parámetros presentados antes. b) Recorrer las coordenadas de v hasta encontrar una coordenada mayor a 2. c) Recorrer todas las coordenadas de v para construir un vector w tal que:

• Si vi0, entonces wi = vi

• Si vi<0, entonces wi = −vi

Referencias

Documento similar

● La condición de contador &lt; fin puede utilizar cualquier condición explicada en el tema pasado para la estructura if.. Comparadores de

La nota de la PEC sólo se tendrá en consideración si la calificación de la Prueba Presencial es superior a 5 (sobre 10), es decir, aprobar el examen es condición indispensable

RA2 Aborda la condición humana y la apertura del hombre a la trascendencia desde diferentes métodos y sistemas propios de la filosofía contemporánea.. RA3 Dialoga en sus

Ejercicio. Diremos que la ecuación es exacta si se cumple ∂P ∂y = ∂Q ∂x.. Entonces podemos pensar en la condición ii) como una ecuación con incógnita µ.. El término de

Si el alumno no cumple con el 75% de asistencia, pierde la condición de alumno regular y podrá recursar la materia o rendir el examen final como alumno libre. Aprobación con un

Si es cierta se ejecuta el Bloque de sentencias y luego las instrucciones de operación en ese orden y se vuelve a evaluar la condición. • Si la condición es falsa termina

En estas posturas se puede sostener que hay ciertos grados de responsabilidad política que se le exigen a las creaciones de ficciones artísticas, entendiendo que éstas son parte de

2. Los derechos, prerrogativas y deberes del Diputado serán efectivos desde el momento mismo en que el Diputado sea proclamado electo. Sin embargo, celebradas tres sesiones