Jhon Sebastian Vargas Fernandez
Ing. Quimica
Carlos Daniel Albarracin Cruz
Ing. Sistemas
Juan Sebastian Parra Cardenas
Ing. Electrica
Juan Diego Blanco Segura
Ing. Quimica
Santiago Cubides
Ing. Sistemas
library(ggplot2)
library(dplyr)
library(flextable)
library(nortest)

Introducción

La rama de la estadítica que utiliza técnicas para estimar parametros que caracetrizan una distribución se conoce com estadística inferencial.

En este curso se van a estudiar dos técnicas:

  1. Intervalos de confianza.
  2. Prueba de hipótesis

En esta parte se muestran las funciones que hay disponibles en R para construir intervalos de confianza para:

  1. la media \(\ μ\) de una población normal,
  2. la proporción \(p\),
  3. la varianza \(\ σ^2\) de una población normal,
  4. la diferencia de medias \(\ μ_1− \ μ_2\) de dos poblaciones normales independientes,
  5. la diferencia de proporciones \(p_1−p_2\), de poblaciones normales.

Para ilustrar el uso de las funciones se utilizará la base de datos medidas del cuerpo.

Función t.test

La función t.test se usa para calcular intervalos de confianza para la media y para diferencia de medias, con muestras independientes.

Intervalo de confianza bilateral para la media \(\small \mu\)

Para calcular intervalos de confianza bilaterales para la media a partir de la función t.test es necesario definir 2 argumentos:

  • x: vector numérico con los datos.
  • conf.level: nivel de confianza a usar, por defecto es 0.95.

Los demás argumentos se usan cuando se desea obtener intervalos de confianza para diferencia de media con muestras independientes y dependientes (o pareadas).

Ejemplo

Suponga que se quiere obtener un intervalo de confianza bilateral del 90% para la altura promedio de los hombres de la base de datos medidas del cuerpo.

A continuación un conjunto de medidas corporales tomadas a un grupo de estudiantes en una universidad de Medellín. A continuación la variables de la base de datos: edad: edad del estudiante en años peso: peso del estudiante en kilogramos altura: estatura del estudiante en centímetros sexo: género del estudiante muneca: diametro de la muñeca derecha en centímetros biceps: diametro del biceps derecho en centímetros

Solución

Para calcular el intervalo de confianza, primero se carga la base de datos usando la url apropiada, luego se crea un subconjunto de datos y se aloja en el objeto hombres como sigue a continuación:

url <- "https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo"
datos <- read.table(file = url, header = TRUE)

head(datos, 10)
##    edad peso altura   sexo muneca biceps
## 1    43 87.3  188.0 Hombre   12.2   35.8
## 2    65 80.0  174.0 Hombre   12.0   35.0
## 3    45 82.3  176.5 Hombre   11.2   38.5
## 4    37 73.6  180.3 Hombre   11.2   32.2
## 5    55 74.1  167.6 Hombre   11.8   32.9
## 6    33 85.9  188.0 Hombre   12.4   38.5
## 7    25 73.2  180.3 Hombre   10.6   38.3
## 8    35 76.3  167.6 Hombre   11.3   35.0
## 9    28 65.9  183.0 Hombre   10.2   32.1
## 10   26 90.9  183.0 Hombre   12.0   40.4
### Filtrar hombres

hombres <- datos %>% filter(sexo == "Hombre")
head(hombres, 5)
##   edad peso altura   sexo muneca biceps
## 1   43 87.3  188.0 Hombre   12.2   35.8
## 2   65 80.0  174.0 Hombre   12.0   35.0
## 3   45 82.3  176.5 Hombre   11.2   38.5
## 4   37 73.6  180.3 Hombre   11.2   32.2
## 5   55 74.1  167.6 Hombre   11.8   32.9
pruebas <- c(
lillie  = lillie.test(hombres$altura)$p.value,
cvm     = cvm.test(hombres$altura)$p.value,
pearson = pearson.test(hombres$altura)$p.value,
ad      = ad.test(hombres$altura)$p.value,
sf      = sf.test(hombres$altura)$p.value
)

pruebas
##    lillie       cvm   pearson        ad        sf 
## 0.3839829 0.2303828 0.6949630 0.2659667 0.3764676
cat("\nConclusión: No se rechaza la normalidad de las alturas de los hombres (p-values > 0.05).\n")
## 
## Conclusión: No se rechaza la normalidad de las alturas de los hombres (p-values > 0.05).

Una vez chequeado el supuesto de normalidad se puede usar la función t.test sobre la variable de interés para construir el intervalo de confianza. El resultado de usar t.test es una lista, uno de los elementos de esa lista es justamente el intevalo de confianza y para extraerlo es que se usa $conf.int al final de la instrucción. A continuación se muestra el código utilizado.

res <- t.test(x = hombres$altura, conf.level = 0.90)$conf.int
cat("El intervalo de confianza del 90% para μ es:", res)
## El intervalo de confianza del 90% para μ es: 176.4384 181.7172

Intervalo de confianza bilateral para la diferencia de medias (\(μ_1−μ_2\)) de muestras independientes

Para construir intervalos de confianza bilaterales para la diferencia de medias (μ1−μ2)de muestras independientes se usa la función t.test y es necesario definir 5 argumentos:

x: vector numérico con la información de la muestra 1.

y: vector numérico con la información de la muestra 2.

paired=FALSE: indica que el intervalo de confianza se hará para muestras independientes.

var.equal=FALSE: indica que las varianzas son desconocidas y diferentes, si la varianzas se pueden considerar desconocidas e iguales se coloca var.equal=TRUE.

conf.level: nivel de confianza.

Ejemplo

Se quiere saber si existe diferencia estadísticamente significativa entre las alturas de los hombres y las mujeres.

Para responder esto se va a construir un intervalo de confianza del 95% para la diferencia de las altura promedio de los hombres y de las mujeres \(\mu_{hombres}−\mu_{mujeres}\)

Solución

Para construir el intervalo de confianza, primero se carga la base de datos usando la url apropiada, luego se crean dos subconjuntos de datos y se alojan en los objetos hombres y mujeres como sigue a continuación:

mujeres <- datos %>% filter(sexo == "Mujer")

# Normalidad en ambas muestras

lillie.test(hombres$altura)$p.value
## [1] 0.3839829
lillie.test(mujeres$altura)$p.value
## [1] 0.51194
# IC para la diferencia de medias

res1 <- t.test(
x = hombres$altura,
y = mujeres$altura,
paired = FALSE,
var.equal = FALSE,
conf.level = 0.95
)$conf.int

cat("El IC del 95% para la diferencia de medias (hombres - mujeres) es:", res1)
## El IC del 95% para la diferencia de medias (hombres - mujeres) es: 10.05574 20.03315

Función var.test

Esta funcion requiere de 2 muestras, pero no se puede, por eso se usa el paquete stests.

Para construir intervalos de confianza para la varianza se puede usar la función var.test del paquete básico stats o la función var.test del paquete stests (Hernandez et al. 2024) disponible en este repositorio. En la siguiente nota se aclara la diferencia entre estas dos funciones.

if (!require('devtools')) install.packages('devtools')

devtools::install_github('fhernanb/stests', force=TRUE)
## 
## ── R CMD build ─────────────────────────────────────────────────────────────────
##       ✔  checking for file 'C:\Users\123se\AppData\Local\Temp\Rtmp6JubUL\remotesabc63dc6be7\fhernanb-stests-b25bf7e/DESCRIPTION' (336ms)
##       ─  preparing 'stests': (551ms)
##    checking DESCRIPTION meta-information ...     checking DESCRIPTION meta-information ...   ✔  checking DESCRIPTION meta-information
##       ─  checking for LF line-endings in source and make files and shell scripts
##   ─  checking for empty or unneeded directories
##    Omitted 'LazyData' from DESCRIPTION
##       ─  building 'stests_0.1.0.tar.gz' (434ms)
##      
## 
library(stests)

Intervalo de confianza bilateral para la varianza \(σ^2\)

Ejemplo

Considerando la información del ejemplo de intervalos de confianza bilaterales para la media, construir un intervalo de confianza del 98% para la varianza de la altura de los estudiantes hombres.

Solución

Siempre que se quiera hacer inferencia sobre la varianza poblacional, \(\small \sigma^2\) se debe probar la noramalidad de los datos.

# Para cargar el paquete
res2 <- stests::var.test(x = hombres$altura, conf.level = 0.90)$conf.int

cat("Un intervalo de confianza del 90% para la varianza poblacional cae entre:",res2)
## Un intervalo de confianza del 90% para la varianza poblacional cae entre: 25.53407 81.23046

Intervalo de confianza bilateral para la razón de varianzas \(\frac{\sigma_1^2}{\sigma_2^2}\)

Para calcular intervalos de confianza bilaterales para la razón de varianzas a partir de la función var.test es necesario definir 3 argumentos:

  • x: vector numérico con la información de la muestra 1,

  • y: vector numérico con la información de la muestra 2,

  • conf.level: nivel de confianza.

Ejemplo

Usando la información del ejemplo de diferencia de medias para muestras independientes se quiere obtener un intervalo de confianza del
95% para la razón de las varianzas de las alturas de los estudiantes hombres y mujeres.

Solución

resp1 <- stests::var.test(x=hombres$altura, y=mujeres$altura, conf.level=0.95)$conf.int

resp1
## [1] 0.2327398 1.6632830
## attr(,"conf.level")
## [1] 0.95

Así, el intervalo de confianza del 95% indica que la razón de varianzas se encuentra entre 0.2327 y 1.6633. Puesto que el intervalo de confianza incluye el 1, se concluye que las varianzas de las alturas de los hombres y las mujeres son iguales.

Función prop.test

La función prop.test se usa para calcular intervalos de confianza para la porporción y diferencia de proporciones.

Intervalo de confianza bilateral para la proporción \(p\)

Ejemplo

El gerente de una estación de televisión debe determinar en la ciudad qué porcentaje de casas tienen más de dos televisores. Una muestra aleatoria de 500 casas revela que 275 tienen dos o más televisores. ¿Cuál es el intervalo de confianza del 90% para estimar la proporción de todas las casas que tienen dos o más televisores?

Solución

resp2 <- prop.test(x = 275, n = 500, conf.level=0.90)$conf.int

resp2
## [1] 0.5122310 0.5872162
## attr(,"conf.level")
## [1] 0.9

A partir del resultado obtenido se puede concluir, con un nivel de confianza del
90%, que la proporción \(p\)de casas que tienen dos o más televisores se encuentra entre 0.5122 y 0.5872.

Intervalo de confianza bilateral para la diferencia de proporciones \(p_1−p_2\)

Ejemplo

Se quiere determinar si un cambio en el método de fabricación de una piezas ha sido efectivo o no. Para esta comparación se tomaron 2 muestras, una antes y otra después del cambio en el proceso y los resultados obtenidos son los siguientes.

library(flextable)

tabla2 <- data.frame(Num_piezas=c("Defectuosas", "Analizadas"), Antes=c(75,1500), 
                     Después=c(80,2000))
flextable(tabla2)

Num_piezas

Antes

Después

Defectuosas

75

80

Analizadas

1,500

2,000

Construir un intervalo de confianza del 90% para decidir si el cambio tuvo efecto positivo o no.

resp3 <- prop.test(x=c(75, 80), n=c(1500, 2000), conf.level=0.90)$conf.int

Otra muestra, Nuevo dataset

set.seed(123)

personas2 <- data.frame(
  sexo    = sample(c("Hombre", "Mujer"), size = 60, replace = TRUE),
  altura  = rnorm(60, mean = 165, sd = 10),
  peso    = rnorm(60, mean = 70, sd = 12),
  edad    = sample(18:60, 60, replace = TRUE)
)

head(personas2)
##     sexo   altura     peso edad
## 1 Hombre 169.2646 81.92205   43
## 2 Hombre 162.0493 76.58076   59
## 3 Hombre 173.9513 72.86478   34
## 4  Mujer 173.7813 62.46513   46
## 5 Hombre 173.2158 86.32783   43
## 6  Mujer 171.8864 62.79688   44

Filtrar hombres y mujeres

hombres2 <- personas2[personas2$sexo == "Hombre", ]
mujeres2 <- personas2[personas2$sexo == "Mujer", ]

¨

Pruebas de normalidad para alturas de hombres

pruebas2 <- c(
  lillie  = lillie.test(hombres2$altura)$p.value,
  cvm     = cvm.test(hombres2$altura)$p.value,
  pearson = pearson.test(hombres2$altura)$p.value,
  ad      = ad.test(hombres2$altura)$p.value,
  sf      = sf.test(hombres2$altura)$p.value
)

pruebas2
##    lillie       cvm   pearson        ad        sf 
## 0.5124502 0.2907391 0.4231901 0.3200617 0.2690742
if (all(pruebas2 > 0.05)) {
  cat("✔ Las alturas de hombres parecen normales (todas las p > 0.05)\n")
} else {
  cat("✘ Alguna prueba sugiere no normalidad (alguna p ≤ 0.05)\n")
}
## ✔ Las alturas de hombres parecen normales (todas las p > 0.05)

Intervalo de confianza del 90% para la media de altura de las mujeres

res_m <- t.test(x = mujeres2$altura, conf.level = 0.90)$conf.int
cat("IC del 90% para la media de altura de mujeres:", res_m)
## IC del 90% para la media de altura de mujeres: 160.5905 167.7101

IC 95% para la diferencia de medias (hombres – mujeres)

res_comp <- t.test(
  x = hombres2$altura,
  y = mujeres2$altura,
  paired = FALSE,
  var.equal = FALSE,
  conf.level = 0.95
)$conf.int

cat("IC del 95% para la diferencia de medias:", res_comp)
## IC del 95% para la diferencia de medias: -1.724705 7.93625

IC del 98% para la varianza de altura en las mujeres

res_var <- stests::var.test(x = mujeres2$altura, conf.level = 0.98)$conf.int
cat("IC del 98% para la varianza:", res_var)
## IC del 98% para la varianza: 57.19213 233.5676