ESTADISTICA EN R
CAPITULO 1. DESCRIPCIÓN DE R: PRIMEROS PASOS
Funciones de ayuda
Así, por ejemplo, si se desea obtener ayuda sobre la función mean (que, como se verá
más adelante, calcula la media aritmética de un conjunto de datos), se debe teclear.
help (mean)
?mean
Cuando no se conoce el nombre exacto de la función sino una o varias palabras
claves, se puede utilizar la función “help.search“ para la búsqueda de ayuda. Si se
escribe en la consola.
help.search(“median”)
Tipos de datos
R permite trabajar con datos de distintos tipos. Los más comunes son:
Numeric: Para datos de tipo numérico. A su vez, dentro del tipo numérico se
pueden distinguir dos subtipos de datos:
-Integer: Para datos de tipo entero.
-Double: Para datos de tipo real (o de doble precisión). Es el tipo de dato numérico
que R considera por defecto, es decir, cuando se define un número en R, éste será de
tipo double.
Logical: Para datos de tipo lógico o binario. Los valores que pueden tomar
las variables de tipo lógico son TRUE o FALSE.
Character: Para caracteres o cadenas de caracteres.
Operaciones con tipos de datos
Creación de variables
Para crear una variable de tipo double (Datos de tipo real), basta con definir un valor
numérico cualquiera.
doub <- 4 # Escribimos doub <- 4 en la consola y pulsamos la tecla “Enter”
Nota: Es posible incluir comentarios que R no leerá si utilizamos líneas que
comiencen con el carácter #.
En el ejemplo anterior, mediante el operador <- se asigna a la variable doub el
valor 4 (<- es un operador de asignación en R). En las nuevas versiones de R se
puede utilizar el signo = en lugar de <-.
doub=4 # Asigna el valor 4 a la variable doub
doub # muestra el valor de la variable doub
[1] 4
Para definir variables de tipo integer, se aplica la función as.integer() a un dato de
tipo numérico.
int = as.integer(4)
int # muestra el valor de la variable int
[1] 4
Una variable lógica se define asignando el valor TRUE o FALSE a una variable.
logi=FALSE
logi
[1] FALSE
Por último, R considera como cadena de caracteres cualquier cosa encerrada entre
comillas dobles (“”).
char1 = “Hola” # cuidado con las comillas son las de la tecla del número 2
char1
[1] “Hola”
char2 <- “5 + 6”
char2
[1] “5 + 6”
Comprobación del tipo de una variable
Para determinar el tipo de una variable se aplica la función typeof() sobre la
variable en cuestión.
typeof(doub)
[1] “double”
typeof(int)
[1] “integer”
typeof(char1)
[1] “character”
Operadores básicos
R puede utilizarse como una calculadora, ya que tiene implementadas las
principales operaciones aritméticas como son la suma, la diferencia, el producto, la
división, la exponenciación, la división entera y el módulo de la división. Estas
operaciones se realizan mediante los símbolos +, -, *, /, ^, %/% y %%,
respectivamente.
2^3
[1] 8
9/6
[1] 1.5
9%/%6
[1] 1
9%%6
[1] 3
Como se ha visto anteriormente, en R es posible definir variables asignándoles un
determinado valor o, incluso, el resultado de una operación. Existen 3 operadores
de asignación diferentes: <- , = y ->. Los dos primeros evalúan la expresión situada
en la parte derecha y asignan el resultado a la variable de la parte izquierda,
mientras que el último realiza la asignación de forma inversa, de manera que es el
resultado de la evaluación de expresión de la parte izquierda se asigna a la variable
de la derecha.
a=2+2 #resultado de 2+2 se asigna a la variable a
b=3*2 #resultado de 3*2 se asigna a la variable b
b – a -> c # resultado de b-a se asigna a la variable c
a
[1] 4
b
[1] 6
c
[1] 2
Por otra parte, existen varios operadores que permiten establecer comparaciones
entre variables. Son los denominados operadores comparativos, que en R vienen
representados por los símbolos == (igual a), != (distinto a), < (menor
que), > (mayor que), <= (menor o igual que) y >= (mayor o igual que). Estos
operadores se caracterizan por ser binarios, esto es, únicamente permiten
comparaciones entre dos elementos. Para comparaciones más complejas, se utilizan
los operadores lógicos. Los más utilizados son & (AND ó “y lógico”) y | (OR u “o
lógico”).
a == 5
[1] FALSE
a == 4 & b < 2
[1] FALSE
a == 4 | b < 2
[1] TRUE
a == 4 | b < 2 & c != 9
[1] TRUE
Otras funciones interesantes
Además de las operaciones elementales, R tiene implementadas una amplia
variedad de funciones que permiten la realización de cálculos más complejos. A
continuación se muestran algunas de ellas:
sqrt(x) : Raíz cuadrada de x
abs(x) : Valor absoluto de x
sin(x) : Seno de x
cos(x) : Coseno de x
tan(x) : Tangente de x
log(x) : Logaritmo neperiano de x
log10(x) : Logaritmo decimal de x
exp(x) : Exponencial de x
Estructuras de datos
Hasta el momento se ha visto que se pueden definir variables en R que almacenen
valores o resultados de operaciones. Pero cuando se desea guardar un número
elevado de valores conviene organizarlos en estructuras de datos. Las estructuras
de datos más utilizadas en R son
Arrays. Pueden tener varias dimensiones, pero admiten únicamente un tipo
de dato. Dependiendo del número de dimensiones, se distingue entre
Vectores. Una dimensión
Matrices. Dos dimensiones
Arrays. Tres o más dimensiones.
Factores. Se utilizan para almacenar variables cualitativas en las que no
existe un orden específico entre las categorías.
Factores ordenados. Almacenan variables cualitativas ordinales, es decir,
variables cualitativas con un cierto orden entre sus categorías.
Data frames. Admite variables de distintos tipos, pero con la misma longitud.
Listas. La lista es la estructura de datos más flexible puesto que permite
incluir variables de tipos y longitudes diferentes.
Creación de estructuras de datos
Una vez presentadas las estructuras de datos, el siguiente paso es aprender a
crearlas.
Vectores: Para crear un vector se utiliza la función c, que concatena todos los
elementos que recibe como argumentos.
c(elemento1, elemento2, elemento3, …)
Matrices: Las matrices se definen mediante la función matrix. Para ello, se ha de
indicar qué datos va a tener la matriz, así como el número de filas y columnas.
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,…)
Por defecto, la función matrix considera una matriz con una sola fila y una sola
columna con valor NA (Not Available). El argumento byrow indica si la matriz se irá
completando por columnas (byrow = FALSE, que es la opción por defecto) o por filas
(byrow = TRUE). Modificando estos argumentos se pueden definir distintas matrices
según las necesidades que se tengan.
Arrays: Los arrays se crean a través de la función array, especificando el conjunto
de datos que va a formar parte del array así como las dimensiones del mismo.
array(data = NA, dim,…)
Factores y factores ordenados: Los factores y factores ordenados en R se crean
utilizando las funciones factor y ordered,respectivamente. Estas funciones
necesitan como argumentos el conjunto de datos y los niveles o categorías del factor.
factor(x, levels,…)
ordered(x, levels,…)
Un detalle muy importante que hay que tener en cuenta a la hora de definir los
niveles de un factor ordenado es que Rconsidera que los niveles vienen dados de
menor a mayor, es decir, que si dentro de la función ordered se especifica que levels
= c(2, 1, 3), R entiende que la primera categoría es menor que la segunda y que la
segunda es, a su vez, menor que la tercera, esto es, que 2 < 1 < 3.
Data frame y lista: Los data frame y las listas en R se crean utilizando las
funciones data.frame y list, respectivamente, indicando las variables que
conformarán la estructura de datos.
data.frame(variable1, variable2, variable3,…)
list(variable1, variable2, variable3,…)
Veamos algunos ejemplos:
Vectores
vec = c(1, 3, 14)
vec
[1] 1 3 14
Matrices
mat1 <- matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3) # por defecto las matrices se
completan por columna
mat1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
mat2 <- matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3, byrow = TRUE) # byrow = TRUE
indica que complete la matriz por filas
mat2
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
Nota: Las matrices mat1 y mat2 tienen los mismos elementos, pero en la primera de
ellas están dispuestos por columnas, mientras que en la segunda se han colocado
por filas.
Array
arr <- array(c(1,2,3,4,5,6,7,8), dim = c(2,2,2))
arr
,,1
[,1] [,2]
[1,] 1 3
[2,] 2 4
,,2
[,1] [,2]
[1,] 5 7
[2,] 6 8
Matrices
m <- matrix(c(1,1,2,1),2,2)
m
[,1] [,2]
[1,] 1 2
[2,] 1 1
Factores y Factores ordenados
fac <- factor(c(“H”,”M”,”M”,”H”,”H”,”M”), levels = c(“H”,”M”))
ord <- ordered(c(1,2,1,2,3,1,2,1,2), levels = c(1,2,3))
Como se ha resaltado antes, es muy importante tener en cuenta el orden en el que
se indican los niveles de la variable en un factor ordenado. En un factor (no
ordenado), el orden en el que aparecen las categorías de la variable es irrelevante.
Así, mientras que los factores ordenados.
ord <- ordered(c(1,2,1,2,3,1,2,1,2), levels = c(1,2,3))
ord2 <- ordered(c(1,2,1,2,3,1,2,1,2), levels = c(2,3,1))
ord3 <- ordered(c(1,2,1,2,3,1,2,1,2), levels = c(3,1,2))
son distintos, estos otros factores no ordenados
fac <- factor(c(“H”,”M”,”M”,”H”,”H”,”M”), levels = c(“H”,”M”))
fac2 <- factor(c(“H”,”M”,”M”,”H”,”H”,”M”), levels = c(“M”,”H”))
son totalmente equivalentes.
Data frames y Listas
a <- c(1,5,4)
b <- c(“hola”, “adiós”, “hasta luego”)
c <- c(TRUE, FALSE, FALSE)
d <- c(1,2,3,4,5)
dataframe <- data.frame(a, b, c)
dataframe
a b c
1 1 hola TRUE
2 5 adiós FALSE
3 4 hasta luego FALSE
list1 <- list(a, b, c)
list1
[[1]]
[1] 1 5 4
[[2]]
[1] "hola" "adiós" "hasta luego"
[[3]]
[1] TRUE FALSE FALSE
list2 <- list(a, b, c, d)
list2
[[1]]
[1] 1 5 4
[[2]]
[1] “hola” “adiós” “hasta luego”
[[3]]
[1] TRUE FALSE FALSE
[[4]]
[1] 1 2 3 4 5
Acceso a los elementos de las estructuras de datos
Una vez definida una estructura de datos, es importante conocer cómo acceder a los
elementos que la componen.
En un array (sea cual sea su dimensión), se utilizan los corchetes ([ ]), dentro de los
cuales se indica la posición del elemento al que queremos acceder en cada una de
las dimensiones del array.
vec <- c(1, 3, 14)
vec[3]
[1] 14
mat1 <- matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3)
mat1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
mat1[2, 3]
[1] 6
arr <- array(c(1,2,3,4,5,6,7,8), dim = c(2,2,2)) # el ultimo 2 indica que son dos
matrices.
arr
,,1
[,1] [,2]
[1,] 1 3
[2,] 2 4
,,2
[,1] [,2]
[1,] 5 7
[2,] 6 8
arr[2, 1, 2] # el elemento de la segunda fila primera columna de la segunda
matriz
[1] 6
También se puede acceder a varios elementos al mismo tiempo usando la función
de concatenación c.
mat1[c(1,2), 3] # los elementos (1, 3) y (2, 3) de la matriz
[1] 5 6
En el ejemplo anterior se obtienen dos elementos de la matriz mat1. El
primero situado en la primera fila y tercera columna y el segundo situado en la
segunda fila y tercera columna.
Para acceder a una fila completa, se indica el número de fila y no se indica ninguna
columna.
mat1[1,]
[1] 1 3 5
Del mismo modo se puede acceder a columnas completas
mat1[, c(1,2)]
[,1] [,2]
[1,] 1 3
[2,] 2 4
Al igual que en el caso de los arrays, para acceder a un elemento de un factor o de un
factor ordenado también se emplean los corchetes ([ ]), indicando la posición de
dicho elemento.
fact[2]
[1] M
Levels: H M
ord[c(2, 5)]
[1] 2 3
Levels: 1 < 2 < 3
En los data frames se utiliza el símbolo $ seguido del nombre de la columna dentro
del data frame.
dataframe$a
[1] 1 5 4
Recordemos que un data frame está formado por distintas columnas de igual
longitud. Cada una de estas columnas es en realidad un vector de manera que, una
vez se ha especificado la columna del data frame a la que se desea acceder (mediante
el símbolo $), es posible obtener valores de la columna usando los corchetes. Así,
por ejemplo, para obtener el primer valor dentro de la columna de
nombre a incluida en el data frame que se llama dataframe se tiene que escribir
dataframe$a[1]
[1] 1
Alternativamente, un data frame puede verse como una matriz por tanto, también
pueden usarse los corchetes ([]) para acceder a sus elementos.
dataframe[1,]
a b c
1 1 hola TRUE
Para acceder a un elemento dentro de una lista, se emplean los corchetes dobles
([[]]) y se indica dentro de ellos qué posición ocupa el elemento a acceder.
list1[[2]]
[1] “hola” “adiós” “hasta luego”
list2[[4]][2]
[1] 2
Ejemplos
peso <- c(19,14,15,17,20,23,30,19,25)
peso
[1] 19 14 15 17 20 23 30 19 25
peso < 20
[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE
peso < 20 | peso > 25
[1] TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE
peso[peso < 20]
[1] 19 14 15 17 19
peso[peso < 20 & peso != 15]
[1] 19 14 17 19
trat <- c(rep(“A”, 3), rep(“B”, 3), rep(“C”, 3))
trat
[1] "A" "A" "A" "B" "B" "B" "C" "C" "C"
peso[trat == “A”]
[1] 19 14 15
peso[trat == “A” | trat == “B”]
[1] 19 14 15 17 20 23
split(peso, trat)
$A
[1] 19 14 15
$B
[1] 17 20 23
$C
[1] 30 19 25
split(peso, trat)$A
[1] 19 14 15
x <- 1:15; length(x) # varias instrucciones en un mismo renglón separadas por ;
[1] 15
y <- matrix(5, nrow = 3, ncol = 4); dim(y)
[1] 3 4
is.vector(x); is.vector(y); is.array(x)
[1] TRUE
[1] FALSE
[1] FALSE
x1 <- 1:5; x2 <- c(1, 2, 3, 4, 5); x3 <- “patata”
x1
[1] 1 2 3 4 5
typeof(x1); typeof(x2); typeof(x3)
[1] "integer"
[1] "double"
[1] "character"
mode(x); mode(y); z <- c(TRUE, FALSE); mode(z)
[1] "numeric"
[1] "numeric"
[1] "logical"
attributes(y)
$dim
[1] 3 4
w <- list(a = 1:3, b = 5); attributes(w)
$names
[1] "a" "b"
y <- as.data.frame(y); attributes(y)
$names
[1] "V1" "V2" "V3" "V4"
$row.names
[1] 1 2 3
$class
[1] "data.frame"
Ejemplos: Generación de secuencias
x <- c(1, 2, 3, 4, 5)
x
[1] 1 2 3 4 5
x <- 1 : 10 ; y <- -5 : 3
x
[1] 1 2 3 4 5 6 7 8 9 10
1 : 4 + 1; 1 : (4 + 1)
[1] 2 3 4 5
[1] 1 2 3 4 5
x <- seq(from = 2, to = 18, by = 2) # la function seq genera una secuencia
x
[1] 2 4 6 8 10 12 14 16 18
x <- seq(from = 2, to = 18, length = 30)
x
[1] 2.000000 2.551724 3.103448 3.655172 4.206897 4.758621 5.310345
[8] 5.862069 6.413793 6.965517 7.517241 8.068966 8.620690 9.172414
[15] 9.724138 10.275862 10.827586 11.379310 11.931034 12.482759
13.034483
[22] 13.586207 14.137931 14.689655 15.241379 15.793103 16.344828
16.896552
[29] 17.448276 18.000000
y <- seq(along = x)
y
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
[24] 24 25 26 27 28 29 30
z <- c(1 : 5, 7:10, seq(from=-7, to=5, by=2))
z
[1] 1 2 3 4 5 7 8 9 10 -7 -5 -3 -1 1 3 5
rep(1, 5) #repite el 1 cinco veces
[1] 1 1 1 1 1
x <- 1:3; rep(x, 2)
[1] 1 2 3 1 2 3
y <- rep(5, 3); rep(x, y)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
rep(1 : 3, rep(5, 3))
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
rep(x, x)
[1] 1 2 2 3 3 3
rep(x, length = 8)
[1] 1 2 3 1 2 3 1 2
gl(3, 5) # es equivalente a rep(1:3, rep(5, 3))
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
gl(4, 1, length = 20) # gl genera factores
[1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
Levels: 1 2 3 4
gl(3, 4, label = c(“Rubio”, “Moreno”, “Pelirrojo”))
[1] Rubio Rubio Rubio Rubio Moreno Moreno Moreno
[8] Moreno Pelirrojo Pelirrojo Pelirrojo Pelirrojo
Levels: Rubio Moreno Pelirrojo.
Nota: Para generar secuencias también podemos usar las funciones seq y rep
Ejemplos: Selección de los elementos de un vector
x <- 1:7; x[1]; x[3]; x[c(2,6)] # el ; separa instrucciones
[1] 1
[1] 3
[1] 2 6
x[x > 4]
[1] 5 6 7
x>4
[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE
y <- x > 4
[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE
x[y]
[1] 5 6 7
x[-c(1, 5)]; y <- c(1, 2, 6); x[y]
[1] 2 3 4 6 7
[1] 1 2 6
names(x) <- c(“a”, “b”, “c”, “d”, ”e”, “manzana”) # Cuidado con las dobles las
comillas (tecla del 2)
names(x)
[1] "a" "b" "c" "d" "e" "manzana" NA
x[c(“a”, “e”, “manzana”)]
a e manzana
1 5 6
Ejemplos. Ordenación de vectores
x <- c(7, 4, 5, 9, 1)
x
[1] 7 4 5 9 1
order(x)
[1] 5 2 3 1 4
sort(x)
[1] 1 4 5 7 9
rev(x)
[1] 1 9 5 4 7
rank(x)
[1] 4 2 3 5 1
x[order(x)]
[1] 1 4 5 7 9
y <- c(1, 5, 5, 5, 7, 7, 9, 9, 9, 9); rank(x, y)
[1] 4 2 3 5 1
min(x); which.min(x); which(x == min(x))
[1] 1
[1] 5
[1] 5
y <- c(1, 1, 2, 2, 3); order(y, x)
[1] 2 1 3 4 5
Ejemplos de vectores de caracteres
paste1 <- paste(c(“I”, “J”, “M”), 3:5, sep = “”)
paste1
[1]"I3" "J4" "M5"
paste2<-paste(c(“I”,“J”,“M”),3:5,sep=“.”)
paste2
[1] "I.3" "J.4" "M.5"
unir1 <- paste(c(“el”, “sol”, “brilla”), collapse =” “)
unir1
[1] "el sol brilla"
unir2 <- paste(c(“el”, “sol”, “brilla”), collapse =”-“)
unir2
[1] "el-sol-brilla"
unir3 <- paste(c(“el”, “sol”, “brilla”))
unir3
[1] "el" "sol" "brilla"
letras <- LETTERS[1:9]; números <- 7:15
letras
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I"
unir4 <- paste(letras, números, sep =””)
unir4
[1] "A7" "B8" "C9" "D10" "E11" "F12" "G13" "H14" "I15"
substr(“abcdef”, 2, 4)
[1] "bcd"
x <- paste(LETTERS[1:7], collapse = “”)
x
[1] "ABCDEFG"
substr(x, 3, 7) <- c(“xyz”)
substr(x, 3, 7)
[1] "xyzFG"
x <- c(60, 90, 903); y <- factor(x); x ; y
[1] 60 90 903
[1] 60 90 903
Levels: 60 90 903
as.numeric(as.character(y)) # convierte un vector factor en numérico
[1] 60 90 903
factor1 <- factor(c(“alto”, “bajo”, “medio”))
factor1
[1] alto bajo medio
Levels: alto bajo medio
factor2 <- factor(c(“alto”, “bajo”, “medio”), levels = c(“bajo”, “medio”, “alto”)) #
cambia el orden de las etiquetas
[1] alto bajo medio
Levels: bajo medio alto
Ejemplos de arrays y matrices
a <- 1:24; dim(a) <- c(3,4,2)
a
,,1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
,,2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
dim(a)
[1] 3 4 2
arr1 <- array(7, dim = c(4,5))
arr1
[,1] [,2] [,3] [,4] [,5]
[1,] 7 7 7 7 7
[2,] 7 7 7 7 7
[3,] 7 7 7 7 7
[4,] 7 7 7 7 7
mat1 <- matrix(10:29, nrow = 5)
mat1
[,1] [,2] [,3] [,4]
[1,] 10 15 20 25
[2,] 11 16 21 26
[3,] 12 17 22 27
[4,] 13 18 23 28
[5,] 14 19 24 29
mat2 <- matrix(10:29, nrow = 5, byrow = TRUE)
mat2
[,1] [,2] [,3] [,4]
[1,] 10 11 12 13
[2,] 14 15 16 17
[3,] 18 19 20 21
[4,] 22 23 24 25
[5,] 26 27 28 29
mat3 <- 10:29; dim(mat3) <- c(5, 4)
mat3
[,1] [,2] [,3] [,4]
[1,] 10 15 20 25
[2,] 11 16 21 26
[3,] 12 17 22 27
[4,] 13 18 23 28
[5,] 14 19 24 29
a[1,1,1]; a[1,1,2]; a[3,4,2]
[1] 1
[1] 13
[1] 24
a[2, , ] # es un array de dimensión c(4,2)
[,1] [,2]
[1,] 2 14
[2,] 5 17
[3,] 8 20
[4,] 11 23
a[,3 , ] # es un array de dimensión c(3,2)
[,1] [,2]
[1,] 7 19
[2,] 8 20
[3,] 9 21
mat3[1, ]; mat3[, 2]; mat3[c(1, 3), c(2, 4)]
[1] 10 15 20 25
[1] 15 16 17 18 19
[,1] [,2]
[1,] 15 25
[2,] 17 27
mat4 <- matrix(c(1, 3, 2, 4), nrow = 2); mat4
[,1] [,2]
[1,] 1 2
[2,] 3 4
mat3[mat4] # coordenadas matricialmente
[1] 15 27
m1 <- matrix(1: 4, nr = 2, nc = 2)
m1
[,1] [,2]
[1,] 1 3
[2,] 2 4
m2 <- matrix(6: 9, nr = 2, nc = 2)
m2
[,1] [,2]
[1,] 6 8
[2,] 7 9
rbind(m1, m2) # rbind une matrices por filas
[,1] [,2]
[1,] 1 3
[2,] 2 4
[3,] 6 8
[4,] 7 9
cbind(m1, m2) # cbind une matrices por columnas
1] [,2] [,3] [,4]
[1,] 1 3 6 8
[2,] 2 4 7 9
diag(m1) # diagonal principal de la matriz
[1] 1 4
Ejemplos de Data frames y listas
x <- 1:4; n <- 10; M <- c(10, 35); y <- 2:5 ; x; n; M; y
[1] 1 2 3 4
[1] 10
[1] 10 35
[1] 2 3 4 5
data.frame(x, n)
x n
1 1 10
2 2 10
3 3 10
4 4 10
data.frame(x, M)
x M
1 1 10
2 2 35
3 3 10
4 4 35
data.frame(x, y)
x y
11 2
22 3
33 4
44 5
l1 <- list(x, y); l2 <- list(A = x, B = y) ; l1; l2
[[1]]
[1] 1 2 3 4
[[2]]
[1] 2 3 4 5
$A
[1] 1 2 3 4
$B
[1] 2 3 4 5
names(l1)
NULL
names(l2)
[1] "A" "B"
Lectura de datos desde ficheros externos
Cuando se trabaja con R es posible introducir los datos tecleándolos directamente e
ir visualizándolos en la consola a medida que los escribimos. Sin embargo, no es la
opción más habitual, ya que la introducción manual de datos es una tarea tediosa,
especialmente cuando se tiene un gran volumen de información. En estos casos, lo
más normal es disponer de un fichero de datos que el programa se encarga de
leer. R es capaz de leer ficheros con multitud de formatos: Excel (con
extensión .xls o .xlsx), SPSS (con extensión .sav),… Uno de los formatos más utilizado
para almacenar datos es el formato fichero de texto (con extensión .txt). Los ficheros
con extensión .txt son muy ligeros y sencillos de utilizar. Para leer un
fichero .txt en R se emplea la función read.table
read.table(file, header = FALSE,…)
El primer argumento de la función, file, hace referencia a la ruta en la cual está el
fichero a leer. Este argumento, al ser una cadena de caracteres, ha de ir entre
comillas dobles. Un detalle importante a tener en cuenta es que en R la barra que se
emplea para especificar una ruta es la barra / en lugar de la barra \ habitual.
Por otra parte, el segundo argumento es un argumento lógico mediante el cual se
indica si en el fichero de texto que vamos a leer aparecen los nombres de las
variables en la primera línea (en ese caso, header = TRUE) o no apacecen
(entonces, header = FALSE, que es la opción por defecto).
Al emplear esta función, read.table, se obtiene un data frame con todas las
observaciones de todas las variables incluidas en el fichero de texto.
EJERCICIO 1
En la siguiente tabla se recogen datos acerca de la raza, la edad, el peso y la
altura de 10 personas:
a) Elaborar un fichero de texto (con extensión .txt) que contenga la
información de la tabla anterior. Utilizar el tabulador para separar la
información referente a cada variable. Guárdalo en el escritorio y
llamarlo mibasededatos.txt.
b) Desde R leer el fichero que se acaba de crear y almacenar su contenido en
una variable de nombre datos.
c) Obtener los valores para las 4 variables para el tercer y el séptimo individuo
d) Determinar la altura del noveno individuo
e) Comprobar si la edad del primer individuo es mayor que la edad del último
individuo
f) Comprobar si el peso de los dos primeros individuos es menor que el peso
de los dos últimos
g) Calcular la raíz cuadrada de la altura del quinto individuo.
Resolución
a) Elaborar un fichero de texto (con extensión .txt) que contenga la
información de la tabla anterior. Utilizar el tabulador para separar la
información referente a cada variable. Guárdalo en el escritorio y
llámarlo mibasededatos.
Creamos un fichero de texto en el block de notas que recoja la información que
muestra la tabla y lo guardamos en el escritorio con el nombre mibasededatos El
fichero tendrá un aspecto parecido a éste.
b) Desde R leer el fichero que se acaba de crear y almacenar su contenido en
una variable de nombre datos.
Teniendo en cuenta que el fichero de datos contiene el nombre de las variables en la
primera línea, la orden que tenemos que emplear; para ello debemos activar en R
library(foreign).
datos <- read.table("C:/Users/Usuario/Desktop/mibasededatos.txt", header =
TRUE) # Cuidado con las dobles las comillas (tecla “)
Nota: La ruta hasta llegar al fichero varía en función del ordenador. Utilizar la
siguiente orden para situarse en el directorio de trabajo
setwd(“C:/Users/Usuario/Desktop/nombrecarpeta”)
setwd(“C:/Users/Usuario/Desktop/nombrecarpeta”)
datos <- read.table(“mibasededatos.txt”, header = TRUE)
Después de leer el fichero de datos, veamos qué aspecto tiene la variable datos
datos
Raza Edad Peso Altura
1 Blanca 24 58 156
2 Negra 26 62 175
3 Blanca 62 61 169
4 Blanca 31 67 171
5 Negra 30 71 159
6 Negra 41 69 160
7 Negra 51 68 158
8 Blanca 23 73 178
9 Blanca 28 56 168
10 Blanca 30 82 166
c) Obtener los valores para las 4 variables para el tercer y el séptimo
individuo.
Vamos a leer de forma conjunta las filas 3 y 7 del data frame.
datos[c(3,7),]
Raza Edad Peso Altura
3 Blanca 62 61 169
7 Negra 51 68 158
d) Determinar la altura del noveno individuo
Tenemos dos formas de conocer la altura del individuo
datos$Altura[9]
[1] 168
o bien
datos[9,4]
[1] 168
e) Comprobar si la edad del primer individuo es mayor que la edad del último
individuo
En este caso, tenemos que realizar una comparación simple
datos$Edad[1] > datos$Edad[10]
[1] FALSE
f) Comprobar si el peso de los dos primeros individuos es menor que el peso
de los dos últimos
datos$Peso[1] + datos$Peso[2] < datos$Peso[9] + datos$Peso[10]
[1] TRUE
g) Calcular la raíz cuadrada de la altura del quinto individuo
sqrt(datos$Altura[5])
[1] 12.60952
EJERCICIO 2
La siguiente tabla incluye información acerca del sexo de seis estudiantes, sus
puntuaciones en la asignatura de Estadística y la opinión que tienen acerca de
la asignatura (Buena, Regular o Mala)
Se pide:
a) Almacenar el contenido de la tabla en tres variables distintas (Sexo,
Puntuación y Opinión), seleccionando el tipo de variable adecuado en cada
caso.
b) Crear un data frame de nombre Estudiantes que contenga la información de
las tres variables creadas
c) La puntuación media de los hombres y de las mujeres
d) Los datos de las tres variables para el quinto individuo
e) El logaritmo neperiano de la puntuación del tercer individuo
f) Comprobar si la puntuación del segundo individuo o del cuarto individuo es
superior a 7.
Resolución
a) Almacenar el contenido de la tabla en tres variables distintas (Sexo,
Puntuación y Opinión), seleccionando el tipo de variable adecuado en cada
caso.
La variable Sexo es una variable cualitativa sin un orden específico entre sus
categorías, de modo que crearemos un factor no ordenado para almacenar la
información de esta variable.
La variable Opinión es una variable cualitativa con un orden entre sus categorías
(Mala < Regular < Buena), por lo que crearemos un factor ordenado para almacenar
la información de dicha variable
La variable Puntuación almacena en un vector de números reales.
sexo <- factor (c(“H”, “M”, “M”, “M”, “M”, “H”), levels = c(“H”, “M”))
sexo
[1] H M MMM H
Levels: H M
opinion <- ordered (c(“B”, “R”, “M”, “M”, “R”, “B”), levels = c(“M”, “R”, “B”))
opinion
[1] B R M M R B
Levels: M < R < B
puntuacion <- c(7.5, 8, 2, 6.5, 10, 9)
puntuacion
[1] 7.5 8.0 2.0 6.5 10.0 9.0
Nota: No olvidar que en R el signo decimal viene dado por el punto (.) y no por la
coma (,)
b) Crear un data frame de nombre Estudiantes que contenga la información de
las tres variables creadas
estudiantes<- data.frame(sexo, puntuacion, opinion)
estudiantes
sexo puntuacion opinion
1 H 7.5 B
2 M 8.0 R
3 M 2.0 M
4 M 6.5 M
5 M 10.0 R
6 H 9.0 B
c) La puntuación media de los hombres y de las mujeres.
Para calcular las puntuaciones medias de hombres y mujeres tendremos en cuenta
que hay 2 hombres en el fichero de datos, ocupando las posiciones 1 y 6 y que hay 4
mujeres en el fichero de datos, ocupando las posiciones 2, 3, 4 y 5.
media_H<- (estudiantes$puntuacion[1] + estudiantes$puntuacion[6])/2
media_H
[1] 8.25
media_M<- (estudiantes$puntuacion[2] + estudiantes$puntuacion[3]
+ estudiantes$puntuacion[4] + estudiantes$puntuacion[5])/4
media_M
[1] 6.625
Resultando que la puntuación media de los hombres es mayor que la de las mujeres.
d) Los datos de las tres variables para el quinto individuo
estudiantes[5,]
sexo puntuacion opinion
5 M 10 R
e) El logaritmo neperiano de la puntuación del tercer individuo
log(estudiantes$puntuacion[3])
[1] 0.6931472
f) Comprobar si la puntuación del segundo individuo o del cuarto individuo
es superior a 7
estudiantes$puntuacion[2] > 7 | estudiantes$puntuacion[4] > 7
[1] TRUE
EJERCICIO 3
En la siguiente tabla se muestra la altura, en metros, de los pinos que
componen 4 parcelas de terreno.
Se pide:
a) Crear 4 vectores numéricos, de manera que cada uno almacene la altura de
los pinos de una parcela
b) Agrupar los 4 vectores creados en el apartado anterior en una estructura
de datos adecuada, teniendo en cuenta sus características
c) Comprobar, para cada parcela, si la altura del primer pino supera a la del
último pino
d) Calcular el logaritmo decimal de la altura del tercer pino de la parcela 3
e) Calcular la suma de las alturas de los 3 primeros pinos de la parcela 4
f) Obtener la altura media de los pinos de la parcela 1.
Resolución
a) Crear 4 vectores numéricos, de manera que cada uno almacene la altura de
los pinos de una parcela
P1 <- c(7.5, 12, 14,5)
P1
[1] 7.5 12.0 14.0 5.0
P2 <- c(12.5, 10.5, 13, 9, 18.5)
P2
[1] 12.5 10.5 13.0 9.0 18.5
P3 <- c(11, 8, 7.5, 9.5, 19, 14)
P3
[1] 11.0 8.0 7.5 9.5 19.0 14.0
P4 <- c(12.5, 16, 9.5, 10)
P4
[1] 12.5 16.0 9.5 10.0
b) Agrupar los 4 vectores creados en el apartado anterior en una estructura
de datos adecuada, teniendo en cuenta sus características
pinos <- list(P1, P2, P3, P4)
pinos
[[1]]
[1] 7.5 12.0 14.0 5.0
[[2]]
[1] 12.5 10.5 13.0 9.0 18.5
[[3]]
[1] 11.0 8.0 7.5 9.5 19.0 14.0
[[4]]
[1] 12.5 16.0 9.5 10.0
c) Comprobar, para cada parcela, si la altura del primer pino supera a la del
último pino.
pinos[[1]][1] > pinos[[1]][3]
[1] FALSE
pinos[[2]][1] > pinos[[2]][5]
[1] FALSE
pinos[[3]][1] > pinos[[3]][6]
[1] FALSE
pinos[[4]][1] > pinos[[4]][4]
[1] TRUE
d) Calcular el logaritmo decimal de la altura del tercer pino de la parcela 3
log10(pinos[[3]][3])
[1] 0.8750613
e) Calcular la suma de las alturas de los 3 primeros pinos de la parcela 4
pinos[[4]][1] + pinos[[4]][2] + pinos[[4]][3]
[1] 38
f) Obtener la altura media de los pinos de la parcela 1
(pinos[[1]][1] + pinos[[1]][2] + pinos[[1]][3]) / 3
[1] 11.16667
EJERCICIO 4
En la siguiente tabla se recoge información sobre el sexo, la tensión arterial y
el pulso por minuto de los pacientes atendidos en una clínica a los largo de un
día
a) Elaborar un fichero de texto (con extensión .txt) que contenga la
información de la tabla anterior. Utilizar el tabulador para separar la
información referente a cada variable. Guárdalo en el escritorio y
llamarlo salud.txt
b) Desde R leer el fichero que se acaba de crear y almacenar su contenido en
una variable de nombre datos
c) Obtener los valores para las tres variables para el primer y el cuarto
individuo
d) Comprobar si la primera mujer (posición 2) tiene una tensión arterial
mayor que la segunda mujer (posición 5)
e) Calcular la media del pulso de los hombres
f ) Obtener la raíz cuadrada de la tensión arterial del cuarto individuo.
Resolución
a) Elaborar un fichero de texto (con extensión .txt) que contenga la
información de la tabla anterior. Utilizar el tabulador para separar la
información referente a cada variable. Guárdalo en el escritorio y
llamarlo salud.txt
b) Desde R leer el fichero que se acaba de crear y almacenar su contenido en
una variable de nombre datos
datos<- read.table(“salud.txt”, header = TRUE)
datos
Sexo Tension Pulso
1 Hombre 119 59
2 Mujer 99 89
3 Hombre 102 107
4 Hombre 78 76
5 Mujer 78 91
Nota: Utilizar la siguiente orden para situarse en el directorio de trabajo
setwd(“C:/Users/Usuario/Desktop/nombrecarpeta”)
c) Obtener los valores para las 3 variables para el primer y el cuarto individuo
datos[c(1,4),]
Sexo Tension Pulso
1 Hombre 119 59
4 Hombre 78 76
d) Comprobar si la primera mujer (posición 2) tiene una tensión arterial
mayor que la segunda mujer (posición 5)
datos$Tension[2] > datos$Tension[5]
[1] TRUE
e) Calcular la media del pulso de los hombres
(datos$Pulso[1] + datos$Pulso[3] + datos$Pulso[4])/3
[1] 80.66667
f ) Obtener la raíz cuadrada de la tensión arterial del cuarto individuo.
sqrt(datos$Tension[4])
[1] 8.831761
………………………………………………………………………………………………………………………..
CAPITULO 2 ESTADÍSTICA DESCRIPTIVA:
REPRESENTACIONES GRÁFICAS
Introducción al Análisis Descriptivo
En esta práctica tomaremos un primer contacto con las técnicas estadísticas que se
utilizan para ordenar, analizar y representar un conjunto de datos, con el fin de
describir apropiadamente sus características. El primer paso en el análisis de datos,
una vez introducidos los mismos, es realizar un análisis descriptivo o análisis
exploratorio de datos. Los principales objetivos de un análisis descriptivo o análisis
exploratorio de datos son la descripción y la síntesis de los datos. Para ello, los datos
se organizan en tablas, se calculan medidas que describen sus características más
importantes y se realizan representaciones gráficas.
Este análisis inicial proporciona una idea de la forma que tiene la distribución de las
observaciones y permite obtener estadísticos de tendencia central (media, mediana
y moda), de dispersión (varianza, desviación típica, rango), de forma (asimetría,
curtosis), de posición (percentiles), así como gráficos de barras, de sectores e
histograma.
R dispone de un amplio conjunto de herramientas para el análisis descriptivo de un
conjunto de datos.
Tabla de Frecuencias
Para crear tablas de frecuencia en R se emplea la función table o la
función prop.table, dependiendo de si la tabla muestra las frecuencias absolutas o
las frecuencias relativas. La sintaxis de estas órdenes es la siguiente:
table(x) # para frecuencias absolutas
prop.table(tab) # para las frecuencias relativas
La principal diferencia entre las dos funciones reside en el tipo de los argumentos
que necesita cada una.
table construye la tabla de frecuencias absolutas a partir de la variable que recibe
como argumento
prop.table recibe como argumento una tabla o una matriz que representa una tabla
de frecuencias absolutas, y a partir de ella construye la tabla de frecuencias relativas
asociada. Es decir, prop.table recibe como argumento el resultado que devuelve la
función table.
Ejemplo1:
En la siguiente tabla se recogen 29 datos sobre el peso, altura, velocidad y
color.
datos <- read.table(“C:/Users/Usuario/Desktop/misdatos.txt”, header = TRUE)
o bien
setwd(“C:/Users/Usuario/Desktop”) # situarse en el directorio de trabajo
datos <- read.table(“misdatos.txt”, header = TRUE)
datos
peso altura velocidad color
1 7.2 50 10.3 Blanco
2 8.5 66 10.3 Amarillo
3 9.8 73 10.2 Verde
4 6.5 72 16.4 Verde
5 7.5 81 18.8 Verde
6 10.1 73 19.7 Verde
7 11.0 66 15.6 Blanco
8 11.0 75 21.2 Amarillo
9 11.1 70 22.6 <NA>
10 11.2 75 19.9 Blanco
11 11.3 69 24.2 Amarillo
12 11.4 76 21.0 Blanco
13 11.4 76 21.4 Verde
14 11.7 69 21.3 Verde
15 12.0 75 NA Amarillo
16 12.9 64 22.2 Amarillo
17 12.9 55 33.8 Blanco
18 10.3 76 27.4 Amarillo
19 9.7 71 25.7 Verde
20 10.8 64 24.9 Verde
21 11.0 78 23.1 Amarillo
22 10.2 70 31.7 Amarillo
23 10.5 74 36.3 Verde
24 6.5 72 38.3 Verde
25 6.3 77 42.6 Verde
26 7.3 51 55.4 Blanco
27 7.5 62 NA Blanco
28 7.9 60 58.3 Amarillo
29 8.2 70 NA Verde
tabla_color <- table(datos$color)
tabla_color
Amarillo Blanco Verde
9 7 12
prop.table(tabla_color)
Amarillo Blanco Verde
0.3214286 0.2500000 0.4285714
tabla_peso <- table(datos$peso)
tabla_peso
6.3 6.5 7.2 7.3 7.5 7.9 8.2 8.5 9.7 9.8 10.1 10.2 10.3 10.5 10.8 11
1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 3
11.1 11.2 11.3 11.4 11.7 12 12.9
1 1 1 2 1 1 2
prop.table(tabla_peso)
6.3 6.5 7.2 7.3 7.5 7.9 8.2
0.03448276 0.06896552 0.03448276 0.03448276 0.06896552 0.03448276
0.03448276
8.5 9.7 9.8 10.1 10.2 10.3 10.5
0.03448276 0.03448276 0.03448276 0.03448276 0.03448276 0.03448276
0.03448276
10.8 11 11.1 11.2 11.3 11.4 11.7
0.03448276 0.10344828 0.03448276 0.03448276 0.03448276 0.06896552
0.03448276
12 12.9
0.03448276 0.06896552
Representaciones gráficas
R ofrece una gran variedad de gráficos, el comando demo(graphics) muestra
dichos gráficos. Atendiendo al tipo de datos vamos a utilizar varios tipos de gráficos.
Variables cualitativas o variables cuantitativas de tipo discreto: Se pueden
considerar gráficos de sectores o gráficos de barras, los cuales se obtienen
en R mediante las funciones pie y barplot, respectivamente. Los argumentos más
importantes de estas funciones son:
pie(x, labels = names(x), clockwise = FALSE, init.angle = if(clockwise) 90 else
0, col = NULL, main = NULL)
barplot(x, horiz = FALSE, col = NULL, main = NULL, sub = NULL, xlab = NULL,
ylab = NULL)
donde
x es un vector con las frecuencias de las observaciones. Igualmente, puede ser una
tabla de frecuencia (de las obtenidas con table o prop.table).
labels es un vector de cadenas de caracteres que indican los nombres de cada una
de las categorías que aparecen en el gráfico de sectores
clockwise es un argumento lógico que indica si los sectores se dibujan en sentido
horario (clockwise = TRUE) o en sentido antihorario (clockwise = FALSE, que es la
opción por defecto)
init.angle es un valor numérico que indica el ángulo (en grados) en el que se sitúa
el primer sector. Por defecto, el primer sector empieza a dibujarse a los 90 grados (-
a las 12 en punto -, cuando clockwise es igual a TRUE) o a los 0 grados (- a las 3 en
punto -, cuando clockwise es igual a FALSE)
horiz es un argumento lógico que indica si las barras del gráfico de barras se dibujan
de forma vertical (horiz = FALSE, que es la opción por defecto) u horizontal (horiz =
TRUE)
col es un vector en el que se indican los colores de las barras o los sectores del
gráfico
main y sub son cadenas de caracteres en la que se especifican el título y el subtítulo
del gráfico
xlab e ylab son cadenas de caracteres en las que se especifican los nombres de los
ejes X e Y.
Variables cuantitativas: Los gráficos que se suelen emplear con más frecuencia
son el histograma, el diagrama de tallos y hojas y el diagrama de caja y bigotes.
En R, se utilizan las órdenes hist, stem y boxplot para la obtención de histogramas,
de diagramas de tallos y hojas y de diagramas de caja y bigotes, respectivamente.
Éstas son las principales opciones de estas funciones:
hist(x, breaks = “Sturges”, right = TRUE, col = NULL, main = paste(“Histogram
of” , xname))
stem(x)
boxplot(x, range = 1.5, col = NULL, main = NULL)
donde, en este caso,
x es el vector de valores de la variable a partir de los cuales se dibujará el gráfico.
breaks indica la forma en la que se calcularán los intervalos en el histograma. Las
opciones disponibles para este parámetro son “Sturges” (que es la opción por
defecto) “Scott” y “FD” “Freedman-Diaconis“. Para más información sobre estos
métodos, así como la fórmula que emplea cada uno de ellos para determinar el
número de intervalos, se puede consultar el siguiente enlace (en
inglés): http://www.mas.ncl.ac.uk/~nlf8/teaching/mas1343/notes/chap4-5.pdf
range es un valor numérico que determina la extensión de los bigotes de la caja.
Para un valor positivo de range, los bigotes se extienden hasta el último dato que
no supere 1.5 veces la longitud de la caja (el rango intercuartílico). Para un valor
de 0, los bigotes se extienden hasta el dato más lejano
right es un argumento lógico que indica si los intervalos son cerrados por la
izquierda y abiertos por la derecha (en cuyo caso, right = TRUE, que es la opción por
defecto) o viceversa (right = FALSE).
Ejemplos:
pie(table(datos$color), col = c(“yellow”, “white”, “green”), main = “Diagrama de
sectores para la variable color”)
Se muestra el siguiente gráfico de sectores para la variable Color:
Figura 1: Diagrama de sectores
barplot(table(datos$color), col=c(“yellow”, “white”, “green”), xlab=”Color”,
ylab=”Frecuencias absolutas”,main =”Diagrama de barras para la variable Color”)
Se muestra el siguiente gráfico de barras para la variable Color:
Figura2: Diagrama de barras
hist(table(datos$peso), col = “yellow”, main = “Histograma para la variable peso”,
xlab=”Pesos”, ylab=”Frecuencia”)
Se muestra el siguiente histograma para la variable Peso
Figura 3: Histograma
stem(table(datos$altura))
The decimal point is at the |
1 | 0000000000
1|
2 | 00000
2|
3 | 000
boxplot(datos$peso, xlab=”Pesos”, main = “Cajas y bigotes para la variable peso”)
Se muestra el siguiente boxplot (Cajas y bigotes) de la variable Peso
Figura. 4: Caja con bigotes
Características o Medidas de una variable estadística
En las secciones anteriores se han planteado técnicas gráficas, tablas estadísticas
y representaciones gráficas, que han proporcionado una representación visual de
las variables estadísticas. Dichas técnicas gráficas nos dan una idea de la
composición de la población en estudio. En esta sección vamos a resumir todos los
datos recogidos en una tabla estadística en unos valores, medidas numéricas,
llamadas Características o Medidas que representen o sinteticen el conjunto de
datos. Son medidas que proporcionan información sobre puntos importantes de la
distribución, completando la información que nos ha proporcionado las tablas
estadísticas y las representaciones gráficas.
Estudiaremos las Características o medidas de posición, de dispersión, y de forma
Medidas de posición
En muchas ocasiones el interés reside en localizar el centro de la distribución (para
lo cual se calculan las medidas de tendencia central), existen casos en los que los
puntos que se desean estudiar distan mucho de este centro (en cuyo caso se recurre
al cálculo de las medidas de tendencia no central).
Algunas de las medidas más populares dentro del grupo de medidas de tendencia
central son la media, la mediana y la moda. Las funciones que calculan las dos
primeras medidas en R son mean y median.
mean (x, na.rm = FALSE)
median (x, na.rm = FALSE)
donde:
x: vector con los valores de la variable
na.rm: un argumento lógico que indica si hay que eliminar los valores faltantes del
conjunto de datos.
Las observaciones faltantes o no disponibles de un conjunto de datos son codificadas
en R como NA (que son las iniciales de Not Available). Cuando una función
de R encuentra algún NA entre los valores de las observaciones que trata de analizar
devuelve como resultado NA, indicando así que los cálculos no se han podido
realizar. No obstante, asignando el valor TRUE al argumento na.rm se pueden
eliminar los valores faltantes y obtener así un valor para la media o la mediana,
basado en las observaciones restantes.
En cuanto a la moda, R no tiene implementada ninguna función que la calcule. Pero
aprovechando la potencia del programa, podemos encargarnos nosotros mismos de
definir una función que calcule la moda de un conjunto de datos. Así, tendremos que
copiar y pegar el siguiente código en la consola de R:
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
Una vez hecho esto, podremos calcular la moda de un conjunto de datos tal y como
sigue:
Mode (x)
En el caso de que existan varias modas (es decir, cuando estemos ante una
distribución plurimodal), esta función mostrará únicamente la menor de ellas (o la
primera en orden alfabético, si se está analizando una variable cualitativa).
Entre las medidas de posición de tendencia no central, los cuantiles figuran
entre las más utilizadas. Para obtener los cuantiles de una variable en R se emplea
la función quantile.
quantile(x, probs = seq(0, 1, 0.25), na.rm = FALSE)
donde:
x: vector que incluye los valores de la variable
seq: Argumento que indica los cuantiles que se van a calcular. Por defecto, se
muestran los siguiente cuantiles:
0, que coincide con el valor mínimo
25, que coincide con el primer cuartil
50, que coincide con el segundo cuartil y con la mediana
75, que coincide con el tercer cuartil
100, que coincide con el valor máximo
na.rm: un argumento lógico que indica si hay que eliminar los valores faltantes del
conjunto de datos.
El mínimo y el máximo de un conjunto de datos, además de poder calcularse como
los cuantiles 0 y 100, pueden obtenerse utilizando las funciones de R min y max.
min (x, na.rm = FALSE)
max (x, na.rm = FALSE)
Medidas de dispersión
Tratan de cuantificar la variabilidad o esparcimiento de los datos informando
acerca de la mayor o menor representatividad de las medidas de tendencia central.
Entre las medidas de dispersión más utilizadas se encuentran la cuasi-varianza,
la cuasi-desviación típica y el rango intercuartílico, que en R se calculan a través
de las funciones var, sd e IQR, respectivamente.
var(x, na.rm = FALSE)
sd(x, na.rm = FALSE)
IQR(x, na.rm = FALSE)
Los dos argumentos principales de estas funciones son x, que es el vector con los
valores de la variable que se está estudiando y na.rm que, como ya se ha comentado,
indica si los valores faltantes han de ser eliminados antes del análisis.
Como se ha especificado, las funciones var y sd no calculan la varianza y la
desviación típica de una variable, sino su cuasi-varianza y su cuasi-desviación típica.
En caso de necesitar la varianza o la desviación típica, basta con multiplicar el
resultado de las funciones var y sd por (n – 1)/n, siendo n el número total de datos
con el que se está trabajando.
A partir de las funciones anteriores se pueden calcular otras medidas, como
el coeficiente de variación de Pearson o el rango. El coeficiente de variación se
emplea para comparar la representatividad de la media entre distintas variables y
se obtiene dividiendo la desviación típica de una variable entre su media. Por su
parte, el rango es una medida de dispersión muy sencilla que se obtiene como la
diferencia entre los valores máximo y mínimo.
Medidas de forma
Como su propio nombre indica, estas medidas se centran en el estudio de la forma
que presenta una distribución a través del análisis de la simetría y la curtosis o el
apuntamiento de la distribución en cuestión.
Para determinar la simetría de una distribución se emplea la función skewness,
contenida en el paquete e1071. En R, un paquete no es más que un conjunto de
funciones con un propósito común. Para poder utilizar las funciones incluidas en un
determinado paquete, es necesario instalar el paquete y, posteriormente cargarlo.
Para instalar el paquete, utilizamos la orden install.packages(“nombre_del
paquete”). En nuestro caso, tenemos que teclear
install.packages(“e1071″) # cuidado con las comillas (tecla”)
Se muestra el CRAN mirror, donde elegimos como idioma Spain (Madrid)
Pulsamos OK, yse muestra el siguiente mensaje
— Please select a CRAN mirror for use in this session —
probando la URL ‘http://cran.es.r-
project.org/bin/windows/contrib/3.2/e1071_1.6-7.zip’
Content type ‘application/zip’ length 814301 bytes (795 KB)
downloaded 795 KB
package ‘e1071’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\Usuario\AppData\Local\Temp\RtmpOcmE1f\downloaded_package
s
Una vez que el paquete se ha instalado de forma correcta en nuestro ordenador no
será necesario volver a instalarlo nunca más, siempre que no cambiemos la versión
de R. Tras instalar el paquete, procederemos a cargarlo mediante la función library.
library(“e1071”)
Warning message:
package ‘e1071’ was built under R version 3.2.2
A diferencia de la instalación, la carga de los paquetes es necesaria cada vez
que se inicia una nueva sesión de R. Una vez instalado y cargado el paquete e1071,
ya podemos utilizar la función skewness sin problema. Su sintaxis es:
skewness(x, na.rm = FALSE)
donde
x: es el vector que incluye los valores de la variable
na.rm: es un argumento lógico que indica si hay que eliminar los valores faltantes
del conjunto de datos.
De forma análoga, para estudiar la curtosis de un conjunto de datos emplearemos la
función kurtosis que también está contenida en el paquete e1071.
kurtosis(x, na.rm = FALSE)
donde los parámetros x y na.rm se definen forma similar al caso anterior.
Algunas funciones resumen
Existen funciones en R que calculan, a la vez, algunas de las medidas que se han
descrito hasta ahora, summary es un buen ejemplo de este tipo de funciones, ya que
cuando se aplica a una variable cuantitativa devuelve el mínimo, el máximo, la
media, la mediana y los cuartiles primero y tercero de la variable. La sintaxis de esta
función es la siguiente:
summary(object)
object: es el objeto (la variable en nuestro caso) del cual queremos obtener el
resumen.
Ejemplos
datos <- read.table(“C:/Users/Usuario/Desktop/misdatos.txt”, header = TRUE)
o bien
setwd(“C:/directorio de trabajo”)
datos <- read.table(“misdatos.txt”, header = TRUE)
datos
mean(datos$peso)
[1] 9.782759
median(datos$peso)
[1] 10.3
min(datos$peso)
[1] 6.3
max(datos$peso)
[1] 12.9
quantile(datos$peso, probs = c(0.25, 0.75))
25% 75%
7.9 11.2
summary(datos$peso)
Min. 1st Qu. Median Mean 3rd Qu. Max.
6.300 7.900 10.300 9.783 11.200 12.900
var(datos$peso, na.rm = TRUE)
[1] 3.945764
sd(datos$peso, na.rm = TRUE)
[1] 1.986395
IQR(datos$peso, na.rm = TRUE) #el rango intercuartílico IRQ
[1] 3.3
install.packages(“e1071”) # Es necesario si aún no se ha instalado
library(e1071)
skewness(datos$peso)
[1] -0.3492441
skewness(datos$peso, na.rm = TRUE)
[1] -0.3492441
kurtosis(datos$peso, na.rm = TRUE)
[1] -1.231833
Ejercicio 1
Considérese el siguiente conjunto de datos que contiene información acerca
de la raza, la edad, el peso y la altura de 10 personas:
a) Crea 4 variables, de manera que cada una contenga los datos de una
columna. Después, crea un data frame llamado Datoscon las 4 variables que
acabas de crear
b) Realiza una tabla de frecuencias absolutas y otra de frecuencias relativas
para la variable Raza. Almacena las tablas anteriores en dos variables y
llámalas abso y rela
c) Representa la variable Raza mediante un diagrama de barras y un diagrama
de sectores. Incluye un título adecuado para cada gráfico y colorea las barras
y los sectores de colores diferentes
d) Para la variable Edad, realiza un histograma y un diagrama de caja y bigotes
considerando la opción range = 1.5. Incluye un título apropiado para cada
gráfico y colorea las barras del histograma de color verde. ¿Existe algún valor
atípico en esta variable? Reduce el valor del argumento range hasta 1. ¿Varían
las conclusiones?
e) Realiza un resumen de la variable Altura mediante la orden summary.
Comprueba que las medidas que proporciona summary coinciden con las
medidas calculadas de forma individual usando su función específica
f) Calcula el peso medio de los individuos y proporciona, al menos, dos
medidas que indiquen la dispersión de esta variable
g) ¿Qué variable es más homogénea: la edad o la altura?
Resolución
a) Crea 4 variables, de manera que cada una contenga los datos de una
columna. Después, crea un data frame llamado Datoscon las 4 variables que
acabas de crear.
En primer lugar, se tiene que tener en cuenta el tipo de las variables, pues ello
determina la manera en que hay que crearlas. En este ejemplo, la variable Raza es
un factor con dos categorías mientras que el resto de variables son numéricas. De
las tres variables numéricas, Peso es la única con observaciones faltantes.
Raza <- factor(c(“Blanca”, “Negra”, “Blanca”, “Blanca”, “Negra”, “Negra”, “Negra”,
“Blanca”, “Blanca”, “Blanca”), levels = c(“Blanca”, “Negra”))
Raza
[1] Blanca Negra Blanca Blanca Negra Negra Negra Blanca Blanca Blanca
Levels: Blanca Negra
El signo + al inicio de una línea en la consola de R indica que la orden anterior no se
ha terminado de escribir por completo y que continúa en esa línea.
Edad <- c(24, 26, 62, 31, 30, 41, 51, 23, 28, 30)
Peso <- c(58, 62, NA, 67, 71, 69, NA, 73, 56, 82)
Altura <- c(156, 175, 169, 171, 159, 160, 158, 178, 168, 166)
Agrupamos las 4 variables en un data frame, al que vamos a llamar Datos:
Datos <- data.frame (Raza, Edad, Peso, Altura)
Comprobemos que los datos se han guardado correctamente.
Datos
Raza Edad Peso Altura
1 Blanca 24 58 156
2 Negra 26 62 175
3 Blanca 62 NA 169
4 Blanca 31 67 171
5 Negra 30 71 159
6 Negra 41 69 160
7 Negra 51 NA 158
8 Blanca 23 73 178
9 Blanca 28 56 168
10 Blanca 30 82 166
b) Realiza una tabla de frecuencias absolutas y otra de frecuencias relativas
para la variable Raza. Almacena las tablas anteriores en dos variables y
llámalas abso y rela
abso <- table(Datos$Raza)
abso
Blanca Negra
6 4
rela <- prop.table(abso)
rela
Blanca Negra
0.6 0.4
c) Representa la variable Raza mediante un diagrama de barras y un diagrama
de sectores. Incluye un título adecuado para cada gráfico y colorea las barras
y los sectores de colores diferentes
barplot(abso, col = c(“red”, “blue”), main = “Diagrama de barras para la variable
Raza”)
Fig. 5: Diagrama de barras
pie(abso, col = c(“white”, “black”), main = “Diagrama de sectores para la variable
Raza”)
Fig. 6: Gráfico de sectores
d) Para la variable Edad, realiza un histograma y un diagrama de caja y bigotes
considerando la opción range = 1.5. Incluye un título apropiado para cada
gráfico y colorea las barras del histograma de color verde. ¿Existe algún valor
atípico en esta variable? Reduce el valor del argumento range hasta 1. ¿Varían
las conclusiones?
hist(Datos$Edad, col = “green”, main = “Histograma para la variable Edad”, xlab =
“Edades”, ylab = “Frecuencia”)
Fig. 7: Histograma
boxplot(Datos$Edad, main = “Cajas y bigotes para la variable Edad (range = 1.5)”)
Fig. 8: Caja y Bigotes (range = 1.5)
En este caso no se aprecia ningún valor atípico en el diagrama de caja y bigotes, ya
que no aparece ningún valor más allá de los bigotes.
boxplot(Datos$Edad, main = “Cajas y bigotes para la variable Edad (range = 1)”)
Cajas y bigotes para la variable Edad (range = 1)
60
50
40
30
Fig. 9: Caja con Bigotes (range = 1)
Cuando se reduce el valor de range a 1 se observa que existe un dato más allá del
bigote superior, el cual se considera como atípico.
e) Realiza un resumen de la variable Altura mediante la orden summary.
Comprueba que las medidas que proporciona summary coinciden con las
medidas calculadas de forma individual usando su función específica.
Si aplicamos la función summary a la variable Altura, obtenemos el siguiente
resultado
summary(Datos$Altura)
Min. 1st Qu. Median Mean 3rd Qu. Max.
156.0 159.2 167.0 166.0 170.5 178.0
Calculemos cada medida por separado
> min(Datos$Altura)
[1] 156
> max(Datos$Altura)
[1] 178
> quantile(Datos$Altura, probs = c(0.25, 0.75))
25% 75%
159.25 170.50
> mean(Datos$Altura)
[1] 166
> median(Datos$Altura)
[1] 167
f) Calcula el peso medio de los individuos y proporciona, al menos, dos
medidas que indiquen la dispersión de esta variable
Para calcular el peso medio de los individuos, tenemos que tener en cuenta que la
variable Peso incluye dos valores faltantes entre sus observaciones. Este hecho tiene
que ser indicado estableciendo como TRUE el valor del parámetro na.rm
mean(Datos$Peso, na.rm = TRUE)
[1] 67.25
El peso medio de los individuos es de 67,25 kg.
Como medidas de dispersión, se van a calcular la cuasi-varianza y el recorrido
intercuartílico.
var(Datos$Peso, na.rm = TRUE)
[1] 72.5
IQR(Datos$Peso, na.rm = TRUE)
[1] 10.5
g) ¿Qué variable es más homogénea: la edad o la altura?
Para determinar la homogeneidad de una variable (o, lo que es lo mismo, la
representatividad de su media), calculamos el coeficiente de variación para cada una
de ellas, el cual se define como el cociente entre la desviación típica y la media de la
variable.
Vamos a comenzar con la variable Edad. En primer lugar, calculemos la edad media
de los individuos.
media_Edad <- mean(Datos$Edad)
media_Edad
[1] 34.6
A continuaciñon obtenemos la desviación típica. Para ello, calcularemos en primer
lugar la varianza de la variable Edad mediante la función var, que recordemos
calcula la cuasi-varianza de una variable.
var_Edad <- 9/10 * var(Datos$Edad)
var_Edad
[1] 148.04
Una vez obtenida la varianza, la desviación típica se obtiene como su raíz cuadrada
positiva.
dt_Edad <- sqrt(var_Edad)
dt_Edad
[1] 12.16717
Por último, calculamos el coeficiente de variación de la Edad y mostramos su valor.
CV_Edad <- dt_Edad/media_Edad
CV_Edad
[1] 0.3516523
Repetimos el mismo proceso con la variable Altura.
media_Altura <- mean(Datos$Altura)
var_Altura <- 9/10 * var(Datos$Altura)
dt_Altura <- sqrt(var_Altura)
CV_Altura <- dt_Altura/media_Altura
CV_Altura
[1] 0.04310492
La variable más homogénea es la variable Altura, ya que presenta un coeficiente de
variación más próximo a 0.
Ejercicio 2
Las siguientes tablas recogen información sobre el diámetro, la altura, el
volumen del tronco y la variedad de distintos cerezos en dos regiones
distintas:
Se pide:
a) Crear dos conjuntos de datos, de nombre RegA y RegB que contengan la
información recogida en las tablas anteriores
b) Representar la variable Variedad mediante un diagrama de sectores en
cada región. Incluir un título descriptivo en cada gráfico y colorear los
sectores de blanco, amarillo o rosa
c) Representar la variable Altura mediante un histograma en cada región
d) ¿Existe algún dato atípico en la variable Diámetro en la región A? ¿Y en la
región B?
e) ¿Cuál es el valor máximo del 30% de los diámetros más pequeños de los
cerezos de la región A? ¿Y el valor mínimo del 25% de las alturas mayores de
los cerezos de la región B?
f) ¿Dónde es la variable volumen más homogénea: en la región A o en la región
B?
g) ¿En qué región presentan los cerezos una altura media mayor? ¿En qué
región presentan los cerezos una altura mediana menor?
h) Estudia la asimetría y la curtosis de la variable Diámetro en la región A.
Resolución
a)Crear dos conjuntos de datos, de nombre RegA y RegB que contengan la
información recogida en las tablas anteriores
diam<- c(8.3, 8.6, 8.8, 10.5, 10.5, 10.8, 11, 11, 11.1, 11.2, 11.3, 11.4, 11.4, 11.7, 12,
12.9, 12.9)
alt<- c(70, 65, 63, 72, 81, 83, 66, 75, 80, 75, 79, 76, 76, 69, 75, 74, 85)
vol<- c(10.3, 10.3, 10.2, 16.4, 18.8, 19.7, 15.6, NA, 22.6, 19.9, 24.2, 21, 21.4, 21.3,
19.1, 22.2, 33.8)
var<- c(“B”, “A”, “R”, “R”, “R”, “R”, “B”, “A”, “R”, “B”, “A”, “B”, “R”, “R”, “A”, “A”, “B”)
RegA<- data.frame (diam, alt, vol, var)
RegA
diam alt vol var
1 8.3 70 10.3 B
2 8.6 65 10.3 A
3 8.8 63 10.2 R
4 10.5 72 16.4 R
5 10.5 81 18.8 R
6 10.8 83 19.7 R
7 11.0 66 15.6 B
8 11.0 75 NA A
9 11.1 80 22.6 R
10 11.2 75 19.9 B
11 11.3 79 24.2 A
12 11.4 76 21.0 B
13 11.4 76 21.4 R
14 11.7 69 21.3 R
15 12.0 75 19.1 A
16 12.9 74 22.2 A
17 12.9 85 33.8 B
Repetir para la Región B
diam<- c(13.3, 13.7, 13.8, 14, 14.2, 14.5, 16, 16.3, 17.3, 17.5, 17.9, 18, 18, 20.6)
alt<- c(86, 71, 64, 78, 80, 74, 72, 77, 81, 82, 80, 80, 80, 87)
vol<- c(27.4, 25.7, 24.9, NA, 31.7, 36.3, 38.3, 42.6, 55.4, 55.7, 58.3, NA, 51, 77)
var<- c("A", "R", "R", "A", "A", "R", "R", "R", "B", "B", "A", "R", "B", "R")
RegB<- data.frame (diam, alt, vol, var)
RegB
diam alt vol var
1 13.3 86 27.4 A
2 13.7 71 25.7 R
3 13.8 64 24.9 R
4 14.0 78 NA A
5 14.2 80 31.7 A
6 14.5 74 36.3 R
7 16.0 72 38.3 R
8 16.3 77 42.6 R
9 17.3 81 55.4 B
10 17.5 82 55.7 B
11 17.9 80 58.3 A
12 18.0 80 NA R
13 18.0 80 51.0 B
14 20.6 87 77.0 R
b) Representar la variable Variedad mediante un diagrama de sectores en
cada región. Incluir un título descriptivo en cada gráfico y colorear los
sectores de blanco, amarillo o rosa
Diagrama de sectores de Variedad (Región A)
pie(table(RegA$var), main = "Variedad de los cerezos de la región A", col =
c("yellow", "white", "pink"))
Fig. 10: Diagrama de Sectores de Var (Región A)
Diagrama de sectores de Variedad para la Región B
pie(table(RegB$var), main = "Variedad de los cerezos de la región B", col =
c("yellow", "white", "pink"))
Fig. 11: Diagrama de Sectores de Var (Región B)
c) Representar la variable Altura mediante un histograma en cada región
Histograma de Altura en la Región A
hist(RegA$alt, main = "Altura de los cerezos en la región A", xlab = "Altura", ylab =
"Frecuencia")
Fig. 12: Histograma de la Altura (Región A)
Histograma de la Altura para la Región B
hist(RegB$alt, main = "Altura de los cerezos en la región B", xlab = "Altura", ylab =
"Frecuencia")
Fig. 13: Histograma de la Altura (Región B)
d) ¿Existe algún dato atípico en la variable Diámetro en la región A? ¿Y en la
región B?
Para responder a esta pregunta, vamos a calcular los gráficos de caja y bigotes para
la variable Diámetro en ambas regiones.
Boxplot de Diámetro para la Región A
boxplot(RegA$alt, main = "Diámetro de los cerezos en la región A")
Fig. 14: Caja y Bigotes de diámetro (Región A)
Boxplot de Diámetro de la Región B
boxplot(RegB$diam, main = "Diámetro de los cerezos en la región B")
Fig. 15: Caja y Bigotes de diámetro (Región B)
Hay cuatro valores atípicos (datos más allá de los extremos de los bigotes) para la
variable Diámetro de la región A.
e) ¿Cuál es el valor máximo del 30% de los diámetros más pequeños de los
cerezos de la región A? ¿Y el valor mínimo del 25% de las alturas mayores de
los cerezos de la región B?
Los valores que nos están pidiendo son el percentil 30 de la variable Diámetro en la
región A y el percentil 75 de la variable Altura en la región B, respectivamente.
Percentil 30 de Diámtero en la Región A = 10.74
quantile(RegA$diam, probs = 0.30)
30%
10.74
Percentil 75 de la variable Altura en la región B = 80.75
quantile(RegB$alt, probs = 0.75)
75%
80.75
f) ¿Dónde es la variable volumen más homogénea: en la región A o en la región
B?
Para contestar a esta pregunta, vamos a calcular el coeficiente de variación para la
variable Volumen en cada una de las regiones. Recordemos que la fórmula para el
cómputo del coeficiente de variación (CV) es
Por lo tanto,
CV de Volumen de la Región A = 0.3106773
CV_vol_A <- sd(RegA$vol, na.rm = TRUE)/mean(RegA$vol, na.rm = TRUE)
CV_vol_A
[1] 0.3106773
CV de Volumne de la Región B = 0.3670137
CV_vol_B <- sd(RegB$vol, na.rm = TRUE)/mean(RegB$vol, na.rm = TRUE)
CV_vol_B
[1] 0.3670137
Atendiendo a los resultados que hemos obtenido, podemos afirmar que la variable
volumen es más homogénea en la región A, dado que es en esta región donde el
coeficiente de variación para la variable volumen está más próximo a 0.
g) ¿En qué región presentan los cerezos una altura media mayor? ¿En qué
región presentan los cerezos una altura mediana menor?
Media y mediana de la altura de la región A (74.35294 y 75, respectivamente) y de
la región B (78 y 80, respectivamente)
mean(RegA$alt)
[1] 74.35294
mean(RegB$alt)
[1] 78
median(RegA$alt)
[1] 75
median(RegB$alt)
[1] 80
Como se puede apreciar, tanto la altura media como la altura mediana es mayor en
la región B.
h) Estudia la asimetría y la curtosis de la variable Diámetro en la región A.
Asimetría de Diámetro en la Región A = -0.5608155
install.packages("e1071") # Es necesario si aún no se ha instalado
library(e1071)
skewness(RegA$diam)
[1] -0.5608155
Kurtosis de Diámtero de la Región A = -0.4475198
kurtosis(RegA$diam)
[1] -0.4475198
Como el coeficiente de asimetría es menor que 0, concluiremos que la distribución
de la variable Diámetro en la región A es asimétrica a la izquierda. Igualmente, dado
que el coeficiente de curtosis es también negativo, la distribución de esta variable es
menos apuntada que la distribución normal, es decir, platicúrtica.
……………………………………………………………………………………………………………………………
CAPITULO 3 REGRESIÓN Y CORRELACIÓN
Objetivos
Ajustar modelos de regresión lineal simple y múltiple estimando los valores
de sus parámetros
Obtener información adicional sobre los modelos de regresión (contrastes de
significación de los parámetros, test de bondad de ajuste,…)
Contrastar las hipótesis del modelo de regresión lineal
Ajustar un modelo de regresión cuadrático
Estudiar la correlación entre variables.
Regresión
El objetivo del Análisis de regresión es determinar una función matemática sencilla
que describa el comportamiento de una variable dados los valores de otra u otras
variables. En el Análisis de regresión simple, se pretende estudiar y explicar el
comportamiento de una variable que notamos y, y que
llamaremos variable explicada, variable dependiente o variable de interés, a
partir de otra variable, que notamos x, y que llamamos variable
explicativa, variable independiente o variable de predicción. El
principal objetivo de la regresión es encontrar la función que mejor explique
la relación entre la variable dependiente y las independientes.
Para cumplir dicho objetivo, el primer paso que debe realizar el investigador, es
representar las observaciones de ambas variables en un gráfico llamado diagrama
de dispersión o nube de puntos. A partir de esta representación el investigador
puede especificar la forma funcional de la función de regresión.
Suponemos un modelo en la forma
A menudo se supone que la relación que guardan la variable dependiente y las
independientes es lineal. En estos casos, se utlizan los modelos de regresión lineal.
Aunque las relaciones lineales aparecen de forma frecuente, también es posible
considerar otro tipo de relación entre las variables, que se modelizan mediante otros
modelos de regresión, como pueden ser el modelo de regresión
cuadrático o parabólico o el modelo de regresión hiperbólico.
Teoría de la Regresión: Consiste en la búsqueda de una “función” que exprese lo
mejor posible el tipo de relación entre dos o más variables.
Correlación
La correlación está íntimamente ligada con la regresión en el sentido de que se
centra en el estudio del grado de asociación entre variables. Por lo tanto, una
variable independiente que presente un alto grado de correlación con una variable
dependiente será muy útil para predecir los valores de ésta última. Cuando la
relación entre las variables es lineal, se habla de correlación lineal. Una de las
medidas más utilizadas para medir la correlación lineal entre variables es
el coeficiente de correlación lineal de Pearson.
En esta práctica se mostrará cómo ajustar un modelo de regresión con R, prestando
especial atención a los modelos de regresión lineal. Además, enseñaremos como
calcular e interpretar algunas medidas de correlación.
Regresión lineal simple
La regresión lineal simple supone que los valores de la variable dependiente, a los
que llamaremos yi, pueden escribirse en función de los valores de una única variable
independiente, los cuales notaremos por xi, según el siguiente modelo lineal:
donde y , son los parámetros desconocidos que
vamos a estimar.
Habitualmente, al iniciar un estudio de regresión lineal simple se suelen representar
los valores de la variable dependiente y de la variable independiente de forma
conjunta mediante un diagrama de dispersión para determinar si realmente existe
una relación lineal entre ambas. Para realizar un diagrama de dispersión
en R utilizaremos la orden plot
plot(x,y)
donde x e y son los valores de las variables independiente y dependiente,
respectivamente. En caso de que en el diagrama de dispersión se aprecie un patrón
lineal entre las dos variables, se podrá asumir una cierta relación lineal entre ambas
variables y se procederá a ajustar el modelo de regresión lineal simple.
Después de comprobar gráficamente la relación lineal entre las variables, el
siguiente paso es la estimación de los valores de los parámetros y que
aparecen en la fórmula (1) a partir de un conjunto de datos. Para ello, podemos
utilizar la función lm de R, cuya sintaxis es la siguiente
lm(formula, data)
donde formula indica la relación que guardan la variable dependiente y la variable
independiente.
Por ejemplo:
lm(formula = y ~ x, data=midataset)
Algunas peculiaridades sobre este argumento:
Las partes izquierda (variable dependiente) y derecha (variable
independiente) de la fórmula vienen separadas por el símbolo ~ , que puede
escribirse con la secuencia de comandos AltGr + 4 + espacio.
Por defecto, la función devuelve un valor para . En determinadas
ocasiones, interesa que dicho valor sea igual a 0, lo cual se indica en la
fórmula del siguiente modo:
lm(formula = y ~0 + x, data=midataset)
data es el conjunto de datos en el que se encuentran las variables que se
utilizan en la fórmula. Este argumento es optativo, aunque es muy
recomendable usarlo para una mayor claridad en la fórmula. Para ver la
diferencia, observemos las siguientes llamadas a la función lm:
lm(formula = y ~ x, data=midataset)
lm(formula =midataset$y ~ midataset$x)
Ambas llamadas son equivalentes, pero en la primera de ellas se aprecia mucho
mejor cuál es la fórmula que indica la relación entre las variables.
Veamos un ejemplo sencillo:
Ejemplo 1
La siguiente tabla incluye información acerca del peso (en kg.) y la altura (en cm.)
de 12 individuos:
Tabla1: Datos del Ejemplo 1
En primer lugar, vamos a almacenar los datos de las dos variables en dos vectores.
peso <- c(74, 92, 63, 72, 58, 78, 85, 85, 73, 62, 80, 72)
altura <- c(168, 196, 170, 175, 162, 169, 190, 186, 176, 170, 176, 179)
Supongamos que nuestro objetivo es determinar el peso de un individuo a partir de
su altura o, lo que es lo mismo, supongamos que la variable dependiente es peso y
que la variable independiente es altura. Vamos a representar el diagrama de
dispersión de las dos variables para determinar si la relación existente entre ambas
puede considerarse lineal, y por tanto, tiene sentido plantear un modelo de
regresión lineal simple.
plot(altura, peso)
90
85
80
peso
75
70
65
60
165 170 175 180 185 190 195
altura
Fig. 1: Diagrama de Dispersión
A la vista del gráfico de dispersión, se puede asumir un cierto grado de relación
lineal entre ambas variables, por lo que procedemos al ajuste del modelo lineal.
reg_lin <- lm(peso ~ altura)
reg_lin
Call:
lm(formula = peso ~ altura)
Coefficients:
(Intercept) altura
-80.222 0.877
Por defecto, la salida que muestra la función lm incluye únicamente las estimaciones
para los parámetros, en nuestro caso y . Por tanto, el modelo lineal puede
escribirse del siguiente modo:
Estos dos parámetros pueden interpretarse del siguiente modo: -80.222 es el valor
del peso para una persona de altura 0, lo cual no tiene sentido. De hecho, en multitud
de ocasiones la interpretación del parámetro no es relevante y todo el interés
recae sobre la interpretación del resto de parámetros. El parámetro es igual a
0.877 indica que, por término medio, cada centímetro de incremento en la altura de
una persona supone un incremento de 0.877 kg. en su peso.
Podemos obtener más información sobre el modelo de regresión que hemos
calculado aplicando la función summary al objeto que contiene los datos de la
regresión, al cual hemos llamado reg_lin en este ejemplo.
summary(reg_lin)
Call:
lm(formula = peso ~ altura)
Residuals:
Min 1Q Median 3Q Max
-6.872 -4.084 -1.196 3.038 10.005
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -80.2220 29.8888 -2.684 0.022934 *
altura 0.8770 0.1692 5.184 0.000411 ***
—--
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.572 on 10 degrees of freedom
Multiple R-squared: 0.7288, Adjusted R-squared: 0.7017
F-statistic: 26.87 on 1 and 10 DF, p-value: 0.0004106
Esta salida contiene una información más completa sobre el análisis. Así, por
ejemplo, encontramos información sobre los residuos (en el apartado Residuals),
que se definen como la diferencia entre el verdadero valor de la variable
dependiente y el valor que pronostica el modelo de regresión. Cuanto más pequeños
sean estos residuos mejor será el ajuste del modelo a los datos y más acertadas serán
las predicciones que se realicen a partir de dicho modelo.
En la tabla Coefficients encontramos los valores de los parámetros que aparecían
en la salida por defecto junto a su error estándar. Cada parámetro aparece
acompañado del valor de un estadístico t de Student y un p-valor que sirven para
contrastar la significación del parámetro en cuestión, es decir, para resolver los
siguientes contrastes de hipótesis:
Lo que se pretende mediante estos contrastes es determinar si los efectos de la
constante y de la variable independiente son realmente importantes para de
explicar la variable dependiente o si, por el contrario, pueden considerarse nulos.
En nuestro ejemplo, los p-valores que nos ayudan a resolver estos contrastes son
0.0229 y 0.0004, ambos menores que 0.05. Así, considerando un nivel de
significación del 5%, rechazamos la hipótesis nula en ambos contrastes, de manera
que podemos suponer ambos parámetros significativamente distintos de 0.
Por último, en la parte final de la salida, encontramos el valor de R² (Multiple R-
squared) y de R² ajustado (Adjusted R-squared), que son indicadores de la bondad
del ajuste de nuestro modelo a los datos. R² oscila entre 0 y 1, de manera que,
valores de R² próximos a 1 indican un buen ajuste del modelo lineal a los datos. Por
otro lado, R² ajustado es similar a R², pero penaliza la introducción en el modelo de
variables independientes poco relevantes a la hora de explicar la variable
dependiente. Por tanto, R² ajustado <= R². En nuestro ejemplo, R² = 0.7288
y R² ajustado = 0.7017, por lo que podemos concluir que el modelo lineal se ajusta
de forma aceptable a nuestros datos. La última línea de la salida incluye un
estadístico F de Snedecor y el p-valor correspondiente que se utilizan para resolver
el siguiente contraste:
que se conoce habitualmente como contraste ómnibus. Mediante este contraste se
comprueba si, de forma global, el modelo lineal es apropiado para modelizar los
datos. En nuestro ejemplo, el p-valor asociado a este contraste es inferior a 0.05 por
lo que, al 5% de significación podemos rechazar la hipótesis nula y afirmar que,
efectivamente, el modelo lineal es adecuado para nuestro conjunto de datos.
R nos permite dibujar la recta de regresión lineal sobre el diagrama de dispersión
mediante la orden abline. De este modo podemos visualizar la distancia existente
entre los valores observados y los valores que el modelo pronostica (esto es, los
residuos).
plot(altura, peso)
abline(reg_lin)
90
85
80
peso
75
70
65
60
165 170 175 180 185 190 195
altura
Fig. 2: Diagrama de Dispersión y recta de regresión
Un aspecto importante cuando se trabaja con modelos de regresión lineal es la
comprobación de las hipótesis que deben de cumplirse para poder utilizar este tipo
de modelos. Estas suposiciones hacen referencia a los residuos y pueden resumirse
en los siguientes puntos:
Normalidad de los residuos
Independencia de los residuos
Homocedasticidad (igualdad de las varianzas de los residuos)
Linealidad de los residuos
Al aplicar la función plot sobre el objeto que contiene la información del modelo
obtenemos 4 gráficos que nos ayudan para la validación del modelo. Estos gráficos
son:
Valores predichos frente a residuos
Gráfico Q-Q de normalidad
Valores predichos frente a raíz cuadrada de los residuos
estandarizados (en valor absoluto)
Residuos estandarizados frente a leverages
plot(reg_lin)
Esperando para confirmar cambio de página…
Esperando para confirmar cambio de página…
Esperando para confirmar cambio de página…
Esperando para confirmar cambio de página…
Nota: Para pasar de un gráfico al siguiente basta con hacer Clik con el ratón o
presionar Enter sobre el gráfico en cuestión
Figuras 3, 4, 5 y 6: Gráficos para la validación del modelo
Los gráficos 3 y 5 se utilizan para contrastar gráficamente la independencia, la
homocedasticidad y la linealidad de los residuos. Idealmente, los residuos deben
estar aleatoriamente distribuidos a lo largo del gráfico, sin formar ningún tipo de
patrón.
El gráfico Q- Q, por su parte, se utiliza para contrastar la normalidad de los residuos.
Lo deseable es que los residuos estandarizados estén lo más cerca posible a la línea
punteada que aparece en el gráfico.
El gráfico de residuos estandarizados frente a leverages se utiliza para detectar
puntos con una influencia importante en el cálculo de las estimaciones de los
parámetros. En caso de detectarse algún punto fuera de los límites que establecen
las líneas discontinuas debe estudiarse este punto de forma aislada para detectar,
por ejemplo, si la elevada importancia de esa observación se debe a un error.
Los gráficos parecen indicar que los residuos son aleatorios, independientes y
homocedásticos. Sin embargo, no parece que los residuos sigan una distribución
normal. Vamos a confirmar si esto es así mediante métodos analíticos.
Para comprobar la normalidad, aplicaremos a los residuos el test de normalidad
de Kolmogorov-Smirnov, que en R se calcula a través de la función ks.test, cuya
sintaxis es la siguiente:
ks.test (x, distrib)
donde
x es un vector numérico con los datos a los que vamos a aplicar el test (en
nuestro caso, los residuos)
distrib indica la distribución de referencia que se usará en el contraste (en
nuestro caso, la distribución normal, por lo que distrib = pnorm)
Al realizar un análisis de regresión lineal, R guarda automáticamente los residuos
en el objeto que almacena la información de la regresión (y que nosotros hemos
llamado reg_lin). Para acceder a estos residuos, escribiremos $residuals a
continuación del nombre del objeto que contiene la información del análisis. Por
tanto, podemos realizar el contraste de Kolmogorov-Smirnov del siguiente modo:
ks.test(reg_lin$residuals, “pnorm”)
One-sample Kolmogorov-Smirnov test
data: reg_lin$residuals
D = 0.45506, p-value = 0.008639
alternative hypothesis: two-sided
Los resultados del test nos confirman lo que se intuía en el gráfico Q-Q: a un 5% de
significación los residuos no siguen una distribución normal, puesto que el p-valor
que se obtiene (0.008639) es menor que 0.05.
Por último, contrastemos la independencia de los residuos mediante el test
de Durbin-Watson. La función que calcula este test se llama dwtest y se encuentra
dentro del paquete lmtest. Por lo que lo primero que tenemos que hacer es instalar
y cargar dicho paquete. Puedes encontrar más información sobre la instalación y
cargas de paquetes en la práctica 2.
install.packages(“lmtest”) #Instalación del paquete
library(lmtest) #Carga del paquete Ahora ya podemos utilizar la función dwtest,
cuya sintaxis es
dwtest (formula)
donde
formula indica la relación que guardan la variable dependiente y la
independiente, y debe coincidir con la que se ha empleado en la función lm.
dwtest(peso~altura)
Durbin-Watson test
data: peso ~ altura
DW = 2.4568, p-value = 0.8001
alternative hypothesis: true autocorrelation is greater than 0
En este caso, con un p-valor de 0.8001 no podemos rechazar la hipótesis de que los
residuos son independientes.
Regresión lineal múltiple
El modelo de regresión múltiple es la extensión a k variables explicativas del modelo
de regresión simple. En general, una variable de interés y depende de varias
variables x1, x2, …, xk y no sólo de una única variable de predicción x. Por ejemplo, para
estudiar la contaminación atmosférica, parece razonable considerar más de una
variable explicativa, como pueden la temperatura media anual, el número de
fábricas, el número de habitantes, etc. Además de las variables observables, la
variable de interés puede depender de otras desconocidas para el investigador. Un
modelo de regresión representa el efecto de estas variables en lo que se conoce
como error aleatorio o perturbación.
Un modelo de regresión teórico en el que las variables se pueden relacionar
mediante una función de tipo lineal, podemos expresarlo de la siguiente forma:
Figura 7: Expresión del modelo de regresión múltiple
donde
y es la variable de interés que vamos a predecir, también llamada variable
respuesta o variable dependiente
x1, x2, …, xk son variables independientes, explicativas o de predicción
β1, β2, …, βk son los parámetros desconocidos que vamos a estimar
ε es el error aleatorio o perturbación, que representa el efecto de todas las
variables que pueden afectar a la variable dependiente y no están incluidas
en el modelo de regresión.
En R, el paso de un modelo de regresión lineal simple a un modelo de regresión
lineal múltiple es muy sencillo: basta con añadir variables independientes al
argumento formula de la función lm separadas por el signo +. Veamos un ejemplo:
Ejemplo 2
Una nueva medición sobre los mismos 12 individuos del ejemplo 1 nos permite
conocer ahora datos sobre su contorno de cintura (en cm.) y su edad
Tabla2: Datos del Ejemplo 2
Vamos a ajustar un nuevo modelo de regresión lineal (múltiple, en este caso) que
incorpore la información de estas nuevas variables. En primer lugar, vamos a crear
dos vectores numéricos, uno para cada variable nueva
cintura <- c(62, 75, 60, 71, 66, 62, 79, 74, 70, 66, 71, 69)
edad <- c(25, 31, 29, 64, 44, 41, 37, 35, 34, 29, 19, 50)
Y vamos a agrupar la información relativa a las 4 variables de las que disponemos
en un data frame al que pondremos por nombre datos:
datos <- data.frame(peso, altura, cintura, edad)
Comprobemos que, efectivamente, el data frame que hemos creado contiene la
información sobre las 4 variables:
datos
peso altura cintura edad
1 74 168 62 25
2 92 196 75 31
3 63 170 60 29
4 72 175 71 64
5 58 162 66 44
6 78 169 62 41
7 85 190 79 37
8 85 186 74 35
9 73 176 70 34
10 62 170 66 29
11 80 176 71 19
12 72 179 69 50
A continuación ajustamos el modelo de regresión lineal múltiple
reg_lin_mul <- lm(peso ~ altura + cintura + edad)
summary(reg_lin_mul)
Call:
lm(formula = peso ~ altura + cintura + edad)
Residuals:
Min 1Q Median 3Q Max
-7.5822 -2.8758 -0.6746 2.6828 9.9842
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -78.03017 35.37744 -2.206 0.0585 .
altura 0.93629 0.34941 2.680 0.0279 *
cintura -0.13261 0.60578 -0.219 0.8322
edad -0.09672 0.15806 -0.612 0.5576
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6.024 on 8 degrees of freedom
Multiple R-squared: 0.7464, Adjusted R-squared: 0.6513
F-statistic: 7.85 on 3 and 8 DF, p-value: 0.009081
El modelo podría escribirse tal y como sigue:
Tanto la interpretación como la comprobación de la significación de los parámetros
se realizan de forma similar al caso en que se cuenta con una única variable
independiente. Igualmente, la validación se lleva a cabo del mismo modo que para
la regresión lineal simple.
Con respecto a las representaciones gráficas, se pueden representar gráficos de
dispersión de la variable dependiente con respecto a cada una de las variables
independientes mediante el comando plot, como se ha mostrado anteriormente.
Correlación lineal
Para calcular el coeficiente de correlación lineal entre dos variables en R se utiliza la
orden cor, cuya sintaxis es la siguiente:
cor (x, y, method = c(“pearson” “kendall”, “spearman”))
donde
x hace referencia a la primera de las variables
y hace referencia a la segunda de las variables
method indica el método que se va a utilizar para calcular el coeficiente de
correlación lineal. Las posibles opciones son: pearson (método que se
considera por defecto), kendall y spearman. Puedes encontrar más
información sobre estos 3 métodos de cálculo del coeficiente de correlación
lineal en el siguiente enlace: http://www.napce.org/documents/research-
design-yount/22_correlation_4th.pdf
Ejemplo 3
Vamos a calcular el coeficiente de correlación lineal de Pearson entre las variables
peso y altura:
cor(peso, altura)
[1] 0.8537051
También es posible calcular de forma simultánea la correlación entre un conjunto
de variables almacenada en un data frame. Por ejemplo:
cor(datos)
peso altura cintura edad
peso 1.0000000 0.85370507 0.6740509 -0.16523717
altura 0.8537051 1.00000000 0.8380164 -0.04509011
cintura 0.6740509 0.83801636 1.0000000 0.12847242
edad -0.1652372 -0.04509011 0.1284724 1.00000000
En este caso, en lugar de un único valor numérico, la función cor devuelve una
matriz simétrica con las correlaciones entre las variables.
Habitualmente, se está interesado en contrastar si la correlación lineal entre pares
de variables puede considerarse 0 o no. Es decir, se quiere resolver el contraste
donde ρ representa el coeficiente de correlación lineal. Este contraste se resuelve
en R usando la función cor.test
cor.test(x, y, alternative = c(“two.sided”, “less”, “greater”), method = c(“pearson”,
“kendall”, “spearman”), conf.level = 0.95)
donde
x, y, method son los mismos parámetros que se usan en la función cor
alternative indica cuál va a ser la hipótesis alternativa del contraste. Por
defecto se considera que la hipótesis alternativa es (two.sided), aunque
también pueden considerarse las hipótesis alternativas (less) o (greater).
conf.level indica el nivel de confianza que se usará en el contraste (por
defecto, 0.95)
En el Ejemplo 3 vamos a contrastar la significación de la correlación entre las
variables peso y altura:
cor.test (peso, altura)
Pearson’s product-moment correlation
data: peso and altura
t = 5.1841, df = 10, p-value = 0.0004106
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5485726 0.9581621
sample estimates:
cor
0.8537051
El p-valor asociado a este contraste es de 0.0004106 < 0.05, por lo que rechazamos
la hipótesis de que la correlación lineal entre estas dos variables sea 0.
Otros modelos de regresión: regresión cuadrática
Aunque los modelos de regresión lineal (tanto simple como múltiple) funcionan bien
en una amplia mayoría de situaciones, en ocasiones es necesario considerar
modelos más complejos para conseguir un mejor ajuste a los datos.
Un ejemplo de este tipo de modelos es la regresión cuadrática. El modelo más
sencillo de regresión cuadrática es el siguiente:
Para ajustar un modelo de regresión cuadrático en R basta con indicar en el
argumento formula de la función lm que una de las variables independientes está
elevada al cuadrado mediante el símbolo ^2.
Ejemplo 4
Calcular los valores de las estimaciones , y en el modelo de
regresión:
lm(formula = peso ~ altura + edad^2)
Call:
lm(formula = peso ~ altura + edad^2)
Coefficients:
(Intercept) altura edad
-75.2688 0.8711 -0.1073
Ejercicio 1
El siguiente conjunto de datos contiene información relativa a las
calificaciones en Estadística, Química y Geología de 8 alumnos, como el
número de horas diarias que en promedio dedican al estudio
Tabla3: Datos del Ejemplo Guiado 1
a) Crea 4 vectores numéricos, de manera que cada uno contenga los datos de
una columna y un data frame llamado Notascon los 4 vectores que acabas de
crear
b) Representa el diagrama de dispersión de la nota en estadística y la nota en
química
c) Escribe la recta de regresión lineal que surge de considerar la nota en
estadística como variable dependiente y la nota en química como variable
independiente
d) ¿Son significativos los dos parámetros anteriores? ¿Qué puede decirse del
ajuste del modelo a los datos?
e) ¿Cuál sería la recta de regresión en el caso de que se considere un modelo
de regresión lineal simple sin constante?
f) Calcula el coeficiente de correlación lineal de Pearson entre ambas
variables. ¿Es significativa esta correlación?
g) ¿Cuál sería la recta de regresión lineal si se incluye la nota en geología como
variable independiente?
Resolución
a) Crea 4 vectores numéricos, de manera que cada uno contenga los datos de
una columna y un data frame llamado Notascon los 4 vectores que acabas de
crear
Est <- c(9,2,5,10,6,4,7,6)
Qui <- c(8.5, 5,7,10,1,3,6,8)
Geo <- c(10,4,7,7,3,7,8,7)
Horas <- c(5,0.2,2,5.5,1.5,1.5,3,2.5)
Notas <- data.frame(Est, Qui, Geo, Horas)
Comprobemos que los datos se han guardado correctamente
Notas
Est Qui Geo Horas
1 9 8.5 10 5.0
2 2 5.0 4 0.2
3 5 7.0 7 2.0
4 10 10.0 7 5.5
5 6 1.0 3 1.5
6 4 3.0 7 1.5
7 7 6.0 8 3.0
8 6 8.0 7 2.5
b) Representa el diagrama de dispersión de la nota en estadística y la nota en
química
plot(Notas$Est, Notas$Qui)
Fig. 4: Diagrama de Dispersión
c) Escribe la recta de regresión lineal que surge de considerar la nota en
estadística como variable dependiente y la nota en química como variable
independiente.
reg_lin <- lm(Est ~ Qui, data = Notas)
reg_lin
Call:
lm(formula = Est ~ Qui, data = Notas)
Coefficients:
(Intercept) Qui
2.9643 0.5213
Por tanto, la recta de regresión es:
d) ¿Son significativos los dos parámetros anteriores? ¿Qué puede decirse del
ajuste del modelo a los datos?
summary(reg_lin)
Call:
lm(formula = Est ~ Qui, data = Notas)
Residuals:
Min 1Q Median 3Q Max
-3.5711 -1.2548 0.1896 1.6587 2.5143
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.9643 1.8906 1.568 0.168
Qui 0.5213 0.2833 1.840 0.115
Residual standard error: 2.235 on 6 degrees of freedom
Multiple R-squared: 0.3608, Adjusted R-squared: 0.2542
F-statistic: 3.386 on 1 and 6 DF, p-value: 0.1153
Puesto que los p-valores asociados al contraste t de Student para ambos parámetros
(0.168 y 0.115) son mayores que 0.05, podemos considerar que ambos parámetros
no son significativamente distintos de 0.
Por otra parte, el valor de R² (0.3608) nos lleva a concluir que el ajuste del modelo
a los datos es bastante pobre.
e) ¿Cuál sería la recta de regresión en el caso de que se considere un modelo
de regresión lineal simple sin constante?
reg_lin2 <- lm(Est ~ 0 + Qui, data = Notas)
reg_lin2
Call:
lm(formula = Est ~ 0 + Qui, data = Notas)
Coefficients:
Qui
0.9249
En este caso, el modelo sería:
f) Calcula el coeficiente de correlación lineal de Pearson entre ambas
variables. ¿Es significativa esta correlación?
cor(Notas$Est, Notas$Qui)
[1] 0.6006425
La correlación lineal de Pearson entre ambas variables es de 0.6006425
cor.test(Notas$Est, Notas$Qui)
Pearson’s product-moment correlation
data: Notas$Est and Notas$Qui
t = 1.8402, df = 6, p-value = 0.1153
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.1803755 0.9171330
sample estimates:
cor
0.6006425
Puesto que el p-valor del contraste es de 0.1153 y, por lo tanto, mayor que 0.05,
podemos concluir que la correlación no es significativa, y podría considerarse 0.
g) ¿Cuál sería la recta de regresión lineal si se incluye la nota en geología como
variable independiente?
reg_lin_mul <- lm(Est ~ Qui + Geo, data = Notas)
reg_lin_mul
Call:
lm(formula = Est ~ Qui + Geo, data = Notas)
Coefficients:
(Intercept) Qui Geo
1.7276 0.3535 0.3403
En este caso, la recta de regresión lineal múltiple podría escribirse como:
Ejercicio 2
La siguiente tabla recoge información sobre el diámetro (en pulgadas), la
altura (en pies) y el volumen (en pies cúbicos) del tronco de distintos cerezos
en una determinada región
Tabla4. Datos del Ejemplo Propuesto 1
Se pide:
a) Crear un data frame de nombre Cerezos que almacene los datos de los
árboles
b) Dibujar el diagrama de dispersión de las variables altura y volumen y
determinar si puede existir una cierta relación lineal entre ambas
c) ¿Cuál es la recta de regresión lineal simple que considera a la altura como
variable dependiente y al volumen como variable independiente? Interpreta
los parámetros de esa recta
d) ¿Son significativos estos parámetros? ¿Qué puede decirse del ajuste del
modelo a los datos?
e) ¿Cuál es la correlación lineal de Pearson entre ambas variables? ¿Es
significativa?
f) ¿Cuál es la recta de regresión lineal si se considera también como variable
independiente el diámetro?
g) Calcular los valores de las estimaciones , y en el modelo de
regresión:
Resolución
a) Crear un data frame de nombre Cerezos que almacene los datos de los
árboles
diam <- c(8.3, 8.6, 8.8, 10.5, 10.5, 10.8, 11, 11)
alt <- c(70, 65, 63, 72, 81, 83, 66, 75)
vol <- c(10.3, 10.3, 10.2, 16.4, 18.8, 19.7, 15.6, 16.3)
Cerezos <- data.frame(diam, alt, vol)
Cerezos
diam alt vol
1 8.3 70 10.3
2 8.6 65 10.3
3 8.8 63 10.2
4 10.5 72 16.4
5 10.5 81 18.8
6 10.8 83 19.7
7 11.0 66 15.6
8 11.0 75 16.3
b) Dibujar el diagrama de dispersión de las variables altura y volumen y
determinar si puede existir una cierta relación lineal entre ambas
plot(Cerezos$alt, Cerezos$vol)
20
18
16
Cerezos$vol
14
12
10
65 70 75 80
Cerezos$alt
En el gráfico se aprecia un cierto patrón lineal entre las variables, aunque esto debe
confirmarse mediante métodos analíticos.
c) ¿Cuál es la recta de regresión lineal simple que considera a la altura como
variable dependiente y al volumen como variable independiente? Interpreta
los parámetros de esa recta.
reg_lin <- lm(alt ~ vol, data = Cerezos)
reg_lin
Call:
lm(formula = alt ~ vol, data = Cerezos)
Coefficients:
(Intercept) vol
48.336 1.601
La recta de regresión lineal simple es
Los dos parámetros de la recta se interpretan del siguiente modo: 48.336 es la altura
esperada para un cerezo que tiene un volumen de 0 pies cúbicos. Por otra parte, por
cada pie cúbico de incremento en el volumen del tronco del cerezo, se espera un
aumento en su altura de 1.601 pies.
d) ¿Son significativos estos parámetros? ¿Qué puede decirse del ajuste del
modelo a los datos?
Para responder a estas preguntas, necesitamos la información adicional sobre el
modelo que nos proporciona la función summary.
summary(reg_lin)
Call:
lm(formula = alt ~ vol, data = Cerezos)
Residuals:
Min 1Q Median 3Q Max
-7.3161 -1.9013 0.3668 2.6995 5.1706
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 48.3363 6.1662 7.839 0.000228 ***
vol 1.6013 0.4071 3.934 0.007680 **
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.211 on 6 degrees of freedom
Multiple R-squared: 0.7206, Adjusted R-squared: 0.674
F-statistic: 15.47 on 1 and 6 DF, p-value: 0.00768
Considerando un nivel de significación del 5%, ambos parámetros son
significativamente distintos de 0, ya que los p-valores asociados a los contrastes t de
Student de los dos parámetros son inferiores a 0.05.
El ajuste del modelo a los datos es aceptable, ya que el valor de R² es de 0.7206.
e) ¿Cuál es la correlación lineal de Pearson entre ambas variables? ¿Es
significativa?
cor(Cerezos$alt, Cerezos$vol)
[1] 0.8488805
cor.test(Cerezos$alt, Cerezos$vol)
Pearson's product-moment correlation
data: Cerezos$alt and Cerezos$vol
t = 3.9338, df = 6, p-value = 0.00768
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.3588886 0.9720747
sample estimates:
cor
0.8488805
El coeficiente de correlación lineal de Pearson entre las dos variables es de
0.8488805.
Con un p-valor de 0.00768 < 0.05, rechazamos la hipótesis de que el coeficiente de
correlación lineal de Pearson entre ambas variables pueda considerarse 0.
f) ¿Cuál es la recta de regresión lineal si se considera también como variable
independiente el diámetro?
reg_lin_mul <- lm(alt ~ vol + diam)
reg_lin_mul
Call:
lm(formula = alt ~ vol + diam)
Coefficients:
(Intercept) vol diam
85.340 3.231 -6.135
En este caso, la recta de regresión lineal múltiple es:
g) Calcular los valores de las estimaciones , y en el modelo de
regresión:
diam2 <- diam^2
reg_cuad <- lm(alt ~ vol + diam2)
reg_cuad
Call:
lm(formula = alt ~ vol + diam2)
Coefficients:
(Intercept) vol diam2
55.830 3.158 -0.304
En este caso, el modelo de regresión cuadrático puede escribirse del siguiente
modo:
……………………………………………………………………………………………………………………………
CAPITULO 4 DISTRIBUCIONES DE PROBABILIDAD:
BINOMIAL, POISSON Y NORMAL
Objetivos
Seleccionar la distribución de probabilidad para modelizar un
experimento aleatorio
Calcular probabilidades de las distribuciones Binomial, Poisson y
Normal
Calcular cuantiles
Generar valores aleatorios de una distribución determinada.
Introducción
En la teoría de la probabilidad existen muchos modelos teóricos que resultan de
utilidad en una gran variedad de situaciones prácticas, ya que sirven para modelizar
gran número de situaciones reales. Estas distribuciones o modelos de probabilidad
se dividen en dos grandes grupos dependiendo del tipo de la variable que modelizan.
Así, distinguimos entre distribuciones de probabilidad discretas, si la variable
aleatoria que modelizan es de naturaleza discreta y distribuciones de
probabilidad continuas, cuando la variable aleatoria es continua.
Existen muchas distribuciones de probabilidad, pero, dado el carácter introductorio
de esta práctica, nos limitaremos a estudiar la distribución binomial y la
distribución de Poisson como ejemplos de distribuciones discretas y la
distribución Normal para ilustrar las distribuciones continuas.
Distribución Binomial
Consideremos repeticiones independientes de un experimento aleatorio con dos
posibles resultados a los cuales nos referiremos genéricamente
como “éxito” y “fracaso”. El éxito ocurre con una probabilidad p y el fracaso, por
tanto, con una probabilidad q = 1-p .
En este contexto, interesa estudiar el número de éxitos en estas repeticiones del
experimento aleatorio y, para ello, se define la siguiente variable aleatoria, X =
“Número de éxitos en n ensayos independientes con probabilidad de éxito
constante p ”.
Entonces decimos que X sigue una distribución binomial de parámetros n y p, y lo
representamos como X→B(n, p).
La distribución binomial es una distribución de probabilidad discreta, mide el
número de éxitos en una secuencia de n ensayos independientes, con una
probabilidad fija p de ocurrencia de éxitos entre los ensayos.
Es evidente que los posibles valores que puede tomar la variable aleatoria (o, lo que
es lo mismo, el número de ensayos exitosos de los que se realizan) son los valores
comprendidos entre 0 y n.
A continuación, vamos a definir y calcular:
1. La probabilidad de que la variable aleatoria X tome cada valor concreto o,
equivalentemente, el valor de la función masa de probabilidad en cada uno de
estos puntos
2. La probabilidad que acumula cada uno de los valores de la variable
aleatoria X, es decir, el valor de la función de distribución en cada punto de la
variable
3. Cuantiles de la distribución binomial
4. Valores aleatorios de la distribución binomial.
Función masa de probabilidad
La función masa de probabilidad de una variable aleatoria discreta, la cual suele
representarse por pi, es una función que asigna una determinada probabilidad a
cada uno de los puntos de la variable.
pi = P [X = xi]
En R, los valores de la función masa de probabilidad de una variable con distribución
binomial se obtienen a través de la función dbinom, la cual necesita los siguientes
argumentos:
dbinom(x, size, prob)
donde:
x: es el valor (o los valores) de la variable para el cual (o los cuales) queremos
calcular la función masa de probabilidad
size y prob: son los dos parámetros de la distribución binomial (n y p,
respectivamente). En caso de que el argumento esté formado por dos o más
valores, éstos vendrán concatenados mediante la función c(,).
Función de distribución
La función de distribución evaluada en un punto xi de una variable aleatoria discreta
se denota por F(xi) y viene dada por
F(xi) = P[ X ≤ xi ] = P[ X = 0 ] + P[ X = ] + … + P[ X=xi ]
Para calcular valores de la función de distribución de una distribución binomial
con R utilizaremos la función pbinom, que tiene los siguientes argumentos:
pbinom(q, size, prob)
siendo q el valor (o los valores) de la variable en el cual (o los cuales) queremos
calcular la función de distribución y size y prob, los parámetros de la distribución.
Cuantiles de la distribución binomial
Por definición, el cuantil de orden α de una distribución de probabilidad es aquel
valor de la distribución que deja a su izquierda una proporción de valores α (o,
equivalentemente, un porcentaje del (α x100)% ). Esto es, el cuantil de orden α, será
aquel valor k tal que
P[ X ≤ k ] = α
Para calcular cuantiles de una distribución binomial en R recurriremos a la
función qbinom, que tiene los siguientes argumentos:
qbinom(p, size, prob)
siendo p el orden del cuantil que queremos calcular (en tanto por uno)
y, size y prob los dos parámetros que identifican a la distribución binomial.
Generar valores aleatorios de la distribución binomial
Por último, calcular muestras de valores aleatorios generados a partir de una
distribución binomial. Esta opción puede resultar de mucho interés en
experimentos de simulación en los que se conoce de antemano que la variable de
interés sigue una distribución binomial. Para generar estos valores utilizamos la
función rbinom de R, la cual requiere los siguientes argumentos:
rbinom(n, size, prob)
donde n es el número de valores aleatorios a generar y size y prob son los dos
parámetros de la distribución.
Veamos un ejemplo sencillo en el que se utilizan estas 4 funciones.
Ejemplo 1
A un examen se han presentado un total de 80 alumnos y la probabilidad de
aprobar el examen es de 0.85. Se pide
a) Definir una variable aleatoria que cuente el número de alumnos que
superan el examen. Identificar la distribución de probabilidad que sigue esta
variable aleatoria
b) Calcular la probabilidad de que exactamente 55 alumnos superen el
examen
c) Obtener la probabilidad de que al menos 65 alumnos superen el examen
d) Obtener la probabilidad de que entre 60 y 75 alumnos (ambos inclusive)
superen el examen
e) Calcular el valor de la variable tal que deja a su derecha un 35% de las
observaciones
f) Generar una muestra de 20 valores aleatorios de esta distribución.
Resolución
a) Definir una variable aleatoria que cuente el número de alumnos que
superan el examen. Identificar la distribución de probabilidad que sigue esta
variable aleatoria
En primer lugar, definimos la variable aleatoria X = “Número de alumnos que
aprueban el examen de los 80 que se presentan”.
A partir de la información que nos proporciona el enunciado podemos afirmar
que X→B(80, 0.85).
b) Calcular la probabilidad de que exactamente 55 alumnos superen el
examen
En este apartado nos piden la probabilidad de que la variable aleatoria tome,
exactamente, un valor o, lo que es lo mismo, el valor de la función masa de
probabilidad evaluada en el punto xi = 55. Debemos, por tanto, calcular p55 =
P[X=55]. Para ello, utilizaremos la función dbinom del siguiente modo
dbinom(55, 80, 0.85)
[1] 0.000120427
La probabilidad que buscamos es, por tanto, 0.00012.
c) Obtener la probabilidad de que al menos 65 alumnos superen el examen
En este caso, la probabilidad que nos piden calcular es P[X ≥ 65]. Como P[X ≥ 65] =
P[X=65] + P[X=66] + … + P[X=80 ], podríamos pensar en utilizar de nuevo la
función dbinom para obtener cada una de estas probabilidades puntuales y después
sumarlas. Sin embargo, esto sería un proceso bastante tedioso, pues implicaría el
cálculo de muchas probabilidades.
Por lo tanto, sabiendo que la probabilidad puede expresarse como P[X ≥ 65] = 1
– P[X ≤ 64]. Y que la función de distribución evaluada en un punto xi se define
como F(xi) = P[X ≤ xi]. Tenemos que calcular
P[X ≥ 65] = 1 – P[X ≤ 64] = 1 – F(44).
De manera que para calcular la probabilidad que nos pide el enunciado únicamente
debemos hacer una llamada a la función pbinom tal y como se muestra a
continuación:
1 – pbinom(64, 80, 0.85)
[1] 0.8624663
Concluimos, por tanto, que P[X ≥ 65] = 0.8624.
d) Obtener la probabilidad de que entre 60 y 75 alumnos (ambos inclusive)
superen el examen
En esta ocasión, nos piden calcular la probabilidad en un intervalo. Más
concretamente, la probabilidad que necesitamos calcular es P[60 ≤ X ≤ 75] . De
nuevo, teniendo en cuenta que: P[60 ≤ X ≤ 75] = P[X=60] + P[X=61] + … +
P[X=75], podríamos usar la función dbinom para obtener el valor de la función masa
de probabilidad en cada uno de estos puntos y después sumarlos. Pero existe una
alternativa más sencilla. La probabilidad P[60 ≤ X ≤ 75] puede reescribirse como
P[60 ≤ X ≤ 75] = P[X ≤ 75] – P[ X ≤ 59] = F(75) – F(59)
por lo que el cálculo de dicha probabilidad se reduce al cálculo del valor de la función
de distribución en los puntos 59 y 75. Podemos calcular ambos valores de forma
simultánea mediante la función pbinom del siguiente modo:
pbinom(c(59, 75), 80, 0.85)
[1] 0.006305257 0.995263001
De manera que la probabilidad que buscamos es:
0.995263001 – 0.006305257
[1] 0.9889577
Concluimos, por tanto, que P[60 ≤ X ≤ 75] = 0.988.
e) Calcular el valor de la variable tal que deja a su derecha un 35% de las
observaciones
El valor de la variable que deja a su derecha un 35% de las observaciones es el
mismo que deja a su izquierda el 65% restante. Por tanto, debemos calcular
el cuantil de orden 0.65 de una distribución binomial de parámetros 80 y 0.85.
Utilizaremos, para ello, la función qbinom.
qbinom(0.65, 80, 0.85)
[1] 69
f) Generar una muestra de 20 valores aleatorios de esta distribución
En este último apartado vamos a utilizar la función rbinom para generar la
muestra de 20 valores aleatorios.
rbinom(20, 80, 0.85)
[1] 65 69 73 71 72 69 73 73 64 68 67 72 67 73 61 67 69 64 69 68
Nota: Dado el carácter aleatorio de los valores generados en este apartado, dichos
valores pueden no coincidir con los que se obtengan a través de otra llamada a la
función rbinom.
Distribución de Poisson
La distribución de Poisson es una distribución de probabilidad discreta que sirve
para modelizar la probabilidad de que ocurra un determinado número de eventos
durante cierto período de tiempo. A modo de ejemplo, la distribución de Poisson se
utiliza frecuentemente para contar el número de llamadas que una centralita
telefónica recibe por unidad de tiempo o el número de clientes que llegan a un
determinado establecimiento en un período de tiempo dado.
A diferencia de la distribución binomial, la cual necesita dos parámetros para ser
correctamente identificada, la distribución de Poisson se define a partir de un único
parámetro, que suele notarse por λ. Generalmente, el parámetro λ representa el
número medio de sucesos que ocurren por unidad de tiempo. Entonces, podemos
definir la variable aleatoria X = “Número de sucesos aleatorios que ocurren en un
determinado periodo de tiempo” e identificar su distribución, X → P(λ). Los
posibles valores que puede tomar una variable con distribución de Poisson van
desde 0 a infinito.
Puesto que la distribución de Poisson también es una distribución discreta, los
valores que podemos calcular son los mismos que ya estudiamos para la
distribución binomial. Por lo tanto, para la distribución de Poisson obtendremos
valores de la función masa de probabilidad, de la función de distribución y de los
cuantiles. También generaremos muestras de valores aleatorios que siguen
distribuciones de Poisson.
El tratamiento computacional con R de la distribución de Poisson es similar al que
hemos empleado con la distribución binomial. La diferencia más notable es que el
sufijo “binom” de las funciones dbinom, pbinom, qbinom y rbinom se sustituye
por el sufijo “pois”, de manera que dbinom, pbinom, qbinom y rbinom se
sustituyen por dpois, ppois, qpois y rpois cuando trabajamos con una distribución
de Poisson.
Función masa de probabilidad
La función dpois calcula valores de la función masa de probabilidad de una
distribución de Poisson. Sus argumentos son:
dpois(x, lambda)
dond:
x: es el valor (o los valores) de la variable para el cual (o los cuales) queremos
calcular la función masa de probabilidad
lambda: es el parámetro que define la distribución de Poisson.
Función de distribución
La función ppois se utiliza para calcular valores de la función de distribución (esto
es, probabilidades acumuladas) de una variable con distribución de Poisson. Sus
argumentos son:
ppois(q, lambda)
donde:
q: es el valor (o los valores) de la variable en el cual (o los cuales) queremos
calcular la función de distribución
lambda: el parámetro que identifica la distribución.
Cuantiles de la distribución de Poisson
La función qpois se utiliza para calcular los valores de los cuantiles de una
distribución de Poisson, es decir, los valores de la variable con distribución de
Poisson que dejan a su izquierda una determinada proporción de
observaciones. Los argumentos de esta función son:
qpois(p, lambda)
donde:
p: es la proporción de observaciones que dejará a su izquierda el cuantil en
cuestión (es decir, el orden de dicho cuantil)
lambda: el parámetro de la distribución de Poisson.
Generar valores aleatorios de la distribución de Poisson
La función rpois se utiliza para generar valores aleatorios de una distribución de
Poisson y sus argumentos son:
rpois(n, lambda)
donde:
n: es el número de elementos aleatorios a generar
lambda: el parámetro que define la distribución de Poisson.
Veamos mediante un ejemplo sencillo cómo se utilizan cada una de estas 4
funciones.
Ejemplo 2
Una sucursal bancaria de un pueblo pequeño atiende, en promedio, a 6
clientes por día. Se pide:
a) Definir una variable aleatoria que cuente el número de clientes por días e
identificar la distribución de probabilidad que sigue esta variable aleatoria
b) Calcular la probabilidad de que en un día dado, la sucursal atienda
exactamente a 4 clientes
c) Calcular la probabilidad de que, en un día cualquiera, la sucursal atienda al
menos a 6 clientes
d) Calcular la probabilidad de que, en un día dado, la sucursal reciba entre 6 y
8 clientes (ambos inclusive)
e) Obtener la mediana de la variable
f) Generar una muestra de 10 valores aleatorios de la distribución.
Resolución
a) Definir una variable aleatoria que cuente el número de clientes por días e
identificar la distribución de probabilidad que sigue esta variable aleatoria
En primer lugar, vamos a definir la variable aleatoria: X = “Número de clientes que
atiende la sucursal bancaria en un día”. Sabemos, por el enunciado que X → P(6)
b) Calcular la probabilidad de que en un día dado, la sucursal atienda
exactamente a 4 clientes
En este apartado se pide la probabilidad de que la variable aleatoria X tome
exactamente el valor 4, es decir, el valor de la función masa de probabilidad
de X evaluada en el punto 4. Para ello, vamos a utilizar la función dpois.
dpois(4, 6)
[1] 0.1338526
Dicha probabilidad es 0.1338.
c) Calcular la probabilidad de que, en un día cualquiera, la sucursal atienda
al menos a 6 clientes
La probabilidad que nos piden calcular en este caso es P[X ≥ 6] . Para calcularla,
utilizaremos una estrategia similar a la que empleamos en el apartado c) del
supuesto práctico 1, en donde expresamos una probabilidad del tipo ≥ en función
de los valores de la función de distribución de la variable. Para ello, tendremos en
cuenta que
P[X ≥ 6] = 1 – P[X ≤ 5] = 1 – F(5)
De manera que para calcular P[X ≥ 6] únicamente necesitamos calcular el valor de
la función de distribución de la variable evaluada en el punto 5, para lo cual
utilizaremos la función ppois.
1 – ppois(5, 6)
[1] 0.5543204
Por tanto, se tiene que P[X ≥ 6] = 0.554
d) Calcular la probabilidad de que, en un día dado, la sucursal reciba entre 6
y 8 clientes (ambos inclusive)
En este apartado, la probabilidad que nos piden calcular es P[6 ≤ X ≤ 8] . Vamos a
obtenerla a través de dos métodos distintos: uno basado en la función masa de
probabilidad y otro que utiliza la función de distribución.
Para calcular P[6 ≤ X ≤ 8] usando la función masa de probabilidad, tenemos que
tener en cuenta que
P[6 ≤ X ≤ 8] = P[X = 6] + P[ X = 7] + P[X = 8]
Por tanto, necesitamos obtener, y después sumar, los valores de la función masa de
probabilidad de la variable evaluada en los puntos 6, 7 y 8.
dpois (6, 6) + dpois (7, 6) + dpois (8, 6)
[1] 0.4015579
Esta estrategia sólo tiene cabida cuando el intervalo para el cual queremos calcular
su probabilidad es relativamente estrecho y está compuesto por pocos valores. En
cualquier otro caso, debemos utilizar un enfoque distinto, basado en la función de
distribución.
Esta alternativa, de utilizar la función de distribución, para
calcular P[6 ≤ X ≤ 8] parte de que dicha probabilidad puede reescribirse
como
P[6 ≤ X ≤ 8] = P[X ≤ 8] – P[ X ≤ 5] = F(8) – F(5)
De manera que, usando la función ppois, se tiene que:
ppois(c(5, 8), 6)
[1] 0.4456796 0.8472375
De modo que la probabilidad que buscamos puede obtenerse como la diferencia
entre los dos valores que proporciona la función ppois.
0.8472375 – 0.4456796
[1] 0.4015579
Por tanto, P[6 ≤ X ≤ 8] = 0.40155
e) Obtener la mediana de la variable
La mediana de una variable aleatoria es el valor de la variable que deja a su izquierda
el 50% de las observaciones, quedando el 50% restante a la derecha de tal valor. De
aquí se deduce que la mediana de una variable coincide con el cuantil de orden 0.5
de la variable. Por ello, se utiliza la función qpois para obtener la mediana de la
variable X tal y como se muestra a continuación:
qpois(0.5, 6)
[1] 6
Podemos concluir, por tanto, que la mediana de la variable es 6.
f) Generar una muestra de 10 valores aleatorios de la distribución.
Por último, vamos a generar 10 valores aleatorios de esta distribución de Poisson a
través de la función rpois.
rpois(10, 6)
[1] 3 5 5 7 5 5 4 6 3 7
Nota: Dado el carácter aleatorio de los valores generados en este apartado, dichos
valores pueden no coincidir con los que se obtengan a través de otra llamada a la
función rpois.
Distribución Normal
La distribución Normal es la más importante y de mayor uso de las distribuciones
continuas, debido a la gran cantidad de fenómenos aleatorios que modeliza. Esta
distribución también se conoce como gaussiana o de Gauss, en honor a su
descubridor. La distribución Normal viene identificada por dos parámetros, μ y σ,
que coinciden con la media y la desviación típica de la distribución. Cuando una
variable aleatoria, X , siga una distribución normal lo notaremos X → N(μ, σ)
El tratamiento computacional con R de la distribución Normal en particular, y de
cualquier distribución de probabilidad continua en general, es similar al que se
utiliza con las distribuciones discretas. La principal salvedad se encuentra en la
función dnorm. Esta función es la equivalente para la distribución normal
a dbinom y dpois en las distribuciones binomal y de Poisson, respectivamente.
Recordemos que las funciones, dbinom y dpois devuelven la probabilidad puntual
para cada uno de los valores posibles que puede tomar una variable con distribución
binomial y de Poisson, respectivamente. Pero el cálculo de probabilidades en valores
concretos en una distribución continua no tiene sentido, ya que dicha probabilidad
vale 0. Por todo ello, dnorm devuelve el valor de la función de densidad en un punto
(o puntos) determinado. Veamos cuáles son los argumentos de esta función:
dnorm(x, mean = 0, sd = 1)
siendo:
x: es el valor (o los valores) de la variable para el cual (o los cuales)
queremos calcular la función de densidad
mean: es la media de la variable
sd: la desviación típica de la variable.
Por defecto, se considera una distribución Normal de media 0 y desviación típica 1,
es decir, se considera una distribución Normal estándar o tipificada. De este
modo, si al llamar a la función dnorm no especificamos ningún valor para la media
y la desviación estándar, R considerará estos valores por defecto, por lo que
estaremos calculando valores de la función de densidad en una normal de media 0
y desviación típica 1. En caso de estar trabajando con una distribución Normal con
una media y/o desviación típica diferente, lo indicaremos a través de estos
parámetros.
Las funciones pnorm, qnorm y rnorm se comportan de forma similar a sus
equivalentes para las variables discretas y devuelven valores de la función de
distribución, cuantiles y valores aleatorios de una distribución normal,
respectivamente. Sus argumentos son los siguientes:
pnorm(q, mean = 0, sd = 1)
qnorm(p, mean = 0, sd = 1)
rnorm(n, mean = 0, sd = 1)
siendo:
q: el valor (o valores) para el cual (o los cuales) queremos calcular la
función de distribución
p: el orden del cuantil que queremos obtener
n: el número de valores aleatorios a generar
mean y sd: los dos parámetros que identifican a la distribución Normal.
Vamos a aplicar todas estas funciones en un ejemplo concreto.
Ejemplo3
En unos estudios realizados sobre el peso de los estudiante de un colegio, se
obtiene que el peso medio es 70 kg. y la desviación típica es 3 kg. Selecionando
un estudiante al azar y suponiendo que los pesos se distribuyen normalmente,
calcular:
a) La probabilidad de que el estudiante pese entre 60 kg. y 75 kg. (ambos
inclusive)
b) La probabilidad de que el estudiante pese más de 90 kg.
c) La probabilidad de que el estudiante pese 64 kg. o menos
d) El peso mínimo del 10% de los estudiantes que más pesan
e) Doce pesos aleatorios que sigan dicha distribución.
Solución
En primer lugar, vamos a definir la variable aleatoria X. Por el enunciado del
problema, sabemos que X → N(70, 3)
a) La probabilidad de que el estudiante pese entre 60 kg. y 75 kg. (ambos
inclusive)
En este primer apartado, nos piden calcular P[60 ≤ X ≤ 75] . Esta probabilidad
puede reescribirse como
P[60 ≤ X ≤ 75] = P[X ≤ 75] – P[ X ≤ 60] = F(75) – F(60)
es decir, como una diferencia de valores de la función de distribución de la variable.
Vamos a utilizar la función pnorm para obtener estos valores, de manera que la
diferencia entre ambos nos dará la probabilidad que buscamos.
pnorm(c(75, 60), mean = 70, sd = 3)
[1] 0.9522096477 0.0004290603
0.9522096477 – 0.0004290603
[1] 0.9517806
Por lo que podemos concluir que P[60 ≤ X ≤ 75] = 0.95178 .
b) La probabilidad de que el estudiante pese más de 90 kg.
En este caso, la probabilidad que tenemos que obtener es P[X > 90]. Esta
probabilidad es equivalente a
P[X > 90] = 1 – P[X ≤ 90] = 1 – F(90)
por lo que también puede calcularse a partir de un valor de la función de
distribución. Usemos, de nuevo, la función pnormpara calcular este valor de la
función de distribución y así obtener la probabilidad buscada.
pnorm(90, mean = 70, sd = 3)
[1] 1
1-1
[1] 0
La probabilidad de que un estudiante pese más de 90 kg. es 0.
c) La probabilidad de que el estudiante pese 64 kg. o menos
La probabilidad de que el estudiante pese 64 kg. o menos se puede escribir
como P[X ≤64] = F(64). Esto es, la probabilidad coincide con el valor de la función
de distribución evaluada en el punto 64.
pnorm(64, mean = 70, sd = 3)
[1] 0.02275013
De manera que P[X ≤64] = 0.02275
d) El peso mínimo del 10% de los estudiantes que más pesan
Para entender qué valor debemos calcular, veamos el siguiente gráfico:
Gráfico 1: Representación del percentil 90 en la recta real
Suponiendo que la recta azul representa los valores de la variable ordenados de
menos a mayor, buscamos el 10% de los valores más grandes de la variable (que
estarán situados a la derecha). El mínimo de estos valores (representado con un
punto rojo) será aquel valor que deje a su derecha el 10% de las observaciones. Pero
este punto será también aquel que deja a su izquierda el 90% de las observaciones
restantes. Por tanto, el valor que debemos calcular es el percentil 90. Utilizaremos
para ello la función qnorm.
qnorm(0.9, mean = 70, sd = 3)
[1] 73.84465
El peso que buscamos es 73.84 kg.
e) Doce pesos aleatorios que sigan dicha distribución
Vamos a generar estos 12 pesos aleatorios usando la función rnorm.
rnorm(12, mean = 70, sd = 3)
[1] 71.25560 71.18510 67.92676 72.43674 67.50546 74.52945 74.22862
74.44032
[9] 75.23202 71.34951 66.13856 69.30546
Nota: Dado el carácter aleatorio de los valores generados en este apartado, dichos
valores pueden no coincidir con los que se obtengan a través de otra llamada a la
función rnorm.
Ejercicios 1
Se pretende comprobar la efectividad de una determinada vacuna contra la
gripe. Para ello se administra dicha vacuna a un grupo de 15 pacientes. La
probabilidad de que el paciente vacunado contraiga la gripe es 0.3. Calcula las
siguientes probabilidades:
a) Ningún paciente contraiga la gripe
b) Más de dos pacientes contraigan la gripe
c) Contraigan la gripe entre tres y cinco pacientes, ambos inclusive
d) Generar una muestra aleatoria con 20 de valores de una distribución
Binomial de parámetros n = 10 y prob = 0.2.
Solución:
Definimos la variable aleatoria X = “Nº de pacientes vacunados que contraen la
gripe de un grupo de 15 pacientes”
Esta variable aleatoria tiene una distribución Binomial de parámetros n = 15 y p =
0.3. (X → B (15, 0.3))
a) Ningún paciente contraiga la gripe
En este apartado piden la probabilidad de que la variable aleatoria tome
exactamente el valor 0, es decir, piden la función masa de probabilidad evaluada en
el punto 0
P[Ningún paciente contraiga la gripe] = P[X = 0]
Para resolverlo utilizamos la función dbinom
dbinom(0,15,0.3)
[1]0.004747562
Por tanto, P[Ningún paciente contraiga la gripe] = P[X = 0] = 0.0047
b) Más de dos pacientes contraigan la gripe
P[Más de dos pacientes contraigan la gripe] = P[X > 2] = 1 – P[X ≤ 2] = 1 –F(2).
Para resolverlo utilizamos la función pbinom
1 – pbinom (2,15, 0.3)
[1] 0.8731723
P[Más de dos pacientes contraigan la gripe] = P[X > 2] = 1 – P[X ≤ 2] = 0.8731
c) Contraigan la gripe entre tres y cinco pacientes, ambos inclusive
P[Contraigan la gripe entre 3 y 5 pacientes] = P[3 ≤ X ≤ 5] = P[X ≤ 5] – P[X < 3 ]
= P[X ≤ 5] – P[X ≤ 2] = F(5) – F(2)
Por lo que el cálculo de dicha probabilidad se reduce al cálculo del valor de la función
de distribución en los puntos 5 y 2. Podemos calcular ambos valores de forma
simultánea mediante la función pbinom del siguiente modo
pbinom (c(2, 5),15, 0.3)
[1] 0.1268277 0.7216214
0.7216214 – 0.1268277
[1] 0.5947937
P[Contraigan la gripe entre 3 y 5 pacientes] = P[3 ≤ X ≤ 5] = P[X ≤ 5] – P[X ≤ 2]
= F(5) – F(2) = 0.5947
d) Generar una muestra aleatoria de tamaño 20 de valores de una distribución
Binomial de parámetros n = 10 y prob = 0.2
Para generar una muestra aleatoria utilizamos la función rbinom
rbinom(20, 10, 0.2)
[1] 2 1 2 0 2 0 0 4 2 1 1 2 1 4 1 0 4 2 3 2
Nota: Dado el carácter aleatorio de los valores generados en este apartado, dichos
valores pueden no coincidir con los que se obtengan a través de otra llamada a la
función rbinom.
Ejercicio 2
En un servicio de urgencias de un determinado hospital se sabe que por
término medio llegan diez pacientes durante una hora. Calcula la
probabilidad de que:
a) Lleguen exactamente cinco pacientes en una hora
b) Lleguen menos de cinco pacientes en dos horas
c) Lleguen más de cuatro y menos de ocho pacientes en una hora
d) Generar una muestra de tamaño 15 para una distribución de Poisson de
parámetro media igual a 30.
Solución
Definimos la variable aleatoria X = “Nº de pacientes que acuden al servicio de
urgencias de un hospital en una hora”
Esta variable sigue una distribución Poisson de parámetro λ = 10. X → P(10)
a) Lleguen exactamente cinco pacientes en una hora
Hay que calcular la probabilidad de que la variable aleatoria X tome exactamente el
valor 5
P[Lleguen exactamente cinco pacientes en una hora] = P[X = 5]
Es decir, el valor de la función masa de probabilidad de la variable aleatoria X en el
punto 5. Para ello, vamos a utilizar la función dpois
dpois(5,10)
[1] 0.03783327
P[Lleguen exactamente cinco pacientes en una hora] = P[X = 5] = 0.0378
b) Lleguen menos de cinco pacientes en una hora
P[Lleguen menos de cinco pacientes en una hora] = P[X < 5] = P[X ≤ 4]
Se puede obtener mediante la función masa de probabilidad o la función de
distribución. En el caso de la función masa de probabilidad
P[Lleguen menos de cinco pacientes en una hora] = P[X < 5] = P[X ≤ 4] = P[X = 0]
+ P[X = 1] + P[X = 2] + P[X = 3] + P[X = 4]
Es decir, el valor de la función masa de probabilidad de la variable aleatoria X en los
puntos: 0, 1, 2, 3 y 4. Para ello, vamos a utilizar la función dpois
dpois (0, 10) + dpois (1, 10) + dpois (2, 10) + dpois (3, 10) + + dpois (4, 10)
[1] 0.02925269
En el caso de la función de distribución
P[Lleguen menos de cinco pacientes en una hora] = P[X < 5] = P[X ≤ 4] =
F(4). Para ello, utilizamos la función ppois
ppois(4,10)
[1] 0.02925269
c) Lleguen más de cuatro y menos de ocho pacientes en una hora
P[Lleguen más de cuatro y menos de ocho pacientes] = P[4 < X < 8] = P[X < 8] –
P[X ≤ 4] = P[X ≤ 7] – P[X ≤ 4] = F(7) – F(4)
Hemos expresado la función masa de probabilidad en función de la función de
distribución de la variable evaluada en los puntos 7 y 4. Para resolverlo en R
utilizamos la función ppois
ppois(c(4,7),10)
[1]0.02925269 0.22022065
0.22022065–0.02925269
[1] 0.190968
P[Lleguen más de cuatro y menos de 8] = P[X ≤ 7] – P[X ≤ 4] = 0.1909
d) Generar una muestra de tamaño 15 para una distribución de Poisson de
parámetro media igual a 30
rpois (15, 30)
[1] 28 24 39 22 20 19 23 31 24 40 32 38 29 25 32
Ejercicio 3
Se ha estudiado el nivel de glucosa en sangre en ayunas en un grupo de
diabéticos. Esta variable se supone que sigue una distribución Normal, con
media 106 mg/100 ml y desviación típica 8 mg/100 ml.
Se pide:
a) Obtener la probabilidad de que el nivel de glucosa en sangre en un diabético
sea inferior a 120 mg/100 ml
b) ¿Qué porcentaje de diabéticos tienen niveles de glucosa en sangre
comprendidos entre 90 y 130 mg/100 ml?
c) Hallar el valor de la variable caracterizado por la propiedad de que el 25%
de todos los diabéticos tiene un nivel de glucosa en ayunas inferior a dicho
valor
d) Generar una muestra de tamaño 12 para la una distribución Normal con
media igual a 5 y desviación típica igual a 3.
Solución
Se define la variable, X = “Nivel de glucosa en sangre en un diabético”. Esta
variable tiene distribución Normal con media 106 y desviación típica 8; X → N(106,
8)
a) Obtener la probabilidad de que el nivel de glucosa en sangre en un diabético
sea inferior a 120 mg/100 ml
P[Nivel de glucosa sea inferior a 120] = P[X < 120] = F(120)
Calculamos la probabilidad pedida utilizando la función de distribución. Usamos la
función pnorm
pnorm(120, mean = 106, sd = 8)
[1] 0.9599408
Por lo tanto, P[Nivel de glucosa sea inferior a 120] = 0.9599
b) ¿Qué porcentaje de diabéticos tienen niveles de glucosa en sangre
comprendidos entre 90 y 130 mg/100 ml?
P[Niveles comprendidos entre 90 y 130] = P[90 ≤ X ≤ 130] = P[X ≤ 130] –
P[X ≤ 90] = F(130)- F(90). Utilizamos de nuevo la función de distribución pnorm
pnorm(c(130, 90),mean = 106, sd = 8)
[1] 0.99865010 0.02275013
0.99865010- 0.02275013
[1] 0.9759
Por lo tanto, P[Niveles comprendidos entre 90 y 130] = P[X <= 130] – P[X < 90] =
0.9759
c) Hallar el valor de la variable caracterizado por la propiedad de que el 25%
de todos los diabéticos tiene un nivel de glucosa en ayunas inferior a dicho
valor
Se pide calcular un valor de la distribución de X, tal que P[X < x] = 0.25
El valor que tenemos que calcular es el cuantil 25. Utilizamos la función qnorm.
qnorm(0.25, mean = 106, sd = 8)
[1] 100.6041
Se obtiene como resultado P[X < 100.6041] = 0.25
d) Generar una muestra de tamaño 12 para la una distribución Normal con
media igual a 5 y desviación típica igual a 3.
rnorm(12, mean = 5, sd = 3)
[1] 4.764470 7.124756 8.790588 3.268813 1.533834 3.463991 8.116047 3.097280
[9] 8.316036 4.906755 3.550390 4.613455
Ejercicio 4
Se realiza un estudio en el parque natural de Sierra Nevada, donde la
probabilidad de que una planta sea una especie protegida es de 0.35. Se pide:
a) Calcular la probabilidad de encontrar 8 plantas de especies protegidas
entre 10 de la zona
b) Calcular la probabilidad de encontrar entre 2 y 5 plantas de especies
protegidas entre 9 de la zona
c) Hallar la probabilidad de que entre 6 plantas de la zona se encuentren 4 que
no estén protegidas
d) Si se seleccionan 20 plantas de la zona, calcular el número mediano de
plantas protegidas
e) Generar una muestra aleatoria de tamaño 8 del número de plantas
protegidas que se obtendrían al seleccionar 16 plantas de la zona.
Solución
a) Calcular la probabilidad de encontrar 8 plantas de especies protegidas
entre 10 de la zona
Definamos la variable aleatoria: X = "Número de especies protegidas entre las 10 seleccionadas"
Sabemos que: X → B(10, 0.35).
La probabilidad que nos piden calcular es P[X = 8]. Utilizando la función dbinom, se tiene que
dbinom(8, size=10, prob = 0.35)
[1] 0.004281378
Por lo tanto, P[X = 8] = 0.00428
b) Calcular la probabilidad de encontrar entre 2 y 5 plantas de especies
protegidas entre 9 de la zona
Definimos la variable aleatoria: Y: “Número de especies protegidas entre las 9 elegidas”.
Sabemos que: Y → B(9, 0.35).
La probabilidad que tenemos que calcular es: P[2 ≤Y ≤5] = P[Y ≤ 5] - P[Y ≤ 1] = F(5)-F(1)
pbinom(c(5,1), size = 9, prob = 0.35)
[1] 0.9464118 0.1210850
0.9464118 - 0.1210850
[1] 0.8253268
Por lo tanto, P[2 ≤Y ≤5] = 0.8253
c) Hallar la probabilidad de que entre 6 plantas de la zona se encuentren 4 que
no estén protegidas
Definamos la v.a. U: "Número de especies NO protegidas entre las 6 seleccionadas"
Sabemos que: U → B(6, 0.65).
Hay que calcular la probabilidad: P[U = 4]
dbinom(4, size = 6, prob = 0.65)
[1] 0.3280052
Por lo tanto: P[U = 4] = 0.3280
d) Si se seleccionan 20 plantas de la zona, calcular el número mediano de
plantas protegidas.
Definamos la v.a. V: “Número de especies protegidas entre las 20 seleccionadas"
Sabemos que: V → B(20, 0.35)
Calcular el número mediano de plantas protegidas de la variable V equivale a calcular el cuantil
de orden 0.5. Por tanto, vamos a utilizar la función qbinom
qbinom(0.5, size = 20, prob = 0.35)
[1] 7
Podemos concluir que el número mediano de plantas protegidas en este caso es 7.
e) Generar una muestra aleatoria de tamaño 8 del número de plantas
protegidas que se obtendrían al seleccionar 16 plantas de la zona.
Definimos la v.a. W: “Número de especies protegidas entre las 16 seleccionadas"
Sabemos que: W → B(16, 0.35). Para generar una m.a. utilizamos la función rbinom.
rbinom(8, size = 16, prob = 0.35)
[1] 5 5 8 4 3 8 7 8
Ejercicio 5
Una máquina que se utiliza para analizar los componentes químicos de
muestras analiza un promedio de 6 muestras por hora. Calcular las siguientes
probabilidades:
a) No se analice ninguna muestra en una hora
b) Se analicen al menos seis muestras en una hora
c) Se analicen menos de 5 muestras en una hora
d) Se dispone de una nueva máquina que, según sus especificaciones, analiza
un promedio de 15 muestras por hora. Calcular la probabilidad de analizar
seis muestras en una hora.
Solución
Vamos a definir la variable X="Número de muestras analizadas por hora"
Sabemos que X → P(6).
a) No se analice ninguna muestra con la máquina en una hora
La probabilidad que tenemos que calcular es P[X = 0]. Usaremos, para ello, la función dpois.
dpois(0, lambda = 6)
[1] 0.002478752
Esta probabilidad es 0.002478.
b) Se analicen al menos seis muestras con la máquina en una hora
La probabilidad buscada es P[X ≥ 6] = 1- P[X ≤ 5]= 1 - F(5)
1 - ppois(5, lambda = 6)
[1] 0.5543204
Por lo que P[X ≥ 6] = 0.55432.
c) Se analicen menos de 5 muestras con la máquina en una hora.
P [X < 5] = P[X ≤ 4] = F(4)
ppois(4, lambda = 6)
[1] 0.2850565
Por lo que P [X < 5] = 0.28505.
d) Se dispone de una nueva máquina que, según sus especificaciones, analiza
un promedio de 15 muestras por hora. Calcular la probabilidad de analizar
seis muestras en una hora.
Puesto que el número promedio de muestras analizadas por hora por esta nueva máquina es
diferente al de la máquina anterior, debemos definir una nueva variable aleatoria: Y : “Número
de muestras analizadas por la nueva máquina en una hora” con Y → P(15).
La probabilidad que tenemos que calcular es P[Y = 6]
dpois (6, lambda = 15)
[1] 0.00483947
Por lo que P[Y = 6] = 0.004839.
Ejercicio 6
Una de las mayores contribuciones a la contaminación atmosférica es la
provocada por los hidrocarburos procedentes de los tubos de escape de los
automóviles. Definimos la variable aleatoria X que mide los gramos de
hidrocarburo emitidos por un automóvil por cada dos kilómetros.
Supongamos que X sigue una distribución Normal con una media de 1 gramo
y una desviación típica de 0.25 gramos. Calcular:
a) La probabilidad de que un automóvil emita más de 1.5 gramos
b) La probabilidad de que un automóvil emita menos de 1.2 gramos
c) La probabilidad de que un automóvil emita entre 1.3 y 1.4 gramos
d) Los cuartiles de la distribución
e) Una muestra aleatoria de 10 valores de la distribución.
Solución
Variable aleatoria: X=" Gramos de hidrocarburo emitidos por un automóvil por cada dos
kilómetros". Sabemos que X → N(1, 0.25).
a) La probabilidad de que un automóvil emita más de 1.5 gramos.
Esta probabilidad puede escribirse en términos de la variable aleatoria X como P[X > 1.5],la cual
puede reescribir, a su vez, tal y como sigue P[X > 1.5] = 1 - P[X ≤ 1.5] = 1 - F(1.5). De manera
que debemos obtener el valor de la función de distribución evaluada en el punto 1.5, para lo cual
usaremos la función pnorm.
1 - pnorm(1.5, mean = 1, sd = 0.25)
[1] 0.02275013
Por tanto, P[X > 1.5] = 0.02275.
b) La probabilidad de que un automóvil emita menos de 1.2 gramos.
La probabilidad pedida es P[X < 1.2], la cual es equivalente a esta otra P[X < 1.2] = F(1.2), dado
el carácter continuo de la variable 𝑋. Por tanto, debemos calcular un nuevo valor de la función de
distribución tal y como se muestra a continuación:
pnorm(1.2, mean = 1, sd = 0.25)
[1] 0.7881446
Por lo tanto, P[X < 1.2] = 0.788144.
c) La probabilidad de que un automóvil emita entre 1.3 y 1.4 gramos.
En este caso, la probabilidad buscada es P[1.3 ≤ X ≤ 1.4]. Esta probabilidad puede reescribirse
como P[1.3 ≤ X ≤ 1.4] = P[X ≤ 1.4] - P[X ≤ 1.3] = F(1.4) – F(1.3).
pnorm(c(1.4, 1.3), mean = 1, sd = 0.25)
[1] 0.9452007 0.8849303
0.9452007 - 0.8849303
[1] 0.0602704
Por lo tanto: P[1.3 ≤ X ≤ 1.4] = 0.0602704
d) Los cuartiles de la distribución
Los tres cuartiles de una distribución coinciden con los cuantiles de órdenes 0.25, 0.5 y 0.75,
respectivamente. Por ello, utilizaremos la función qnorm para obtener dichos valores.
qnorm(c(0.25, 0.5, 0.75), mean = 1, sd = 0.25)
[1] 0.8313776 1.0000000 1.1686224
De manera que los tres cuartiles de esta distribución son 0.8313, 1 y 1.1686.
e) Una muestra aleatoria de 10 valores de la distribución
Por último, vamos a obtener una muestra de 10 valores aleatorios de la distribución normal
utilizando la función rnorm.
rnorm(10, mean = 1, sd = 0.25)
[1] 1.0988758 0.9882777 1.1723504 1.1926312 0.6464497 1.1844106 1.2739809
[8] 1.0748260 1.3157611 1.4269702
Ejercicio 7
En cierta especie de aves, se ha detectado una contaminación apreciable de
mercurio (Hg) en sangre. La concentración de mercurio en sangre está
distribuida normalmente con media 0.25 ppm (partes de Hg por millón, en
plasma) y desviación típica 0.08 ppm.
a) ¿Cuál es la probabilidad de que un ave presente un nivel de mercurio en
sangre superior a 0.40 ppm ?
b) ¿Cuál es la probabilidad de que un ave tenga un nivel de mercurio en sangre
entre 0.20 y 0.50 ppm?
c) ¿Cuál es el nivel máximo de concentración de mercurio en sangre del 40%
de las aves menos contaminadas?
d) Generar una muestra de tamaño 10.
Solución
Se define la siguiente variable aleatoria: X = “Concentración de mercurio en sangre”. Esta
variable aleatoria tiene distribución Normal con parámetros µ = 0.25 y σ = 0.08.
a) ¿Cuál es la probabilidad de que un ave presente un nivel de mercurio en
sangre superior a 0.40 ppm?
P[Un ave presente un nivel de mercurio en sangre superior a 0.40 ppm] = P[X > 0.40] = 1 – P[X
≤ 0.40] = 1- F(0.40)
1 - pnorm(0.4, mean = 0.25, sd = 0.08)
[1] 0.03039636
Por lo tanto, P[X > 0.40] = 0.0303
b) ¿Cuál es la probabilidad de que un ave tenga un nivel de mercurio en sangre
entre 0.20 y 0.50 ppm?
P[Un ave tenga un nivel de mercurio en sangre entre 0.20 y 0.50 ppm] = P[0.20 < X < 0.50] =
P[X < 0.50] – P[X ≤ 0.20] = F(0.50) – F( 0.20)
pnorm(c(0.5, 0.2), mean = 0.25, sd = 0.08)
[1] 0.9991110 0.2659855
0.9991110 - 0.2659855
[1] 0.7331255
Por lo tanto, P[0.20 < X < 0.50] = 0.7331
c) ¿Cuál es el nivel máximo de concentración de mercurio en sangre del 40% de las aves
menos contaminadas?
Se pide calcular el percentil 40 de la distribución, es decir, calcular P40, tal que P[X < P40] = 0.40.
qnorm(0.4, mean = 0.25, sd = 0.08)
[1] 0.2297322
Por lo tanto, P40 = 0.2297
d) Generar una muestra de tamaño 10
rnorm(10, mean = 0.25, sd = 0.08)
[1] 0.3182689 0.1325797 0.1579725 0.1233806 0.3394124 0.2782742 0.2770455
[8] 0.4207871 0.2173098 0.2337567