En un estudio sobre contaminación, se ha medido la concentración de un compuesto químico en el agua de una quebrada en dos momentos diferentes. Se ha obtenido una muestra de 10 observaciones en cada uno de los dos momentos.
Los datos son los siguientes:
concentracion1 <- c(0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4)
concentracion2 <- c(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5)
Se desea saber si la concentración del compuesto ha aumentado significativamente entre los dos momentos.
PREGUNTA 1. ¿Cuál procedimiento estadístico puede usar para conocer si ocurrió un aumento significativo entre los dos momentos, o si la diferencia está dentro de la variación al azar entre las muestras?
PREGUNTA 2. Plantear una hipótesis nula y al menos una alterna.
# concentraciones obtenidas en los dos momentos
todas_conc <- c(concentracion1, concentracion2)
# Diferencia observada entre los dos grupos
dif_observada <- mean(todas_conc[11:20]) - mean(todas_conc[1:10])
cat("Diferencia observada:", dif_observada, "\n")
## Diferencia observada: 0.1
PREGUNTA 3. ¿Por qué se resta concentración 2 menos concentración 1, y no al contrario?
# Número de permutaciones para la prueba de aleatorización
n_permuta <- 10000
# Realizar permutaciones y calcular la diferencia entre los grupos
results <- replicate(n_permuta, {
shuffled <- sample(todas_conc)
mean(shuffled[11:20]) - mean(shuffled[1:10])
})
PREGUNTA 4. ¿Cuántos valores tiene el objeto
results
?
# Calcular el valor-p
p_valor <- sum(results >= dif_observada) / n_permuta
p_valor
## [1] 0.2451
PREGUNTA 5. ¿Cuál es el valor-p máximo que se acepta generalmente para concluir que es seguro rechazar la hipótesis nula?
Gráficamente, la distribución de las diferencias de medias con la permutación es la siguiente:
library(ggplot2)
ggplot(data.frame(results = results), aes(x = results)) +
geom_histogram(binwidth = 0.05, fill = "lightblue", color = "black") +
geom_vline(xintercept = dif_observada, color = "red", linetype = "dashed") +
labs(x = "Diferencia en Medias", y = "Frecuencia")
# Imprimir resultados
cat("Diferencia observada:", dif_observada, "\n")
## Diferencia observada: 0.1
cat("P-value:", p_valor, "\n")
## P-value: 0.2451
PREGUNTA 6. Disminuya el ancho de los “bins”, cambie el color de relleno de las barras, cambie la línea roja entrecortada a una continua.
PREGUNTA 7. Escriba una leyenda descriptiva de la gráfica (Figura 1. Histograma de …)
PREGUNTA 8. Interprete los resultados y concluya sobre si hay o no diferencias en la concentración del contaminante entre los dos momentos de medición.
Queremos conocer si hubo diferencias entre la distribución de las frecuencias de valores de medidas de ozono (ppm) de los meses de mayo a junio y los meses de julio a septiembre de 1973, en la ciudad de Nueva York.
Utilizarán datos del paquete datasets
de R. En
particular, utilizarán el conjunto de datos airquality
, el
cual contiene la variable de interés: Ozone.
library(datasets)
data(airquality)
head(airquality)
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
PREGUNTA 1. ¿Cuál es el uso del comando
head
?
Como queremos comparar las distribuciones de la variable en dos periodos de tiempo (mayo-junio y julio-septiembre), deberán extraer los datos para cada periodo, utilizando la variable “Month” como clasificador.
# Datos de ozono para mayo-junio
ozono_may_jun <- airquality$Ozone[airquality$Month %in% c(5, 6)]
# Datos de ozono para julio-septiembre
ozono_jul_sep <- airquality$Ozone[airquality$Month %in% c(7, 8, 9)]
PREGUNTA 2. Calcular la media de la concentración de ozono en cada período
Para estimar el intervalo de confianza para la media de la variable
Ozone
en los dos períodos, se utilizará la técnica de
“bootstrapping”. En este caso, se realizarán 10000 remuestreos con
reemplazo de los datos originales y se calculará la media de la variable
Ozone
en cada remuestreo.
library(boot)
# bootstrapping para mayo-junio
boot_may_jun <- boot(ozono_may_jun, statistic = function(data, indices) {
return(mean(data[indices], na.rm = TRUE))
}, R = 10000)
# bootstrapping para julio-septiembre
boot_jul_sep <- boot(ozono_jul_sep, statistic = function(data, indices) {
return(mean(data[indices], na.rm = TRUE))
}, R = 10000)
# Calcular el intervalo de confianza de cada período
boot_ci_may_jun <- boot.ci(boot_may_jun, type = "basic")
boot_ci_jul_sep <- boot.ci(boot_jul_sep, type = "basic")
# print results in a table
boot_ci_may_jun$basic[4:5]
## [1] 17.47102 31.25881
boot_ci_jul_sep$basic[4:5]
## [1] 41.74784 56.78224
PREGUNTA 3. Elaborar una tabla con las siguientes columnas: “Periodo”, “Límite Inferior CI”, “Media”, “Límite Superior CI”. La tabla debe llevar su leyenda descriptiva en la parte superior (Tabla 1. Intervalo de confianza para ….)
Visualizar los intervalos de confianza de las medias de ozono en los dos periodos, utilizando un gráfico de caja para cada período, e indicando la media con un punto rojo.
Primero, se creará un data frame con los datos separados por periodo de acuerdo a una variable “periodo”.
# Crear un data frame con los datos separados por periodo
library(tidyr)
library(dplyr)
ozono_df <- bind_rows(
data.frame(
periodo = "Mayo-Junio",
ozono = ozono_may_jun
),
data.frame(
periodo = "Julio-Septiembre",
ozono = ozono_jul_sep
)
) %>%
drop_na() # tidyr's way to remove NA values
PREGUNTA 4. El ‘data frame’
ozono_df
¿cuántas columnas (variables) tiene y de que tipo
son?
Ahora vamos a crear un gráfico de caja para visualizar los intervalos de confianza de las medias de ozono en los dos periodos.
library(ggplot2)
# Extract confidence intervals from boot.ci objects
ci_may_jun <- boot_ci_may_jun$basic[4:5] # This gets the lower and upper bounds
ci_jul_sep <- boot_ci_jul_sep$basic[4:5]
# Create a data frame with the confidence intervals
ci_df <- data.frame(
periodo = c("Mayo-Junio", "Julio-Septiembre"),
lower = c(ci_may_jun[1], ci_jul_sep[1]),
upper = c(ci_may_jun[2], ci_jul_sep[2])
)
ggplot(ozono_df, aes(x = factor(periodo, levels = c("Mayo-Junio", "Julio-Septiembre")), y = ozono)) +
geom_boxplot(fill = "lightblue", alpha = 0.5) +
stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "red") +
geom_errorbar(data = ci_df,
aes(y = (lower + upper)/2, ymin = lower, ymax = upper),
width = 0.3, # made slightly wider
color = "darkred",
linewidth = 1.2, # made slightly thicker
alpha = 0.8) +
labs(
x = "Periodo",
y = "Concentración de ozono") +
theme_bw() # optional: uses a different theme
PREGUNTA 4. Elaborar una leyenda descriptiva para la gráfica (Figura 2. Gráfico de caja …). Las líneas horizontales rojas representan los intervalos de confianza en cada periodo.
PREGUNTA 5. Explique por qué el intervalo de confianza es mucho menor que la dispersión de los datos en el gráfico de caja.
PREGUNTA 6. Interprete los resultados y concluya sobre si hay o no diferencias en la concentración de ozono entre los dos periodos.
PREGUNTA 7. Si encontró diferencias entre los dos períodos, indique alguna causa de esa diferencia en la concentración de ozono en la ciudad
En una población de 487 semillas de la especie Thespesia populnea, la longitud ápice-base de las semillas tiene una 𝜇 = 10.15 mm y una 𝜎 = 1.60 mm. Asumiendo una distribución normal de los datos, complete lo que se pide a continuación (debe presentar los códigos utilizados en cada caso, excepto el de la gráfica):
PREGUNTA 1. ¿Cuántas semillas tienen una longitud mayor de 11 mm?
PREGUNTA 2. ¿Cuál es la probabilidad de que una semilla seleccionada al azar tenga una longitud mayor de 11 mm?
PREGUNTA 3. Construya una gráfica de la
distribución normal de los datos, sombreando el área por debajo de 11
mm. Nota: ver el código en el archivo dist-normal.Rmd
para la gráfica de la distribución normal.
PREGUNTA 4. ¿Cuál es la probabilidad de que una semilla seleccionada al azar tenga una longitud entre 9 y 11 mm?
PREGUNTA 5. De la población queremos extraer las 100 semillas más grandes. ¿Cuál es el tamaño menor aceptable de semilla para seleccionar las 100 más grandes?