Funciones Básicas de R: Redondeo y Control
Funciones Básicas de R: Redondeo y Control
Ejemplo
Aplique las funciones round, ceiling, floor y trunc a un valor positivo y a
un valor negativo para inspeccionar los resultados.
A continuación el código de prueba para un número positivo cualquiera.
## [1] 5.349
ceiling(x)
## [1] 6
floor(x)
## [1] 5
trunc(x)
## [1] 5
A continuación las pruebas con un número negativo cualquiera.
## [1] -4.266
ceiling(x)
0.29. FUNCIONES SORT Y RANK li
## [1] -4
floor(x)
## [1] -5
trunc(x)
## [1] -4
Ejemplo
Considere el vector x que tiene los siguientes elementos: 2, 3, 6, 4, 9 y 5. Ordene
el vector de menor a mayor, de mayor a menor y por último encuentre la posición
que ocupan los elementos de x si se ordenaran de menor a mayor.
x <- c(2, 3, 6, 4, 9, 5)
sort(x)
## [1] 2 3 4 5 6 9
sort(x, decreasing=TRUE)
## [1] 9 6 5 4 3 2
rank(x)
## [1] 1 2 5 3 6 4
lii FUNCIONES BÁSICAS DE R
EJERCICIOS
Use funciones o procedimientos (varias líneas) de R para responder cada una de
las siguientes preguntas.
En R hay unas bases de datos incluídas, una de ellas es la base de datos llamada
mtcars. Para conocer las variables que están en mtcars usted puede escribir en
la consola ?mtcars o también help(mtcars). De la base mtcars obtenga bases
de datos que cumplan las siguientes condiciones.
15 [Link]
0.29. FUNCIONES SORT Y RANK liii
22. Autos que tengan un rendimiento menor a 18 millas por galón de combus-
tible.
23. Autos que tengan 4 cilindros.
24. Autos que pesen más de 2500 libras y tengan transmisión manual.
liv FUNCIONES BÁSICAS DE R
Instrucciones de control
0.30. Instrucción if
Esta instrucción sirve para realizar un conjunto de operaciones si se cumple
cierta condición. A continuación se muestra la estructura básica de uso.
if (condicion) {
operación 1
operación 2
...
operación final
}
Ejemplo
Una secretaria recibe la información del salario básico semanal de un empleado
y las horas trabajadas durante la semana por ese empleado. El salario básico es
la remuneración por 40 horas de labor por semana, las horas extra son pagadas a
ciencuenta mil pesos. Escriba el procedimiento en R que debe usar la secretaria
para calcular el salario semanal de un empleado que trabajó 45 horas y tiene
salario básico de un millon de pesos.
El código para calcular el salario final del empleado es el siguiente:
lv
lvi INSTRUCCIONES DE CONTROL
## [1] 1.25
if (condicion) {
operación 1
operación 2
...
operación final
}
else {
operación 1
operación 2
...
operación final
}
Ejemplo
Suponga que usted recibe un vector de números enteros, escriba un procedimien-
to que diga si cada elemento del vector es par o impar.
0.33. INSTRUCCIÓN FOR lvii
## [1] "Es impar" "Es impar" "Es par" "Es par" "Es par" "Es impar"
for (i in secuencia) {
operación 1
operación 2
...
operación final
}
Ejemplo
Escriba un procedimiento para crear 10 muestras de tamaño 100 de una distri-
bución uniforme entre uno y tres. Para cada una de las muestra, se debe contar
el número de elementos de la muestra que fueron mayores o iguales a 2.5.
for (i in 1:nrep) {
x <- runif(n=n, min=1, max=3)
conteo[i] <- sum(x >= 2.5)
}
## [1] 24 37 28 26 30 18 29 23 19 19
while (condición) {
operación 1
operación 2
...
operación final
}
Ejemplo
Suponga que se lanza una moneda en la cual el resultado es cara o sello. Es-
cribir un procedimiento que simule lanzamientos hasta que el número de caras
obtenidas sea 5. El procedimiento debe entregar el historial de lanzamientos.
Para simular el lanzamiento de una moneda se puede usar la función sample
y definiendo el vector resultados con size=1 para simular un lanzamiento, a
continuación el código y tres pruebas ilustrativas.
## [1] "Sello"
Una vez seamos capaces de simular un lanzamiento podemos escribir el procedi-
miento para generar tantos lanzamientos hasta que se cumpla la condición. El
código mostrado abajo permite hacer lo solicitado.
historial
## [1] "Sello" "Sello" "Sello" "Sello" "Cara" "Cara" "Sello" "Sello" "Cara"
## [10] "Cara" "Cara"
0.35. INSTRUCCIÓN REPEAT lix
[Link]
## [1] 11
repeat {
operación 1
operación 2
...
operación final
if (condición) break
}
Ejemplo
Escribir un procedimiento para ir aumentando de uno en uno el valor de x hasta
que x sea igual a siete El procedimiento debe imprimir por pantalla la secuencia
de valores de x.
repeat {
print(x)
x <- x + 1
if (x == 8) {
break
}
}
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
lx INSTRUCCIONES DE CONTROL
lxi
lxii CREACIÓN DE FUNCIONES EN R
cuerpo
cuerpo
cuerpo
return(resultado)
}
Ejemplo
Construir una función que reciba dos números y que entregue la suma de estos
números.
Solución
Lo primero es elegir un nombre apropiado para la función, aquí se usó el nombre
suma porque así se tiene una idea clara de lo que hace la función. La función
suma recibe dos parámetros, x representa el primer valor ingresado mientras que
y representa el segundo. El cuerpo de la función está formado por dos líneas,
en la primera se crea el objeto resultado en el cual se almanacena el valor de
la suma, en la segunda línea se le indica a R que queremos que retorne el valor
de la suma almacenada en el objeto resultado. A continuación se muestra el
código para crear la función solicitada.
Para usar la función creada sólo se debe ejecutar, vamos a obtener la suma de
los valores 4 y 6 usando la función suma, a continuación el código necesario.
suma(x=4, y=6)
## [1] 10
Para funciones simples como la anterior es posible escribirlas en forma más
compacta. Es posible reducir el cuerpo de la función de 2 líneas a sólo una línea
solicitándole a R que retorne directamente la suma sin almacenarla en ningún
objeto. A continuación la función suma modificada.
## [1] 10
Debido a que la función suma tiene un cuerpo muy reducido es posible escribirla
en forma más compacta, en una sola línea. A continuación se muestra el código
para reescribir la función.
## [1] 10
Ejemplo
Construir una función que genere números aleatorios entre cero y uno hasta
que la suma de éstos números supere por primera vez el valor de 3. La función
debe entregar la cantidad de números aleatorios generados para que se cumpla
la condición.
Solución
Vamos a llamar la función solicitada con el nombre fun1, esta función NO
necesita ningún parámetro de entrada. El valor de 3 que está en la condición
puede ir dentro del cuerpo y por eso no se necesitan parámetros para esta función.
En el cuerpo de la función se genera un vector con un número aleatorio y luego
se chequea si la suma de sus elementos es menor de 3, si se cumple que la suma
es menor que 3 se siguen generando números que se almacenan en el vector num.
Una vez que la suma exceda el valor de 3 NO se ingresa al while y se pide la
longitud del vector o el valor de veces solicitado. A continuación el código de
la función.
## [1] 8
Ejemplo
Construir una función que, dado un número entero positivo (cota) ingresado por
el usuario, genere números aleatorios entre cero y uno hasta que la suma de los
números generados exceda por primera vez la cota. La función debe entregar un
vector con los números aleatorios, la suma y la cantidad de números aleatorios.
Si el usuario no ingresa el valor de la cota, se debe asumir igual a 1.
Solución
fun2()
## $vector
## [1] 0.8523376 0.4814579
##
## $suma
## [1] 1.333796
##
## $cantidad
## [1] 2
fun2(cota=3)
## $vector
## [1] 0.7703864 0.6567623 0.5173527 0.7785944 0.6926085
##
## $suma
## [1] 3.415704
##
## $cantidad
## [1] 5
Ejemplo
Construya una función que reciba dos números de la recta real y que entregue el
punto médio de estos números. El resultado debe ser un mensaje por pantalla.
Solución
El punto médio entre dos valores es la suma de los números divido entre dos.
La función cat sirve para concatenar objetos y presentarlos por pantalla. A
continuación el código para la función requerida.
La función cat es muy útil para presentar resultados por pantalla. Con-
sulte la ayuda de la función para ver otros ejemplos.
EJERCICIOS
Construir funciones en R que realicen lo solicitado.
1. Construya una función que reciba dos números reales a y b, la función
debe decir cuál es el mayor de ellos.
2. Escriba una función llamada media que calcule la media muestral de un
vector numérico x ingresado a la función. A continuación la fórmula para
calcular la media muestral.
lxvi CREACIÓN DE FUNCIONES EN R
𝑛
∑𝑖=1 𝑥𝑖
𝑥̄ =
𝑛
𝑒𝑠𝑝𝑎𝑐𝑖𝑜
𝑣𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑 =
𝑡𝑖𝑒𝑚𝑝𝑜
5. Escribir una función que reciba dos valores 𝑎 y 𝑏 y que los intercambie. Es
decir, si ingresa 𝑎 = 4 y 𝑏 = 9 que la función entregue 𝑎 = 9 y 𝑏 = 4.
6. Construya una función a la cual le ingrese el salario por hora y el número
de horas trabajadas durante una semana por un trabajador. La función
debe calcular el salario neto.
7. Construya una función llamada precio que calcule el precio total de sacar
A fotocopias y B impresiones, sabiendo que los precios son 50 y 100 pesos
para A y B respectivamente si el cliente es un estudiante, y de 75 y 150 para
A y B si el cliente es un profesor. La función debe tener dos argumentos
cuantitativos (A y B) y el argumento lógico estudiante que por defecto
tenga el valor de TRUE. Use la estructura mostrada abajo.
8. Construya una función llamada salario que le ingrese el salario por hora
y el número de horas trabajadas durante una semana por un trabajador.
La función debe calcular el salario neto semanal, teniendo en cuenta que
si el número de horas trabajadas durante la semana es mayor de 48, esas
horas de demás se consideran horas extras y tienen un 35 % de recargo.
Imprima el salario neto. Use la estructura mostrada abajo.
...
...
return([Link])
}
9. Construya una función llamada nota que calcule la nota obtenida por un
alumno en una evaluación de tres puntos cuya ponderación o importancia
son 20 %, 30 % y 50 % para los puntos I, II y III respectivamente. Adicio-
nalmente la función debe generar un mensaje sobre si el estudiante aprobó
la evaluación o no. El usuario debe ingresar las notas individuales de los
tres puntos y la función debe entregar la nota final de la evaluación. Use
la estructura mostrada abajo.
10. Escriba una función llamada minimo que permita obtener el valor mínimo
de un vector numérico. No puede usar ninguna de las funciones básicas de
R como [Link](), [Link](), order(), min( ), max( ), sort( )
u order( ). Use la estructura mostrada abajo.
11. Construya una función que calcule las coordenadas del punto medio 𝑀 en-
tre dos puntos 𝐴 y 𝐵. Vea la siguiente figura para una ilustración. ¿Cuáles
cree usted que deben ser los parámetros de entrada de la función?
lxviii CREACIÓN DE FUNCIONES EN R
Lectura de bases de datos
En este capítulo se mostrará cómo leer una base de datos externa hacia R.
En las secciones siguientes se mostrará cómo almacenar datos en los dos formatos
para ser leídos en R. En el Cuadro 1 se presenta una base de datos pequeña,
tres observaciones y tres variables, que nos servirá como ejemplo para mostrar
cómo se debe almacenar la información.
lxix
lxx LECTURA DE BASES DE DATOS
Una buena práctica es usar la barra tabuladora para separar, eso permite
que la información se vea ordenada.
Ejemplo
Crear la base de datos del Cuadro 1 en Excel y bloc de notas para practicar la
lectura de base de datos desde R.
Solución
Lo primero que se debe hacer para realizar lo solicitado es construir tres archivos
(uno de Excel y dos bloc de notas) igual a los mostrados en las figuras anterio-
res. Vamos a suponer que los nombres para cada uno de ellos son [Link],
[Link] y [Link] respectivamente.
Para Excel
Para leer el archivo de Excel llamado [Link] podemos usar el siguiente
código.
Ejemplo
Leer la base de datos sobre apartamentos usados en la ciudad de Medellín que
está disponible en la página web cuya url es: [Link]
[Link]/fhernanb/datos/master/aptos2015
Solución
Para leer la base de datos desde una url usamos el siguiente código.
Ejemplo
En este enlace16 está disponible un archivo de Excel llamado BD_Excel.xlxs,
una vez se ha abierto la página donde está alojado el archivo, se debe descargar y
guardar en alguna carpeta. El archivo contiene dos bases de datos muy pequeñas,
en la primera hoja llamada Hijos está la información de un grupo de niños y
en la segunda hoja llamada Padres está la información de los padres. ¿Cómo
se pueden leer las dos bases de datos?
Solución
Lo primero que se debe hacer es instalar el paquete readxl, la instalación de
cualquier paquete en un computador se hace una sola vez y éste quedará instala-
do para ser usado las veces que se requiera. La función para instalar un paquete
cualquiera es [Link], a continuación se muestra el código necesario
para instalar el paquete readxl.
[Link]("readxl")
library(readxl)
16 [Link]
lxxiv LECTURA DE BASES DE DATOS
EJERCICIOS
Realice los siguiente ejercicios propuestos.
1. En el Cuadro 2 se presenta una base de datos sencilla. Almacene la infor-
mación del cuadro en dos archivos diferentes, en Excel y en bloc de notas.
Lea los dos archivos con la función [Link] y compare los resultados
obtenidos con la del Cuadro 2 fuente.
2. En la url [Link]
ter/medidas_cuerpo están disponibles los datos sobre medidas corporales
para un grupo de estudiante de la universidad, use la función [Link]
para leer la base de datos.
0.41. LECTURA DE BASES DE DATOS EN EXCEL lxxv
Las tablas de frecuencia son muy utilizadas en estadística y R permite crear ta-
blas de una forma sencilla. En este capítulo se explican las principales funciones
para la elaboración de tablas.
fuma <- c('Frecuente', 'Nunca', 'A veces', 'A veces', 'A veces',
'Nunca', 'Frecuente', NA, 'Frecuente', NA, 'hola',
'Nunca', 'Hola', 'Frecuente', 'Nunca')
lxxvii
lxxviii TABLAS DE FRECUENCIA
table(fuma)
## fuma
## A veces Frecuente hola Hola Nunca
## 3 4 1 1 4
De la tabla anterior vemos que NO aparece el conteo de los NA, para obtenerlo
usamos lo siguiente.
table(fuma, useNA='always')
## fuma
## A veces Frecuente hola Hola Nunca <NA>
## 3 4 1 1 4 2
Vemos que hay dos niveles errados en la tabla anterior, Hola y hola. Para
construir la tabla sin esos niveles errados usamos lo siguiente.
## fuma
## A veces Frecuente Nunca <NA>
## 3 4 4 2
Por último construyamos la tabla sin los niveles errados y los NA, a esta última
tabla la llamaremos tabla1 para luego poder usarla. Las instrucciones para
hacer esto son las siguientes.
## fuma
## A veces Frecuente Nunca
## 3 4 4
table(sexo, fuma)
## fuma
## sexo A veces Frecuente hola Hola Nunca
## Casa 0 0 0 0 1
## Hombre 1 1 0 0 2
## Mujer 1 3 1 0 1
De la tabla anterior vemos que aparecen niveles errados en fuma y en sexo, para
retirarlos usamos el siguiente código incluyendo en el parámetro exclude un
vector con los niveles que NO deseamos en la tabla.
## fuma
## sexo A veces Frecuente Nunca
## Hombre 1 1 2
## Mujer 1 3 1
[Link](x, margin=NULL)
x: tabla de frecuencia.
margin: valor de 1 si se desean proporciones por filas, 2 si se desean por
columnas, NULL si se desean frecuencias globales.
[Link](x=tabla1)
## fuma
## A veces Frecuente Nunca
## 0.2727273 0.3636364 0.3636364
## fuma
## sexo A veces Frecuente Nunca
## Hombre 0.1111111 0.1111111 0.2222222
## Mujer 0.1111111 0.3333333 0.1111111
Si se desea la tabla de frecuencias relativas marginal por columnas se usa el
siguiente código.
## fuma
## sexo A veces Frecuente Nunca
## Hombre 0.5000000 0.2500000 0.6666667
## Mujer 0.5000000 0.7500000 0.3333333
addmargins(A, margin)
A: tabla de frecuencia.
margin: valor de 1 si se desean proporciones por columnas, 2 si se desean
por filas, NULL si se desean frecuencias globales.
0.45. FUNCIÓN HIST lxxxi
Ejemplo
Obtener las tablas tabla3 y tabla4 con los totales margines global y por co-
lumnas respectivamente.
Para hacer lo solicitado usamos las siguientes instrucciones.
addmargins(tabla3)
## fuma
## sexo A veces Frecuente Nunca Sum
## Hombre 0.1111111 0.1111111 0.2222222 0.4444444
## Mujer 0.1111111 0.3333333 0.1111111 0.5555556
## Sum 0.2222222 0.4444444 0.3333333 1.0000000
addmargins(tabla4, margin=1)
## fuma
## sexo A veces Frecuente Nunca
## Hombre 0.5000000 0.2500000 0.6666667
## Mujer 0.5000000 0.7500000 0.3333333
## Sum 1.0000000 1.0000000 1.0000000
Ejemplo
Genere 200 observaciones aleatorias de una distribución normal con media 𝜇 =
170 y desviación 𝜎 = 5, luego construya una tabla de frecuencias para la muestra
obtenida usando (a) la regla de Sturges y (b) tres intervalos con límites 150, 170,
180 y 190.
Primero se construye el vector x con las observaciones de la distribución normal
por medio de la función rnorm y se especifica la media y desviación solicitada.
Luego se aplica la función hist con el parámetro breaks='Sturges', a conti-
nuación el código utilizado.
## $breaks
## [1] 155 160 165 170 175 180 185
##
## $counts
## [1] 4 30 61 71 26 8
##
## $density
## [1] 0.004 0.030 0.061 0.071 0.026 0.008
##
## $mids
## [1] 157.5 162.5 167.5 172.5 177.5 182.5
##
## $xname
## [1] "x"
##
## $equidist
## [1] TRUE
##
## attr(,"class")
## [1] "histogram"
El objeto res1 es una lista donde se encuentra la información de la tabla de
frecuencias para x. Esa lista tiene en el elemento breaks los límites inferior y
superior de los intervalos y en el elemento counts están las frecuencias de cada
0.45. FUNCIÓN HIST lxxxiii
## $breaks
## [1] 150 170 180 190
##
## $counts
## [1] 95 97 8
##
## $density
## [1] 0.02375 0.04850 0.00400
##
## $mids
## [1] 160 175 185
##
## $xname
## [1] "x"
##
## $equidist
## [1] FALSE
##
## attr(,"class")
## [1] "histogram"
Ejemplo
Construya el vector x con los siguientes elementos: 1.0, 1.2, 1.3, 2.0, 2.5, 2.7,
3.0 y 3.4. Obtenga varias tablas de frecuencia con la función hist variando
los parámetros [Link] y right. Use como límite de los intervalos los
valores 1, 2, 3 y 4.
Lo primero que debemos hacer es crear el vector x solicitado así:
x <- c(1.1, 1.2, 1.3, 2.0, 2.0, 2.5, 2.7, 3.0, 3.4)
1 2 3 4
Valores de x
Figura 1: Ubicación de los puntos del ejemplo con límites en color azul.
## $breaks
## [1] 1 2 3 4
##
## $counts
## [1] 5 3 1
Ahora vamos a repetir la tabla pero usando rigth=FALSE para ver la diferencia,
en res4 están los resultados.
## $breaks
0.45. FUNCIÓN HIST lxxxv
## [1] 1 2 3 4
##
## $counts
## [1] 3 4 2
Al comparar los últimos dos resultados vemos que la primera frecuencia es 5
cuando right=TRUE porque los intervalos se consideran cerrados a la derecha.
Ahora vamos a construir una tabla de frecuencia usando FALSE para los pará-
metros [Link] y right.
## $breaks
## [1] 1 2 3 4
##
## $counts
## [1] 3 4 2
De este último resultado se ve claramente el efecto de los parámetros
[Link] y right en la construcción de tablas de frecuencia.
EJERCICIOS
Use funciones o procedimientos (varias líneas) de R para responder cada una de
las siguientes preguntas.
En el Cuadro 2 se presenta una base de datos sencilla. Lea la base de datos
usando la funcion [Link] y construya lo que se solicita a continuación.
1. Construya una tabla de frecuencia absoluta para la variable pasatiempo.
2. Construya una tabla de frecuencia relativa para la variable fuma.
3. Construya una tabla de frecuencia relativa para las variables pasatiempo
y fuma.
4. ¿Qué porcentaje de de los que no fuman tienen como pasatiempo la lectura.
5. ¿Qué porcentaje de los que corren no fuman?
lxxxvi TABLAS DE FRECUENCIA
Medidas de tendencia
central
Para ilustrar el uso de las funciones se utilizará una base de datos llamada
medidas del cuerpo, esta base de datos cuenta con 6 variables registradas a
un grupo de 36 estudiantes de la universidad. Las variables son:
A continuación se presenta el código para definir la url donde están los datos,
para cargar la base de datos en R y para mostrar por pantalla un encabezado
(usando head) de la base de datos.
lxxxvii
lxxxviii MEDIDAS DE TENDENCIA CENTRAL
0.46. Media
Para calcular la media de una variable cuantitativa se usa la función mean. Los
argumentos básicos de la función mean son dos y se muestran a continuación.
Ejemplo
Suponga que queremos obtener la altura media del grupo de estudiantes.
Para encontrar la media general se usa la función mean sobre el vector númerico
datos$altura.
mean(x=datos$altura)
## [1] 171.5556
Del anterior resultado podemos decir que la estatura media o promedio de los
estudiantes es 171.5555556 centímetros.
Ejemplo
Suponga que ahora queremos la altura media pero diferenciando por sexo.
Para hacer esto se debe primero dividir o partir el vector de altura según los
niveles de la variable sexo, esto se consigue por medio de la función split y el
resultado será una lista con tantos elementos como niveles tenga la variable sexo.
Luego a cada uno de los elementos de la lista se le aplica la función mean con la
ayuda de sapply o tapply. A continuación el código completo para obtener las
alturas medias para hombres y mujeres.
## Hombre Mujer
## 179.0778 164.0333
El resultado es un vector con dos elementos, vemos que la altura media para
hombres es 179.0777778 centímetros y que para las mujeres es de 164.0333333
centímetros.
0.47. MEDIANA lxxxix
Ejemplo
Suponga que se tiene el vector edad con las edades de siete personas y supóngase
que para el individuo cinco no se tiene información de su edad, eso significa que
el vector tendrá un NA en la quinta posición.
¿Cuál será la edad promedio del grupo de personas?
## [1] NA
Al correr el código anterior se obtiene un error y es debido al símbolo NA en la
quinta posición. Para calcular la media sólo con los datos de los cuales se tiene
información, se incluye el argumento [Link] = TRUE para que R remueva los NA.
El código correcto a usar en este caso es:
mean(x=edad, [Link]=TRUE)
## [1] 26.66667
De este último resultado se obtiene que la edad promedio de los individuos es
26.67 años.
0.47. Mediana
Para calcular la mediana de una variable cantitativa se usa la función median.
Los argumentos básicos de la función median son dos y se muestran a continua-
ción.
Ejemplo
Calcular la edad mediana para los estudiantes de la base de datos.
Para obtener la mediana usamos el siguiente código:
xc MEDIDAS DE TENDENCIA CENTRAL
median(x=datos$edad)
## [1] 28
y obtenemos que la mitad de los estudiantes tienen edades mayores o iguales a
28 años.
El resultado anterior se pudo haber obtenido con la función quantile e indi-
cando que se desea el cuantil 50 así:
quantile(x=datos$edad, probs=0.5)
## 50%
## 28
0.48. Moda
La moda de una variable cuantitativa corresponde a valor o valores que más
se repiten, una forma sencilla de encontrar la moda es construir una tabla de
frecuencias y observar los valores con mayor frecuencia.
Ejemplo
Calcular la moda para la variable edad de la base de datos de estudiantes.
Se construye la tabla con la función table y se crea el objeto tabla para alma-
cenarla.
##
## 19 20 21 22 23 24 25 26 28 29 30 32 33 35 37 40 43 45 51 55 65
## 1 1 1 3 2 1 5 3 2 1 2 1 1 2 3 1 2 1 1 1 1
Al mirar con detalle la tabla anterior se observa que el valor que más se repite
es la edad de 25 años en 5 ocasiones. Si la tabla hubiese sido mayor, la ins-
pección visual nos podría tomar unos segundos o hasta minutos y podríamos
equivocarnos, por esa razón es mejor ordenar los resultados de la tabla.
Para observar los valores con mayor frecuencia de la tabla se puede ordenar la
tabla usando la función sort de la siguiente manera:
sort(tabla, decreasing=TRUE)
0.48. MODA xci
##
## 25 22 26 37 23 28 30 35 43 19 20 21 24 29 32 33 40 45 51 55 65
## 5 3 3 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
De esta manera se ve fácilmente que la variable edad es unimodal con valor de
25 años.
xcii MEDIDAS DE TENDENCIA CENTRAL
Medidas de variabilidad
xciii
xciv MEDIDAS DE VARIABILIDAD
0.49. Rango
Para calcular el rango de una variable cuantitativa se usa la función range. Los
argumentos básicos de la función range son dos y se muestran abajo.
Ejemplo
Suponga que queremos obtener el rango para la variable precio de los aparta-
mentos.
Solución
Para obtener el rango usamos el siguiente código.
range(datos$precio)
## [1] 25 1700
Otra forma de escribir el código anterior de forma secuencial es utilizando el ope-
rador pipe %> %. Este operador se puede leer como “entonces” y permite escribir
código que cuenta una historia.
## [1] 25 1700
0.50. VARIANZA xcv
El código de arriba se puede leer así: Tome los datos, entonces seleccione
el precio, entonces calcule el rango.
De la salida anterior podemos ver que los precios de los apartamentos van desde
25 hasta 1700 millones de pesos, es decir, el rango de la variable precio es sería
igual 1700-25=1675 millones de pesos.
Ejemplo
Suponga que queremos obtener nuevamente el rango para la variable precio de
los apartamentos pero diferenciando por el estrato.
Solución
Para calcular el rango (max-min) para el precio pero diferenciando por el estrato
podemos usar el siguiente código.
datos %> %
group_by(estrato) %> %
summarise(el_rango=max(precio)-min(precio))
## # A tibble: 5 x 2
## estrato el_rango
## <int> <dbl>
## 1 2 103
## 2 3 225
## 3 4 610
## 4 5 1325
## 5 6 1560
El código anterior se puede leer así: Tome los datos, entonces agrúpelos
por estrato, entonces haga un resumen llamado el_rango que se obtiene
como el resultado de restar el mínimo de precio al máximo de precio.
De los resultados podemos ver claramente que a medida que aumenta de estra-
to el rango del precio de los apartamentos aumenta. Apartamentos de estrato
bajo tienden a tener precios similares mientras que los precios de venta para
apartamentos de estratos altos tienden a ser muy diferentes entre si.
0.50. Varianza
La varianza es otra medida de qué tanto se alejan las observaciones 𝑥𝑖 en relación
al promedio y se mide en unidades cuadradas. Existen dos formas de calcular
xcvi MEDIDAS DE VARIABILIDAD
Ejemplo
Suponga que queremos determinar cuál ubicación en la ciudad presenta mayor
varianza en los precios de los apartamentos y cuántos apartamentos hay en cada
ubicación.
Solución
Como nos interesa calcular la varianza y hacer un conteo por cada ubicación,
vamos a agrupar los datos por ubicación. Para realizar lo solicitado podemos
utilizar el siguiente código.
datos %> %
group_by(ubicacion) %> %
summarize(n=n(),
varianza=var(precio))
## # A tibble: 7 x 3
## ubicacion n varianza
## <chr> <int> <dbl>
0.50. VARIANZA xcvii
1000
500
0
ubicacion
Ejemplo
¿Puedo aplicar la función var y la función sd a marcos de datos?
Solución
La respuesta es NO. La función sd se aplica sólo a vectores mientras que la
función var de puede aplicar tanto a vectores como a marcos de datos. Al ser
aplicada a marcos de datos numéricos se obtiene una matriz en que la diagonal
representa las varianzas de las de cada una de las variables mientras que arriba
y abajo de la diagonal se encuentran las covarianzas entre pares de variables.
Por ejemplo, si aplicamos la función var al marco de datos sólo con las variables
xcviii MEDIDAS DE VARIABILIDAD
datos %> %
select(precio, mt2, avaluo) %> %
var()
𝑖=𝑛
∑ (𝑥𝑖 − 𝑥)̄ 2
𝑆 = √ 𝑖=1 ,
𝑛−1
donde 𝑥̄ representa el promedio muestral.
La desviación estándar poblacional (𝜎) para 𝑛 observaciones se define así:
𝑖=𝑛
∑𝑖=1 (𝑥𝑖 − 𝜇)2
𝜎=√ ,
𝑛
donde 𝜇 representa el promedio de la población.
Para calcular en R la desviación muestral (𝑆) de una variable cuantitativa se
usa la función sd, los argumentos básicos de la función sd son dos y se muestran
a continuación.
Ejemplo
Calcular la desviación estándar muestral (𝑆) para la variable precio de los apar-
tamentos.
Solución
Para obtener la desviación estándar muestral (𝑆) solicitada usamos el siguiente
código:
sd(x=datos$precio)
## [1] 247.6149
Ejemplo
Calcular la desviación estándar poblacional (𝜎) para el siguiente conjunto de
5 observaciones: 12, 25, 32, 15, 26.
Solución
Recordemos que las expresiones matemáticas para obtener 𝑆 y 𝜎 son muy si-
milares, la diferencia está en el denominador, para 𝑆 el denominador es 𝑛 − 1
mientras que para 𝜎 es 𝑛. Teniendo esto en cuenta podemos construir nuestra
propia función llamada Sigma que calcule la desviación poblacional. A continua-
ción el código para crear nuestra propia función.
## [1] 7.402702
Ejemplo
Calcular el 𝐶𝑉 para el vector w definido a continuación.
Solución
Vemos que el vector w tiene 6 observaciones y la tercera de ellas es un NA. Lo
correcto aquí es usar la función coef_var definida antes pero indicándole que
remueva los valores faltantes, para eso se usa el siguiente código.
coef_var(x=w, [Link]=T)
## [1] 0.9273618
Medidas de posición
0.53. Cuantiles
Para obtener cualquier cuantil (cuartiles, deciles y percentiles) se usa la función
quantile. Los argumentos básicos de la función quantile son tres y se muestran
ci
cii MEDIDAS DE POSICIÓN
a continuación.
Ejemplo
Suponga que queremos obtener el percentil 5, la mediana y el decil 8 pa la altura
del grupo de estudiantes.
Se solicita el percentil 5, la mediana que es el percentil 50 y el decil 8 que
corresponde al percentil 80, por lo tanto es necesario indicarle a la función
quantile que calcule los cuantiles para las ubicaciones 0.05, 0.5 y 0.8, el código
para obtener las tres medidas solicitadas es el siguiente.
## 5% 50% 80%
## 155.2 172.7 180.3
Medidas de correlación
cor(x, y, use="everything",
method=c("pearson", "kendall", "spearman"))
x, y: vectores cuantitativos.
use: parámetro que indica lo que se debe hacer cuando se presenten
registros NA en alguno de los vectores. Las diferentes posibilida-
des son: everything, [Link], [Link], [Link] y
[Link], el valor por defecto es everything.
method: tipo de coeficiente de correlación a calcular, por defecto es
pearson, otros valores posibles son kendall y spearman.
Ejemplo
Calcular el coeficiente de correlación de Pearson para las variables área y precio
de la base de datos sobre apartamentos usados.
Lo primero que se debe hacer es cargar la base de datos usando la url apropiada.
Luego de esto se usa la función cor sobre las variables de interés. A continuación
se muestra el código necesario.
ciii
civ MEDIDAS DE CORRELACIÓN
## [1] 0.8582585
Del resultado anterior vemos que existe una correlación de 0.8582585 entre las
dos variables, eso significa que apartamentos de mayor área tienden a tener
precios de venta más alto. Este resultado se ilustra en la Figura 3, se nota
claramente que la nube de puntos tiene un pendiente positiva y por eso el signo
del coeficiente de correlación.
A continuación el código para generar la Figura 3.
1500
Precio del apartamento (millones COP)
1000
500
Ejemplo
Para las mismas variables del ejemplo anterior calcular los coeficientes de corre-
lación Kendall y Spearman.
A continuación el código para obtener lo solicitado.
0.54. FUNCIÓN COR cv
## [1] 0.8582585
## [1] 0.6911121
## [1] 0.860306
Ejemplo
Para la base de datos de apartamentos usados, ¿cuáles de las variables cuanti-
tativas tienen mayor correlación?
Lo primero que debemos hacer es determinar cuáles son las cuantitativas de la
base de datos. Para obtener información de las variables que están almacenadas
en el marco de datos llamado datos usamos la función str que muestra la
estructura interna de objeto.
str(datos)
[Link](M)
Precio 0.8
0.6
0.86 Área
0.4
−0.4
0.75 0.77 0.16 0.55 Admon
−0.6
−1
Ejemplo
Construya dos vectores hipotéticos con el gasto y ahorro de un grupo de 7
familias, incluya dos NA. Calcule el coeficiente de correlación entre ahorro y
gasto, use el parámetro use para manejar los NA.
A continuación se presenta el código para crear los objetos ahorro y gasto con
datos ficticios. Observe que en el primer caso donde se calcula la correlación no
es posible obtener un resultado debido a que por defecto use='everything' y
por lo tanto usa todas las observaciones incluyendo los NA. En el segundo caso si
se obtiene un valor para la correlación debido a que se usó use='[Link]'.
cor(gasto, ahorro)
## [1] NA
## [1] -0.8465124
cviii MEDIDAS DE CORRELACIÓN
EJERCICIOS
Use funciones o procedimientos (varias líneas) de R para responder cada una de
las siguientes preguntas.
1. Para cada uno de los estratos socioeconómicos, calcular el coeficiente de
correlación lineal de Pearson para las variables precio y área de la base de
datos de los apartamentos usados.
2. Calcular los coeficientes de correlación Pearson, Kendall y Spearman para
las variables cuantitativas de la base de datos sobre medidas del cuerpo
explicada en el Capítulo 0.45. La url con la información es la siguiente:
[Link]
das_cuerpo
3. Represente gráficamente las matrices de correlación obtenidas en el ejerci-
cio anterior.
Distribuciones discretas
binom # Binomial
geo # Geométrica
nbinom # Binomial negativa
hyper # Hipergeométrica
pois # Poisson
multinom # Multinomial
cix
cx DISTRIBUCIONES DISCRETAS
Ejemplo binomial
Suponga que un grupo de agentes de tránsito sale a una vía principal para
revisar el estado de los buses de transporte intermunicipal. De datos históricos
se sabe que un 10 % de los buses generan una mayor cantidad de humo de la
permitida. En cada jornada los agentes revisan siempre 18 buses, asuma que el
estado de un bus es independiente del estado de los otros buses.
1) Calcular la probabilidad de que se encuentren exactamente 2 buses que
generan una mayor cantidad de humo de la permitida.
Aquí se tiene una distribucion 𝐵𝑖𝑛𝑜𝑚𝑖𝑎𝑙(𝑛 = 18, 𝑝 = 0.1) y se desea calcular
𝑃 (𝑋 = 2). Para obtener esta probabilidad se usa la siguiente instrucción.
## [1] 0.2835121
Así 𝑃 (𝑋 = 2) = 0.2835.
2) Calcular la probabilidad de que el número de buses que sobrepasan el
límite de generación de gases sea al menos 4.
En este caso interesa calcular 𝑃 (𝑋 ≥ 4), para obtener esta probabilidad se usa
la siguiente instrucción.
## [1] 0.09819684
Así 𝑃 (𝑋 ≥ 4) = 0.0982
3) Calcular la probabilidad de que tres o menos buses emitan gases por enci-
ma de lo permitido en la norma.
En este caso interesa 𝑃 (𝑋 ≤ 3) lo cual es 𝐹 (𝑥 = 3), por lo tanto, la instrucción
para obtener esta probabilidad es
## [1] 0.9018032
Así 𝑃 (𝑋 ≤ 3) = 𝐹 (𝑥 = 3) = 0.9018
4) Dibujar la función de masa de probabilidad.
Para dibujar la función de masa de probabilidad para una 𝐵𝑖𝑛𝑜𝑚𝑖𝑎𝑙(𝑛 = 18, 𝑝 =
0.1) se usa el siguiente código.
0.55. FUNCIONES DISPONIBLES PARA DISTRIBUCIONES DISCRETAS cxi
0.30
0.25
0.20
Probabilidad
0.15
0.10
0.05
0.00
0 5 10 15
## [1] 0 1 4 1 3 4 2 3 1 0 3 2 1 4 1 1 1 3 0 5 0 3 5 3 2 3 1 1 2 4 1 3 2 2 3 2 2
## [38] 3 2 3 0 2 2 2 1 1 3 1 1 1 1 1 1 1 1 3 1 2 4 4 7 2 4 0 1 2 1 1 2 3 2 1 3 1
## [75] 1 2 3 5 1 5 0 1 2 1 4 1 1 2 1 2 0 2 2 3 3 0 1 1 3 2
## m
## 0 1 2 3 4 5 7
## 0.09 0.35 0.24 0.19 0.08 0.04 0.01
A pesar de ser una muestra aleatoria de sólo 100 observaciones, se observa que
las frecuencias relativas obtenidas son muy cercanas a las mostradas en la Figura
5.
Ejemplo geométrica
En una línea de producción de bombillos se sabe que sólo el 1 % de los bombillos
son defectuosos. Una máquina automática toma un bombillo y lo prueba, si el
bombillo enciende, se siguen probando los bombillos hasta que se encuentre un
bombillo defectuoso, ahí se para la línea de producción y se toman los correctivos
necesarios para mejorar el proceso.
1) Calcular la probabilidad de que se necesiten probar 125 bombillos para
encontrar el primer bombillo defectuoso.
En la distribución geométrica, la variable 𝑋 representa el número de fracasos
antes de encontrar el único éxito, por lo tanto, en este caso el interés es calcular
𝑃 (𝑋 = 124). La instrucción para obtener esta probabiliad es la siguiente.
dgeom(x=124, prob=0.01)
## [1] 0.002875836
2) Calcular 𝑃 (𝑋 ≤ 8).
En este caso interesa 𝑃 (𝑋 ≤ 50) lo que equivale a 𝐹 (8), la instrucción para
obtener la probabilidad es la siguiente.
pgeom(q=50, prob=0.01)
## [1] 0.401044
3) Encontrar el cuantil 𝑞 tal que 𝑃 (𝑋 ≤ 𝑞) = 0.40.
0.55. FUNCIONES DISPONIBLES PARA DISTRIBUCIONES DISCRETAS cxiii
En este caso interesa encontrar el cuantil 𝑞 que cumpla la condición de que hasta
𝑞 esté el 40 % de las observaciones, por esa razón se usa la función qgeom como
se muestra a continuación.
qgeom(p=0.4, prob=0.01)
## [1] 50
Note que las funciones pxxx y qxxx están relacionadas, pxxx entrega la
probabilidad hasta el cuantil 𝑞 mientras qxxx entrega el cuantil en el que
se acumula 𝑝 probabilidad.
## [1] 0.1875
2) Calcular 𝑃 (familia tenga al menos 4 hijos).
Aquí interesa calcular 𝑃 (𝑋 ≥ 2) = 𝑃 (𝑋 = 2) + 𝑃 (𝑋 = 3) + …, como esta
probabilidad va hasta infinito, se debe usar el complemento así:
𝑃 (𝑋 ≥ 2) = 1 − [𝑃 (𝑋 = 0) + 𝑃 (𝑋 = 1)]
y para obtener la probabilidad solicitada se puede usar la función dnbinom de
la siguiente manera.
## [1] 0.5
cxiv DISTRIBUCIONES DISCRETAS
## [1] 0.5
Ejemplo hipergeométrica
Un lote de partes para ensamblar en una empresa está formado por 100 elemen-
tos del proveedor A y 200 elementos del proveedor B. Se selecciona una muestra
de 4 partes al azar sin reemplazo de las 300 para una revisión de calidad.
1) Calcular la probabilidad de que todas las 4 partes de la muestra sean del
proveedor A.
Aquí se tiene una situación que se puede modelar por medio de una distribución
hipergeométrica con 𝑚 = 100 éxitos en la población, 𝑛 = 200 fracasos en la
población y 𝑘 = 4 el tamaño de la muestra. El objetivo es calcular 𝑃 (𝑋 = 4),
para obtener esta probabilidad se usa la siguiente instrucción.
## [1] 0.01185408
2) Calcular la probabilidad de que dos o más de las partes sean del proveedor
A.
Aquí interesa 𝑃 (𝑋 ≥ 2), la instrucción para obtener esta probabilidad es.
## [1] 0.4074057
Ejemplo Poisson
En una editorial se asume que todo libro de 250 páginas tiene en promedio 50
errores.
1) Encuentre la probabilidad de que en una página cualquiera no se encuen-
tren errores.
Este es un problema de distribución Poisson con tasa promedio de éxitos dada
por:
dpois(x=0, lambda=0.2)
## [1] 0.8187308
Así 𝑃 (𝑋 = 0) = 0.8187.
Ejemplo
El cangrejo de herradura hembra se caracteriza porque su caparazón se adhieren
los machos de la misma especie, en la Figura 6 se muestra una fotografía de este
cangrejo. Los investigadores están interesado en determinar cual es el patrón
de variación del número de machos sobre cada hembra, para esto, se recolectó
una muestra de hembras a las cuales se les observó el color, la condición de la
espina, el peso en kilogramos, el ancho del caparazón en centímetros y el número
de satélites o machos sobre el caparazón, la base de datos está disponible en el
siguiente enlace17 .
1) Encontrar la distribución de probabilidad para la variable Sa que corres-
ponde al número de machos sobre el caparazón de cada hembra.
Primero se debe leer la base de datos usando la url suministrada y luego se
construye la tabla de frecuencia relativa y se almacena en el objeto t1.
t1 <- [Link](table(crab$Sa))
t1
##
## 0 1 2 3 4 5
## 0.358381503 0.092485549 0.052023121 0.109826590 0.109826590 0.086705202
## 6 7 8 9 10 11
## 0.075144509 0.023121387 0.034682081 0.017341040 0.017341040 0.005780347
17 [Link]
cxvi DISTRIBUCIONES DISCRETAS
## 12 14 15
## 0.005780347 0.005780347 0.005780347
La anterior tabla de frecuencias relativas se puede representar gráficamente
usando el siguiente código.
0.35
0.30
0.25
Proporción
0.20
0.15
0.10
0.05
0.00
0 1 2 3 4 5 6 7 8 9 10 11 12 14 15
Número de satélites
F <- ecdf(crab$Sa)
plot(F, las=1, main='')
3) Calcular 𝑃 (𝑋 ≤ 9).
Para obtener esta probabilidad se usa el objeto F que es en realidad una función,
a continuación la instrucción usada.
F(9)
## [1] 0.9595376
Así 𝑃 (𝑋 ≤ 9) = 0.9595.
4) Calcular 𝑃 (𝑋 > 4).
Para obtener esta probabilidad se usa el hecho de que 𝑃 (𝑋 > 4) = 1−𝑃 (𝑋 ≤ 4),
así la instrucción a usar es.
1 - F(4)
cxviii DISTRIBUCIONES DISCRETAS
1.0
0.8
0.6
Fn(x)
0.4
0.2
0.0
0 5 10 15
## [1] 0.2774566
Por lo tanto 𝑃 (𝑋 > 4) = 0.2775.
5) Suponga que el grupo 1 está formado por las hembras cuyo ancho de
caparazón es menor o igual al ancho mediano, el grupo 2 está formado por
las demás hembras. ¿Será 𝐹 (𝑥) diferente para los dos grupos?
Para realizar esto vamos a particionar el vector Sa en los dos grupos de acuerdo
a la nueva variable grupo creada como se muestra a continuacion.
El objeto x es una lista y para acceder a los vectores allí almacenados usamos
dos corchetes [[]], uno dentro del otro. Luego para calcular 𝐹 (𝑥) para los dos
grupos se procede así:
F1 <- ecdf(x[[1]])
F2 <- ecdf(x[[2]])
Para obtener las dos 𝐹 (𝑥) en la misma figura se usa el código siguiente.
0.56. DISTRIBUCIONES DISCRETAS GENERALES cxix
1.0
0.8
0.6
Fn(x)
0.4
0.2
Grupo 1
0.0 Grupo 2
0 5 10 15
beta # Beta
cauchy # Cauchy
chisq # Chi-cuadrada
exp # Exponencial
f # F
gamma # Gama
lnorm # log-normal
norm # normal
t # t-student
unif # Uniforme
weibull # Weibull
cxxi
cxxii DISTRIBUCIONES CONTINUAS
Ejemplo beta
Considere que una variable aleatoria 𝑋 se distribuye beta con parámetros 𝑎 = 2
y 𝑏 = 5.
1) Dibuje la densidad de la distribución.
La función dbeta sirve para obtener la altura de la curva de una distribución
beta y combinándola con la función curve se puede dibujar la densidad solici-
tada. En la Figura 10 se presenta la densidad, observe que para la combinación
de parámetros 𝑎 = 2 y 𝑏 = 5 la distribución es sesgada a la derecha.
2.5
2.0
Densidad
1.5
1.0
0.5
0.0
## [1] 0.40924
De ambas formas se obtiene que 𝑃 (0.3 ≤ 𝑋 ≤ 0.7) = 0.4092.
pnorm(q=1.45)
## [1] 0.9264707
En la Figura 11 se muestra el área sombreada correspondiente a 𝑃 (𝑍 < 1.45).
2) Calcular 𝑃 (𝑍 > −0.37).
Para calcular la probabilidad solicitada se usa nuevamente la función pnorm
evaluada en el cuantil dado. Como el evento de interés es 𝑍 > −0.37, la pro-
babilidad solicitada se obtiene como 1 - pnorm(q=-0.37), esto debido a que
por defecto las probabilidades entregadas por la función pxxx son siempre a
izquierda. A continuación el código usado.
cxxiv DISTRIBUCIONES CONTINUAS
1 - pnorm(q=-0.37)
## [1] 0.6443088
Otra forma para obtener la probabilidad solicitada sin hacer la resta es usar el
parámetro [Link] para indicar que interesa la probabilidad a la derecha
del cuantil dado, a continuación un código alternativo para obtener la misma
probabilidad.
pnorm(q=-0.37, [Link]=FALSE)
## [1] 0.6443088
pnorm(q=2.58) - pnorm(-1.56)
## [1] 0.93568
qnorm(p=0.95)
## [1] 1.644854
0.4
0.3
0.3
Density
Density
0.2
0.2
0.1
0.1
0.0
0.0
−4 −2 0 2 4 −4 −2 0 2 4
x x
0.4
0.3
0.3
Density
Density
0.2
0.2
0.1
0.1
0.0
0.0
−4 −2 0 2 4 −4 −2 0 2 4
x x
usado.
## [1] 0.3829249
2) Un tornillo con un diámetro mayor a 11 mm se puede reprocesar y recu-
perar. ¿Cuál es el porcentaje de reprocesos en la empresa?
Como se solicita una probabilidad a derecha se usa [Link]=FALSE dentro
de la función pnorm. A continuación el código usado.
## [1] 0.3085375
3) El 5 % de los tornillos más delgados no se pueden reprocesar y por lo tanto
son desperdicio. ¿Qué diámetro debe tener un tornillo para ser clasificado
como desperdicio?
Aquí interesa encontrar el cuantil tal que 𝑃 (𝐷𝑖𝑎𝑚𝑒𝑡𝑟𝑜 < 𝑞) = 0.05, por lo tanto
se usa la función qnorm. A continuación el código usado.
## [1] 6.710293
4) El 10 % de los tornillos más gruesos son considerados como sobredimensio-
nados. ¿cuál es el diámetro mínimo de un tornillo para que sea considerado
como sobredimensionado?
Aquí interesa encontrar el cuantil tal que 𝑃 (𝐷𝑖𝑎𝑚𝑒𝑡𝑟𝑜 > 𝑞) = 0.10, por lo tanto
se usa la función qnorm pero incluyendo [Link]=FALSE por ser una cola a
derecha. A continuación el código usado.
## [1] 12.5631
En la Figura 12 se muestran las áreas sombreadas para cada de las anteriores
preguntas.
0.20 0.20
0.15 0.15
Densidad
Densidad
0.10 0.10
0.05 0.05
0.00 0.00
4 6 8 10 12 14 16 4 6 8 10 12 14 16
Diámetro Diámetro
0.20 0.20
0.15 0.15
Densidad
Densidad
0.10 0.10
0.05 0.05
0.00 0.00
4 6 8 10 12 14 16 4 6 8 10 12 14 16
Diámetro Diámetro
es posible manejar ese tipo de variables por medio de unas funciones básicas de
R como se muestra en el siguiente ejemplo.
Ejemplo
En este ejemplo se retomará la base de datos crab sobre el cangrejo de herradura
hembra presentado en el capítulo anterior. La base de datos crab contiene las
siguientes variables: el color del caparazón, la condición de la espina, el peso
en kilogramos, el ancho del caparazón en centímetros y el número de satélites
o machos sobre el caparazón, la base de datos está disponible en el siguiente
cxxviii DISTRIBUCIONES CONTINUAS
enlace18 .
1) Sea 𝑋 la variable peso del cangrejo, dibuje la densidad para 𝑋.
Para obtener la densidad muestral de un vector cuantitativo se usa la función
density, y para dibujar la densidad se usa la función plot aplicada a un ob-
jeto obtenido con density, a continuación el código necesario para dibujar la
densidad.
0.15
Densidad
0.10
0.05
0.00
20 25 30 35
Peso (Kg)
F <- ecdf(crab$W)
plot(F, main='', xlab='Peso (Kg)', ylab='F(x)', cex=0.5, las=1)
1.0
0.8
0.6
F(x)
0.4
0.2
0.0
20 25 30 35
Peso (Kg)
F(28)
## [1] 0.7919075
Por lo tanto 𝑃 (𝑋 ≤ 28) = 0.7919.
4) Dibujar la función de densidad para el peso de los cangrejos hembra dife-
renciando por el color del caparazón.
Como son 4 los colores de los caparazones se deben construir 4 funciones de
densidad. Usando la función split se puede partir el vector de peso de los
cangrejos según su color. Luego se construyen las cuatro densidades usando la
función density aplicada a cada uno de los pesos, a continuación el código.
cxxx DISTRIBUCIONES CONTINUAS
Otra forma para dibujar las densidades es usar el paquete ggplot2 (Wickham
et al., 2021). En la Figura 16 se muestra el resultado obtenido de correr el
siguiente código.
ggplot(crab, aes(x=W)) +
geom_density(aes(group=Color, fill=Color), alpha=0.3) +
xlim(18, 34) + xlab("Peso (Kg)") + ylab("Densidad")
Para aprender más sobre el paquete ggplot2 se recomienda consultar este enla-
ce19 .
19 [Link]
0.58. DISTRIBUCIONES CONTINUAS GENERALES cxxxi
Color 1
0.20 Color 2
Color 3
0.15 Color 4
Densidad
0.10
0.05
0.00
20 25 30
Peso (Kg)
Figura 15: Función de densidad 𝑓(𝑥) para el peso del cangrejo diferenciando
por el color.
cxxxii DISTRIBUCIONES CONTINUAS
0.20
0.15 Color
Densidad
1
2
0.10 3
4
0.05
0.00
20 25 30
Peso (Kg)
Figura 16: Función de densidad 𝑓(𝑥) para el peso del cangrejo diferenciando
por el color y usando ggplot2.
Verosimilitud
𝑛
𝐿(𝜃|𝑥) = ∏ 𝑓(𝑥𝑖 |𝜃), (1)
𝑖=1
cxxxiii
cxxxiv VEROSIMILITUD
Ejemplo
En este ejemplo vamos a considerar la distribución binomial cuya función de
masa de probabilidad está dada por:
𝑛
𝑓(𝑥) = 𝑃 (𝑋 = 𝑥) = ( )𝑝𝑥 (1 − 𝑝)𝑛−𝑥 , 0 < 𝑝 < 1, 𝑛 ≤ 1, 2, … , 0≤𝑥≤𝑛
𝑥
## [1] -24.55231
Por lo tanto 𝑙(𝜃) = −24.55
2) Construir una función llamada ll a la cual le ingrese valores del parámetro
𝑝 de la binomial y que la función entregue el valor de log-verosimilitud.
La función solicitada tiene un cuerpo igual al usado en el numeral anterior, a
continuación el código necesario para crearla.
## [1] -25.54468
## [1] -98.45598
El valor de log-verosimilitud para 𝑝 = 0.15 fue de -25.54 mientras que para
𝑝 = 0.80 fue de -98.46.
Vamos ahora a chequear si la función ll está vectorizada y para esto usamos el
código mostrado a continuación y deberíamos obtener un vector con los valores
c(-25.54, -98.56).
ll(prob=c(0.15, 0.80))
## [1] -57.31899
No obtuvimos el resultado esperado, eso significa que nuestra función no está
vectorizada. Ese problema lo podemos solucionar así:
cxxxvi VEROSIMILITUD
ll <- Vectorize(ll)
ll(prob=c(0.15, 0.80))
## $minimum
## [1] 0.229993
##
## $objective
## [1] 23.3246
0.61. MÉTODO DE MÁXIMA VEROSIMILITUD PARA ESTIMAR PARÁMETROScxxxvii
−50
Probabilidad de éxito (p=θ)
−100
−150
−200
−250
−300
Del resultado anterior se observa que cuando 𝑝 = 0.23 el valor máximo de log-
verosimilitud es -23.32 (negativo de minusll).
Ejemplo
Suponga que la estatura de una población se puede asumir como una normal
𝑁 (170, 25). Suponga también que se genera una muestra aleatoria de 50 obser-
vaciones de la población con el objetivo de recuperar los valores de la media y
varianza poblacionales a partir de la muestra aleatoria.
La muestra se va a generar con la función rnorm pero antes se fijará una semilla
con la intención de que el lector pueda replicar el ejemplo y obtener la misma
muestra aleatoria aquí generada, el código para hacerlo es el siguiente.
ll <- function(param) {
media <- param[1] # param es el vector de parámetros
desvi <- param[2]
sum(dnorm(x=y, mean=media, sd=desvi, log=TRUE))
}
Siempre que el interés sea encontrar los valores que maximizan una función
de log-verosimilitud, los parámetros de la distribución deben ingresar a
la función ll como un vector. Esto se debe hacer para poder usar las
funciones de búsqueda optim y nlminb.
7
−150
−200
6
−250
−300
5
σ
−350
4 −400
−450
3
160 165 170 175 180
## $par
## [1] 170.338374 5.423529
##
## $objective
## [1] 155.4842
##
## $convergence
## [1] 0
##
## $iterations
## [1] 13
##
## $evaluations
## function gradient
## 16 35
##
## $message
## [1] "relative convergence (4)"
cxl VEROSIMILITUD
## mean sd
## 170.3383794 5.4235271
## ( 0.7670026) ( 0.5423527)
El objeto res contiene los resultados de usar fitdistr. En la primer línea están
los valores de los parámetros que maximizan la función de log-verosimilitud, en
la parte de abajo, dentro de paréntesis, están los errores estándar o desviaciones
de éstos estimadores.
Al objeto res es de la clase fitdistr y por lo tanto se le puede aplicar la función
genérica logLik para obtener el valor de la log-verosimilitud. Se sugiere consul-
tar la ayuda de la función logLik escribiendo en la consola help(logLik). A
0.61. MÉTODO DE MÁXIMA VEROSIMILITUD PARA ESTIMAR PARÁMETROScxli
logLik(res)
Ejemplo
Generar 𝑛 = 100 observaciones de una gamma con parámetro de forma igual a
2, parámetro de tasa igual a 0.5 y luego responder las preguntas.
1) ¿Cómo se puede generar la muestra aleatoria solicitada?
Para generar la muestra aleatoria (ma) solicitada se fijó la semilla con el objetivo
de que el lector pueda obtener los mismos resultados de este ejemplo.
n <- 100
[Link](12345)
ma <- rgamma(n=n, shape=2, rate=0.5)
## mean sd
## 4.3082767 2.8084910
## (0.2808491) (0.1985903)
3) Asumiendo que la muestra aleatoria proviene de una gamma estime los
parámetros de la distribución gamma.
## shape rate
## 2.23978235 0.51987909
## (0.29620136) (0.07702892)
En la salida anterior están los valores estimados de los parámetros de la distri-
bución por el método de máxima verosimilitud, observe la cercanía de éstos con
los verdaderos valores de 2 y 0.5 para forma y tasa respectivamente.
cxlii VEROSIMILITUD
par(mfrow=c(1, 2))
qqplot(y=ma, pch=19,
x=qnorm(ppoints(n), mean=4.3083, sd=2.8085),
main='Normal Q-Q Plot',
xlab='Theoretical Quantiles',
ylab='Sample Quantiles')
qqplot(y=ma, pch=19,
x=qgamma(ppoints(n), shape=2.23978, rate=0.51988),
main='Gamma Q-Q Plot',
xlab='Theoretical Quantiles',
ylab='Sample Quantiles')
12
10
10
Sample Quantiles
Sample Quantiles
8
8
6
6
4
4
2
2
0
0 5 10 0 5 10 15
Figura 20: Gráfico cuantil cuantil normal y gamma para la muestra simulada.
al asumir normalidad (lo cual es incorrecto), los puntos del qqplot no están
alineados, mientras que al asumir distribución gamma (lo cual es correcto), los
puntos si están alineados. De esta figura se concluye que la muestra ma puede
provenir de una 𝐺𝑎𝑚𝑚𝑎(2.23978, 0.51988).
Para obtener el gráfico cuantil cuantil bajo normalidad se puede usar di-
rectamente la función qqnorm, consultar Hernández (2018) para mayores
detalles.
Modelos anidados pueden ser comparados por medio del global deviance
(𝐺𝐷) dado por 𝐺𝐷 = −2 𝑙 ̂ y modelos no anidados por medio del Genera-
lized Akaike information criterion (𝐺𝐴𝐼𝐶) propuesto por Akaike (1983)
y dado por 𝐺𝐴𝐼𝐶 = −2 𝑙 ̂ + ♯ 𝑑𝑓 siendo ♯ el valor de penalidad por cada
parámetro adicional en el modelo; cuando ♯ = 2, el 𝐺𝐴𝐼𝐶 coincide con
el 𝐴𝐼𝐶 y el Schwarz Bayesian criterion (𝑆𝐵𝐶) propuesto por Schwarz
(1978) se dá cuando el valor de penalidad es ♯ = log(𝑛) donde 𝑛 es el
número de observaciones del modelo; siempre el modelo elegido es aquel
modelo con el menor valor de cualquiera de los criterios de información
anteriores.
cxliv VEROSIMILITUD
𝜕
𝑆(𝜃) ≡ 𝑙(𝜃)
𝜕𝜃
𝑆(𝜃) = 0
𝜕2
𝐼(𝜃) ≡ − 𝑙(𝜃)
𝜕𝜃2
Una curvatura grande 𝐼(𝜃)̂ está asociada con un gran pico en la función de
log-verosimilitud y eso significa una menor incertidumbre sobre el parámetro 𝜃
(Pawitan, 2013). En particular la varianza del estimador de máxima verosimili-
tud está dada por
𝑉 𝑎𝑟(𝜃)̂ = 𝐼 −1 (𝜃)̂
Ejemplo
Suponga que se desea estudiar una variable que tiene distribución Poisson con
parámetro 𝜆 desconocido. Suponga además que se tienen dos situciones:
Un solo valor 5 para estimar 𝜆.
Cuatro valores 5, 10, 6 y 15 para estimar 𝜆.
Dibujar la función 𝑙(𝜆) para ambos casos e identificar la curvatura.
A continuación el código para evaluar la función 𝑙(𝜆) para cada caso.
# Caso 1
w <- c(5)
ll1 <- function(lambda) sum(dpois(x=w, lambda=lambda, log=T))
ll1 <- Vectorize(ll1)
0.63. MÉTODO DE MÁXIMA VEROSIMILITUD PARA ESTIMAR PARÁMETROS EN MODELOS DE REGRESI
# Caso 2
y <- c(5, 10, 6, 15)
ll2 <- function(lambda) sum(dpois(x=y, lambda=lambda, log=T))
ll2 <- Vectorize(ll2)
En la Figura 21 se muestran las dos curvas 𝑙(𝜆) para cada uno de los casos. De
la figura se observa claramente que cuando se tienen 4 observaciones la curva
es más puntiaguda y por lo tanto menor incertibumbre sobre el parámetro 𝜆 a
estimar.
0
Con 5
Con 5, 10, 6 y 15
−5
l(λ)
−10
−15
−20
0 5 10 15 20 25
Ejemplo
Considere el modelo de regresión mostrado abajo. Simule 1000 observaciones del
modelo y use la función optim para estimar los parámetros del modelo.
𝑦𝑖 ∼ 𝑁 (𝜇𝑖 , 𝜎2 ),
𝜇𝑖 = −2 + 3𝑥1 ,
𝜎 = 5,
𝑥1 ∼ 𝑈 (−5, 6).
n <- 1000
x1 <- runif(n=n, min=-5, max=6)
y <- rnorm(n=n, mean=-2 + 3 * x1, sd=5)
Ahora vamos a usar la función optim para encontrar los valores que maximizan la
función de log-verosimilitud, el código para hacer eso se muestra a continuación.
En el parámetro par se coloca un vector de posibles valores de 𝜃 para iniciar la
búsqueda, en fn se coloca la función de interés, en lower y upper se colocan
vectores que indican los límites de búsqueda de cada parámetro, los 𝛽𝑘 pueden
variar entre −∞ y ∞ mientras que el parámetro 𝜎 toma valores en el intervalo
(0, ∞). Como la función minusll tiene argumentos adicionales y e x1, estos
pasan a la función optim al final como se muestra en el código.
res1
## $par
## [1] -1.904603 3.079600 5.014184
##
## $value
## [1] 3031.209
##
## $counts
## function gradient
## 19 19
##
## $convergence
## [1] 0
##
## $message
## [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
De la salida anterior se observa que el vector de parámetros estimado es 𝛽0̂ =
−1.9046025, 𝛽1̂ = 3.0796 y 𝜎̂ = 5.0141842, se observa también que el valor de
la máxima log-verosimilitud fue de -3031.2092104. Vemos entonces que el vector
estimado está muy cerca del verdadero 𝜃 = (𝛽0 = −2, 𝛽1 = 3, 𝜎 = 5)⊤ .
## $par
## [1] -1.904609 3.079598 1.612271
##
## $value
## [1] 3031.209
##
## $counts
## function gradient
## 21 21
##
## $convergence
## [1] 0
##
## $message
## [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
De la salida anterior se observa que el vector de parámetros estimado es 𝛽0̂ =
−1.9046094, 𝛽1̂ = 3.0795984 y 𝜎̂ = exp(1.6122706) = 5.0141834, se observa
también que el valor de la máxima log-verosimilitud fue de -3031.2092104. Vemos
entonces que el vector estimado está muy cerca del verdadero 𝜃 = (𝛽0 = −2, 𝛽1 =
3, 𝜎 = 5)⊤ .
EJERCICIOS
1) Al inicio del Capítulo 0.45 se presentó la base de datos sobre medidas
del cuerpo, consulte la explicación sobre la base de datos y responda lo
siguiente.
Si se asume que la edad tiene distribución normal, ¿cuáles son los estima-
dores de máxima verosimilitud para 𝜇 y 𝜎?
Como el histograma para la edad muestra un sesgo a la derecha se podría
pensar que la distribución gamma sería una buena candidata para explicar
las edades observadas. Asumiendo una distribución gamma, ¿cuáles son
los estimadores de máxima verosimilitud para los parámetros?
¿Cuál de los dos modelos es más apropiado para explicar la variable de
interés? Calcule el 𝐴𝐼𝐶 para decidir.
0.63. MÉTODO DE MÁXIMA VEROSIMILITUD PARA ESTIMAR PARÁMETROS EN MODELOS DE REGRESI
𝑦𝑖 ∼ 𝐺𝑎𝑚𝑚𝑎(𝑠ℎ𝑎𝑝𝑒𝑖 , 𝑠𝑐𝑎𝑙𝑒𝑖 ),
log(𝑠ℎ𝑎𝑝𝑒𝑖 ) = 3 − 7𝑥1 ,
log(𝑠𝑐𝑎𝑙𝑒𝑖 ) = 3 − 1𝑥2 ,
𝑥1 ∼ 𝑈 (0, 1),
𝑥2 ∼ 𝑃 𝑜𝑖𝑠𝑠𝑜𝑛(𝜆 = 3)