library(dplyr)
library(readr)
library(knitr)
library(ggplot2)
El presente informe detalla la aplicación de diversas pruebas de hipótesis estadísticas utilizando el lenguaje de programación R en el entorno RStudio. El análisis se basa en el conjunto de datos “Smokers Health Data” , el cual contiene información clínica y fisiológica de individuos adultos, clasificados como fumadores y no fumadores. Este conjunto de datos es una fuente valiosa para investigar los efectos del tabaquismo sobre variables como la frecuencia cardíaca y los niveles de colesterol.
El objetivo principal es aplicar y explicar seis pruebas de hipótesis específicas, tal como se describen en el documento ‘Prueba Hipótesis.pdf’. Para cada prueba, se proporcionarán los comandos de R necesarios, una explicación detallada de su uso e interpretación de los resultados. Adicionalmente, se abordarán los conceptos estadísticos fundamentales subyacentes a las pruebas de hipótesis y se describirá el manejo de los datos en RStudio para llevar a cabo dichos análisis. Este informe se publica en RPubs, ofreciendo una guía clara y reproducible.
Las pruebas de hipótesis son una herramienta esencial en la inferencia estadística que permite tomar decisiones sobre una población basándose en la evidencia muestral. A continuación, se definen los componentes clave:
Pasos Generales de una Prueba de Hipótesis :
1. Formular la hipótesis nula (\(H_0\)) y la hipótesis alternativa (\(H_1\)).
2. Elegir un nivel de significancia (\(\alpha\)).
4. Determinar el valor p asociado con el estadístico de prueba.
5. Tomar una decisión: Si p < \(\alpha\), rechazar \(H_0\). Si p \(\geq \alpha\), no rechazar \(H_0\).
6. Interpretar la decisión en el contexto del problema.
dplyr: Para la manipulación de datos, como la creación
de nuevas variables.readr (o read.csv de R base): Para la
importación de archivos CSV.knitr: Para la creación de tablas bien formateadas en
el informe.# Cargar paquetes necesarios
library(dplyr)
library(readr) # Para read_csv(), alternativamente se puede usar read.csv() de R base
library(knitr) # Para tablas formateadas con kable()
El conjunto de datos smoking_health_data_final.csv se importa a
# Importar los datos
# Se asume que el archivo.csv está en el directorio de trabajo o se proporciona la ruta completa.
datos <- read.csv("smoking_health_data_final.csv")
# Para visualizar el dataset en una nueva pestaña en RStudio (opcional)
View(datos)
##3.3. Inspección Inicial de los Datos
Una vez importados los datos, es crucial realizar una inspección inicial para comprender su estructura y contenido.
# Primeras 6 filas del data frame
kable(head(datos), caption = "Primeras 6 Filas del Conjunto de Datos")
| age | sex | current_smoker | heart_rate | blood_pressure | cigs_per_day | chol |
|---|---|---|---|---|---|---|
| 54 | male | yes | 95 | 110/72 | NA | 219 |
| 45 | male | yes | 64 | 121/72 | NA | 248 |
| 58 | male | yes | 81 | 127.5/76 | NA | 235 |
| 42 | male | yes | 90 | 122.5/80 | NA | 225 |
| 42 | male | yes | 62 | 119/80 | NA | 226 |
| 57 | male | yes | 62 | 107.5/72.5 | NA | 223 |
# Últimas 6 filas del data frame
kable(tail(datos), caption = "Últimas 6 Filas del Conjunto de Datos")
| age | sex | current_smoker | heart_rate | blood_pressure | cigs_per_day | chol | |
|---|---|---|---|---|---|---|---|
| 3895 | 46 | male | yes | 70 | 121/82 | 60 | 285 |
| 3896 | 37 | male | yes | 88 | 122.5/82.5 | 60 | 254 |
| 3897 | 49 | male | yes | 70 | 123/75 | 60 | 213 |
| 3898 | 56 | male | yes | 70 | 125/79 | 60 | 246 |
| 3899 | 50 | male | yes | 85 | 134/95 | 60 | 340 |
| 3900 | 40 | male | yes | 98 | 132/86 | 70 | 210 |
# Estructura del data frame
str(datos) # La salida de str() es extensa, se presentará un resumen interpretado.
## 'data.frame': 3900 obs. of 7 variables:
## $ age : int 54 45 58 42 42 57 43 42 37 49 ...
## $ sex : chr "male" "male" "male" "male" ...
## $ current_smoker: chr "yes" "yes" "yes" "yes" ...
## $ heart_rate : int 95 64 81 90 62 62 75 66 65 93 ...
## $ blood_pressure: chr "110/72" "121/72" "127.5/76" "122.5/80" ...
## $ cigs_per_day : int NA NA NA NA NA NA NA NA NA NA ...
## $ chol : int 219 248 235 225 226 223 222 196 188 256 ...
# La función str() muestra que 'age', 'heart_rate', y 'chol' son numéricos (int o num).
# 'sex' y 'current_smoker' son caracteres (chr). 'blood_pressure' también es chr.
# Se debe asegurar que las variables usadas en cálculos sean del tipo correcto.
# Por ejemplo, 'current_smoker' será convertida a factor para algunas pruebas y resúmenes.
La inspección mediante str(datos) revela los tipos de datos de cada columna. Es fundamental que las variables numéricas como age, heart_rate, y chol sean reconocidas como numéricas). Variables categóricas como sex y current_smoker se leen inicialmente como character. Para análisis estadísticos, especialmente aquellos que involucran agrupaciones, es a menudo beneficioso convertir variables de caracteres que representan categorías en factores. La variable blood_pressure se lee como carácter debido a su formato (ej. “110/72”) y no se utilizará directamente en las pruebas de hipótesis.
# Resumen estadístico de cada columna
summary(datos) # La salida de summary() es extensa, se presentará un resumen interpretado.
## age sex current_smoker heart_rate
## Min. :32.00 Length:3900 Length:3900 Min. : 44.00
## 1st Qu.:42.00 Class :character Class :character 1st Qu.: 68.00
## Median :49.00 Mode :character Mode :character Median : 75.00
## Mean :49.54 Mean : 75.69
## 3rd Qu.:56.00 3rd Qu.: 82.00
## Max. :70.00 Max. :143.00
##
## blood_pressure cigs_per_day chol
## Length:3900 Min. : 0.000 Min. :113.0
## Class :character 1st Qu.: 0.000 1st Qu.:206.0
## Mode :character Median : 0.000 Median :234.0
## Mean : 9.169 Mean :236.6
## 3rd Qu.:20.000 3rd Qu.:263.0
## Max. :70.000 Max. :696.0
## NA's :14 NA's :7
# Esta función proporciona estadísticas descriptivas como media, mediana, cuartiles para variables numéricas,
# y recuentos de frecuencia para variables categóricas (si son factores) o de caracteres.
La función summary(datos) ofrece un panorama de la distribución de cada variable. Para las variables numéricas clave como heart_rate y chol, proporciona el mínimo, máximo, media, mediana y cuartiles, lo que ayuda a identificar rangos y posibles valores atípicos. Para current_smoker, muestra la frecuencia de “yes” y “no”.
unique(datos$current_smoker)
## [1] "yes" "no"
table(datos$current_smoker, useNA = "ifany") # Para ver también los NA existentes
##
## no yes
## 1968 1932
# Dimensiones del data frame (filas, columnas)
cat("Dimensiones del dataset (filas, columnas):", dim(datos), "\n")
## Dimensiones del dataset (filas, columnas): 3900 7
cat("Número de filas:", nrow(datos), "\n")
## Número de filas: 3900
cat("Número de columnas:", ncol(datos), "\n")
## Número de columnas: 7
# Nombres de las columnas
cat("Nombres de las columnas:", paste(names(datos), collapse=", "), "\n")
## Nombres de las columnas: age, sex, current_smoker, heart_rate, blood_pressure, cigs_per_day, chol
#Conversión de current_smoker a factor: Para facilitar los análisis de grupo, la variable current_smoker se convierte a tipo factor.
datos$current_smoker <- trimws(datos$current_smoker)
datos$current_smoker <- factor(datos$current_smoker, levels = c("no", "yes"),labels = c("No Fumador", "Fumador"))
Los valores faltantes (NA) pueden afectar los análisis estadísticos. Es importante identificarlos y decidir una estrategia para manejarlos.17
# Verificar si hay algún NA en todo el dataset
cat("¿Hay algún NA en el dataset?:", any(is.na(datos)), "\n")
## ¿Hay algún NA en el dataset?: TRUE
# Total de NAs en el dataset
cat("Total de NAs en el dataset:", sum(is.na(datos)), "\n")
## Total de NAs en el dataset: 21
# NAs por columna
kable(colSums(is.na(datos)), col.names = "Numero de NAs", caption = "Valores Faltantes por Columna")
| Numero de NAs | |
|---|---|
| age | 0 |
| sex | 0 |
| current_smoker | 0 |
| heart_rate | 0 |
| blood_pressure | 0 |
| cigs_per_day | 14 |
| chol | 7 |
La salida de colSums(is.na(datos)) muestra que las columnas cigs_per_day y chol contienen valores faltantes. Para las pruebas de hipótesis que involucran heart_rate y chol, estos NAs deben ser gestionados. Las funciones de prueba t.test() y prop.test() en R pueden manejar NAs de diferentes maneras: Cuando se utiliza la interfaz de fórmula (ej. variable ~ grupo), R generalmente omite las filas donde falten datos en las variables involucradas en la fórmula (comportamiento de na.action = na.omit). Cuando se proporcionan vectores directamente a estas funciones, los NAs deben ser eliminados previamente, o la función podría devolver un error o NA. Para funciones de resumen como mean(), sd(), sum(), se utiliza el argumento na.rm = TRUE para excluir los NAs del cálculo. Para este informe, se optará por filtrar los NAs específicamente para las variables involucradas en cada prueba o se confiará en el manejo por defecto de la interfaz de fórmula, indicándolo en ca
##3.5. Creación de Nuevas Variables Binarias
SE crearán dos nuevas variables binarias: Z_colesterol_alto y W_taquicardia. Se utilizará la función mutate() del paquete dplyr junto con case_when() para esta tarea.
datos <- datos %>%
mutate(
Z_colesterol_alto = case_when(
chol > 240 ~ 1, # Colesterol alto
chol <= 240 ~ 0, # Colesterol normal o saludable
TRUE ~ NA_real_ # Mantener NA si 'chol' es NA
),
W_taquicardia = case_when(
heart_rate > 100 ~ 1, # Taquicardia
heart_rate <= 100 ~ 0, # Frecuencia cardíaca normal
TRUE ~ NA_real_ # Mantener NA si 'heart_rate' es NA
)
)
# Convertir las nuevas variables binarias a factores para una mejor interpretación en tablas y resúmenes
datos$Z_colesterol_alto_factor <- factor(datos$Z_colesterol_alto,
levels = c(0,1),
labels = c("Normal/Saludable", "Alto"))
datos$W_taquicardia_factor <- factor(datos$W_taquicardia,
levels = c(0,1),
labels = c("Normal", "Taquicardia"))
# Mostrar las primeras filas con las nuevas variables
kable(head(select(datos, chol, Z_colesterol_alto, Z_colesterol_alto_factor, heart_rate, W_taquicardia, W_taquicardia_factor)),
caption = "Primeras Filas con Nuevas Variables Binarias Creadas")
| chol | Z_colesterol_alto | Z_colesterol_alto_factor | heart_rate | W_taquicardia | W_taquicardia_factor |
|---|---|---|---|---|---|
| 219 | 0 | Normal/Saludable | 95 | 0 | Normal |
| 248 | 1 | Alto | 64 | 0 | Normal |
| 235 | 0 | Normal/Saludable | 81 | 0 | Normal |
| 225 | 0 | Normal/Saludable | 90 | 0 | Normal |
| 226 | 0 | Normal/Saludable | 62 | 0 | Normal |
| 223 | 0 | Normal/Saludable | 62 | 0 | Normal |
A continuación, se presenta un resumen estadístico de las variables clave que se utilizarán en las pruebas de hipótesis.
# Resumen para variables numéricas clave
summary_numeric <- datos %>%
summarise(
Variable = c("Frecuencia Cardíaca (lpm)", "Colesterol (mg/dL)"),
Media = c(mean(heart_rate, na.rm = TRUE), mean(chol, na.rm = TRUE)),
SD = c(sd(heart_rate, na.rm = TRUE), sd(chol, na.rm = TRUE)),
Mediana = c(median(heart_rate, na.rm = TRUE), median(chol, na.rm = TRUE)),
Min = c(min(heart_rate, na.rm = TRUE), min(chol, na.rm = TRUE)),
Max = c(max(heart_rate, na.rm = TRUE), max(chol, na.rm = TRUE)),
N_Faltantes = c(sum(is.na(heart_rate)), sum(is.na(chol)))
)
## Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
## dplyr 1.1.0.
## ℹ Please use `reframe()` instead.
## ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()`
## always returns an ungrouped data frame and adjust accordingly.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
kable(summary_numeric, caption = "Resumen Estadístico de Variables Numéricas Clave", digits = 2)
| Variable | Media | SD | Mediana | Min | Max | N_Faltantes |
|---|---|---|---|---|---|---|
| Frecuencia Cardíaca (lpm) | 75.69 | 12.02 | 75 | 44 | 143 | 0 |
| Colesterol (mg/dL) | 236.60 | 44.38 | 234 | 113 | 696 | 7 |
# Frecuencias para variables categóricas clave
kable(table(datos$current_smoker, useNA = "ifany"), col.names = c("Grupo", "Frecuencia"), caption = "Frecuencia de Fumadores Actuales")
| Grupo | Frecuencia |
|---|---|
| No Fumador | 1968 |
| Fumador | 1932 |
kable(table(datos$Z_colesterol_alto_factor, useNA = "ifany"), col.names = c("Nivel de Colesterol", "Frecuencia"), caption = "Frecuencia de Colesterol Alto (Z)")
| Nivel de Colesterol | Frecuencia |
|---|---|
| Normal/Saludable | 2224 |
| Alto | 1669 |
| NA | 7 |
kable(table(datos$W_taquicardia_factor, useNA = "ifany"), col.names = c("Estado de Taquicardia", "Frecuencia"), caption = "Frecuencia de Taquicardia (W)")
| Estado de Taquicardia | Frecuencia |
|---|---|
| Normal | 3807 |
| Taquicardia | 93 |
# Resumen de Colesterol por Grupo de Fumadores
summary_chol_smoker <- datos %>%
filter(!is.na(chol) &!is.na(current_smoker)) %>%
group_by(current_smoker) %>%
summarise(
N = n(),
Media_Colesterol = mean(chol, na.rm = TRUE),
SD_Colesterol = sd(chol, na.rm = TRUE),
Mediana_Colesterol = median(chol, na.rm = TRUE)
) %>%
ungroup()
kable(summary_chol_smoker, caption = "Resumen de Colesterol (mg/dL) por Grupo de Fumadores", digits = 2)
| current_smoker | N | Media_Colesterol | SD_Colesterol | Mediana_Colesterol |
|---|---|---|---|---|
| No Fumador | 1965 | 238.65 | 43.87 | 235 |
| Fumador | 1928 | 234.51 | 44.80 | 232 |
# Resumen de Frecuencia Cardíaca por Grupo de Fumadores
summary_hr_smoker <- datos %>%
filter(!is.na(heart_rate) &!is.na(current_smoker)) %>%
group_by(current_smoker) %>%
summarise(
N = n(),
Media_FC = mean(heart_rate, na.rm = TRUE),
SD_FC = sd(heart_rate, na.rm = TRUE),
Mediana_FC = median(heart_rate, na.rm = TRUE)
) %>%
ungroup()
kable(summary_hr_smoker, caption = "Resumen de Frecuencia Cardíaca (lpm) por Grupo de Fumadores", digits = 2)
| current_smoker | N | Media_FC | SD_FC | Mediana_FC |
|---|---|---|---|---|
| No Fumador | 1968 | 75.01 | 12.22 | 75 |
| Fumador | 1932 | 76.38 | 11.76 | 75 |
Esta tabla resumen es fundamental porque proporciona una visión inicial de las características de los datos antes de realizar las pruebas inferenciales. Permite identificar la tendencia central, la dispersión y la presencia de valores faltantes en las variables de interés. Además, al estratificar por estado de tabaquismo, se obtiene una primera indicación de posibles diferencias entre fumadores y no fumadores, lo que ayuda a contextualizar los resultados de las pruebas de hipótesis posteriores.
# Alternativa con ggplot2
ggplot(datos, aes(x = heart_rate)) +
geom_histogram(binwidth = 5, fill = "skyblue", color = "black", alpha = 0.7) +
labs(title = "Distribucion de la Frecuencia Cardiaca (ggplot2)",
x = "Frecuencia Cardiaca (lpm)",
y = "Frecuencia") +
theme_minimal()
El histograma muestra la distribución de la frecuencia cardíaca (en
latidos por minuto, lpm) para un grupo de individuos. Se observa que la
mayoría de las personas tienen una frecuencia cardíaca que se concentra
principalmente entre 60 y 90 lpm, con el pico más alto de frecuencia
(más de 700 individuos) alrededor de los 75-80 lpm. La distribución es
unimodal y presenta una ligera asimetría positiva (sesgo hacia la
derecha), lo que indica que, aunque menos comunes, existen algunos
individuos con frecuencias cardíacas más altas, extendiéndose hasta
aproximadamente 130 lpm. Esto sugiere que la frecuencia cardíaca típica
en este grupo está bien definida, pero con una variabilidad que tiende
hacia valores más elevados en una menor proporción de casos.
ggplot(datos, aes(x = chol)) +
geom_histogram(binwidth = 10, fill = "lightgreen", color = "black", alpha = 0.7) +
labs(title = "Distribucion de los Niveles de Colesterol (ggplot2)",
x = "Colesterol (mg/dL)",
y = "Frecuencia") +
theme_minimal()
## Warning: Removed 7 rows containing non-finite outside the scale range
## (`stat_bin()`).
Este histograma representa la distribución de los niveles de colesterol
(en mg/dL) de un conjunto de individuos. La mayoría de las personas
presentan niveles de colesterol que se agrupan principalmente entre 150
mg/dL y 300 mg/dL, con la concentración más alta de individuos (más de
350) mostrando niveles alrededor de 220-240 mg/dL. La distribución es
unimodal y se asemeja a una curva normal, aunque con una ligera cola
hacia la derecha, indicando que algunos individuos tienen niveles de
colesterol más elevados. Un dato notable es la presencia de un valor o
valores atípicos extremadamente altos, cerca de los 600 mg/dL, que se
distancia considerablemente del resto de la distribución y podría
representar casos excepcionales o errores de medición.
ggplot(datos, aes(x = current_smoker, y = heart_rate, fill = current_smoker)) +
geom_boxplot(alpha = 0.7) +
labs(title = "Frecuencia Cardiaca por Estado de Fumador (ggplot2)",
x = "Estado de Fumador",
y = "Frecuencia Cardiaca (lpm)") +
scale_fill_manual(values = c("No Fumador" = "skyblue", "Fumador" = "salmon")) +
theme_minimal() +
theme(legend.position = "none") # Oculta la leyenda si es redundante
Es evidente es estos diagramas de caja que la frecuencia cardiaca es
mayor en grupos de fumadores y que por lo tanto fumar aumenta este
factor de riesgo.
ggplot(datos, aes(x = current_smoker, y = chol, fill = current_smoker)) +
geom_boxplot(alpha = 0.7) +
labs(title = "Niveles de Colesterol por Estado de Fumador (ggplot2)",
x = "Estado de Fumador",
y = "Colesterol (mg/dL)") +
scale_fill_manual(values = c("No Fumador" = "lightgreen", "Fumador" = "orange")) +
theme_minimal() +
theme(legend.position = "none")
## Warning: Removed 7 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
En el caso del colesterol este no se ve cono un efecto determinando en
el grupo de fumadores que no es notable en la grafica y cambio
significativo en la distribución ni en la tendencia centra.
ggplot(datos, aes(x = current_smoker, fill = current_smoker)) +
geom_bar(alpha = 0.8) +
labs(title = "Distribucion de Fumadores y No Fumadores",
x = "Estado de Fumador",
y = "Cantidad") +
scale_fill_manual(values = c("No Fumador" = "gray70", "Fumador" = "coral")) +
theme_minimal() +
geom_text(stat='count', aes(label=..count..), vjust=-0.5) # Añade el conteo encima de las barras
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Se puede observar que el dataset esta distribuido de forma homogénea
entre las categoarias de estidio lo cual lo hace manejable y que los
resultados no tenga que normalizarse para poder realizar los analisis de
forma adecuada.
# Convertimos Z_colesterol_alto a factor
datos_salud_factor <- datos %>%
mutate(Z_colesterol_alto_factor = factor(Z_colesterol_alto, labels = c("Normal/Saludable", "Alto")))
ggplot(datos_salud_factor, aes(x = current_smoker, fill = Z_colesterol_alto_factor)) +
geom_bar(position = "dodge", alpha = 0.8) + # "dodge" para barras lado a lado
labs(title = "Proporcion de Colesterol Alto por Estado de Fumador",
x = "Estado de Fumador",
y = "Cantidad",
fill = "Nivel de Colesterol") +
theme_minimal() +
geom_text(stat='count', aes(label=..count..), position = position_dodge(width=0.9), vjust=-0.5)
Se confirma mendiante este grafico de barras que no existe una afectació
fuerte y directa entre fumar con el colesterol, se si observa un aumento
de valores limite en terminos positvos incluso en aquellos que forman
parte del grupo de fumadores.
ggplot(datos, aes(x = heart_rate, y = chol)) +
geom_point(alpha = 0.5, color = "purple") +
geom_smooth(method = "lm", color = "red", se = FALSE) + # Añade una línea de tendencia lineal
labs(title = "Relacion entre Frecuencia Cardiaca y Colesterol",
x = "Frecuencia Cardiaca (lpm)",
y = "Colesterol (mg/dL)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 7 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 7 rows containing missing values or values outside the scale range
## (`geom_point()`).
Aqui se puede ver una relación que es comumentte evidente y es aumento
de la frecuencia cardiaga con un mayor nivel de colesterol que compensa
la perdidad de presión por el taponameinto que puede causar el
colesterol.
ggplot(datos, aes(x = heart_rate, y = chol, color = current_smoker)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, aes(linetype = current_smoker)) + # Líneas de tendencia separadas
labs(title = "Relacion entre Frecuencia Cardiaca y Colesterol",
x = "Frecuencia Cardiaca (lpm)",
y = "Colesterol (mg/dL)",
color = "Estado de Fumador",
linetype = "Estado de Fumador") +
scale_color_manual(values = c("No Fumador" = "blue", "Fumador" = "red")) +
theme_bw() # Otro tema para variar
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 7 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 7 rows containing missing values or values outside the scale range
## (`geom_point()`).
No se obseva un sesgo significativo con los fumadores y los nivels de
colestetol auqnue este grafico tampoco permite ver de forma relevante
una afectación en la frecuencua cardiaca vista anteriormente en otros
graficos.
Estas pruebas evalúan si la media de una única población, representada por la muestra, difiere significativamente de un valor de referencia específico. Se utiliza la función t.test() en R. Para estas pruebas, se asume un nivel de significancia \(\alpha = 0.05\), a menos que se especifique lo contrario.
Objetivo: Comprobar si la frecuencia cardíaca promedio de los individuos en la muestra es igual a 75 latidos por minuto (lpm), valor de referencia para adultos sanos en reposo.
Hipótesis:
\(H_0: \mu_{heart_rate} = 75\) (La media poblacional de la frecuencia cardíaca es igual a 75 lpm). \(H_1: \mu_{heart_rate} \neq 75\) (La media poblacional de la frecuencia cardíaca es diferente de 75 lpm). Comando R: Los valores faltantes en heart_rate se excluyen antes de realizar la prueba.
# Prueba t para una muestra - Frecuencia Cardíaca
# Filtrar NAs para la variable heart_rate antes de la prueba
hr_data <- datos$heart_rate[!is.na(datos$heart_rate)]
prueba_hr_media <- t.test(hr_data, mu = 75, alternative = "two.sided")
print(prueba_hr_media) # La salida se mostrará formateada a continuación
##
## One Sample t-test
##
## data: hr_data
## t = 3.5809, df = 3899, p-value = 0.0003465
## alternative hypothesis: true mean is not equal to 75
## 95 percent confidence interval:
## 75.31176 76.06619
## sample estimates:
## mean of x
## 75.68897
Explicación del Comando: t.test(hr_data,…): Invoca la función de prueba t. hr_data es el vector numérico de frecuencias cardíacas sin valores NA. mu = 75: Especifica el valor de la media poblacional (\(\mu_0\)) bajo la hipótesis nula. alternative = “two.sided”: Indica que se trata de una prueba de hipótesis bilateral, ya que se busca detectar si la media es diferente de 75 lpm, sin especificar una dirección (mayor o menor).
Resultados e Interpretación:
# Resultados de la prueba t para frecuencia cardíaca
# Se extraen los valores relevantes para el informe
cat(paste("Estadístico t:", round(prueba_hr_media$statistic, 3), "\n"))
## Estadístico t: 3.581
cat(paste("Grados de libertad (df):", round(prueba_hr_media$parameter, 3), "\n"))
## Grados de libertad (df): 3899
cat(paste("Valor p:", format.pval(prueba_hr_media$p.value, digits = 3, eps = 0.001), "\n"))
## Valor p: <0.001
cat(paste("Intervalo de confianza del 95% para la media: [",
round(prueba_hr_media$conf.int[1], 2), ", ", round(prueba_hr_media$conf.int[2], 2), "]\n"))
## Intervalo de confianza del 95% para la media: [ 75.31 , 76.07 ]
cat(paste("Media muestral:", round(prueba_hr_media$estimate[1], 2), "lpm\n"))
## Media muestral: 75.69 lpm
Decisión: El valor p obtenido es
format.pval(prueba_hr_media$p.value, digits = 3, eps = 0.001)
## [1] "<0.001"
Si se asume un nivel de significancia
\(\alpha = 0.05\): Como el valor p (
format.pval(prueba_hr_media$p.value, digits = 3, eps = 0.001)
## [1] "<0.001"
es
ifelse(prueba_hr_media$p.value < 0.05, "menor", "mayor o igual") #
## [1] "menor"
que \(\alpha = 0.05\), se
ifelse(prueba_hr_media$p.value < 0.05, "rechaza", "no se rechaza")
## [1] "rechaza"
la hipótesis nula (\(H_0\)).
Conclusión:
ifelse(prueba_hr_media$p.value < 0.05, "Existe evidencia estadística suficiente para concluir que la frecuencia cardíaca promedio de los individuos en la muestra es significativamente diferente de 75 lpm.", "No existe evidencia estadística suficiente para concluir que la frecuencia cardíaca promedio de los individuos en la muestra sea diferente de 75 lpm.")
## [1] "Existe evidencia estadística suficiente para concluir que la frecuencia cardíaca promedio de los individuos en la muestra es significativamente diferente de 75 lpm."
La media muestral observada es de
round(prueba_hr_media$estimate, 2)
## mean of x
## 75.69
lpm, y el intervalo de confianza del 95% para la media poblacional es
round(prueba_hr_media$conf.int[1], 2)
## [1] 75.31
round(prueba_hr_media$conf.int[2], 2)
## [1] 76.07
lpm, el cual
ifelse(75 >= prueba_hr_media$conf.int[1] & 75 <= prueba_hr_media$conf.int[2], "incluye", "no incluye")
## [1] "no incluye"
el valor de referencia de 75 lpm, lo que es consistente con la decisión basada en el valor p.
Objetivo: Evaluar si los niveles medios de colesterol en la muestra superan el valor umbral de 200 mg/dL, punto a partir del cual se considera hipercolesterolemia.
Hipótesis:
\(H_0: \mu_{cholesterol} \leq 200\) (El nivel medio de colesterol en la población es menor o igual a 200 mg/dL).
\(H_1: \mu_{cholesterol} > 200\) (El nivel medio de colesterol en la población es mayor a 200 mg/dL).
chol_data <- datos$chol[!is.na(datos$chol)]
prueba_chol_media <- t.test(chol_data, mu = 200, alternative = "greater")
print(prueba_chol_media)
##
## One Sample t-test
##
## data: chol_data
## t = 51.456, df = 3892, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 200
## 95 percent confidence interval:
## 235.4258 Inf
## sample estimates:
## mean of x
## 236.5959
Explicación del Comando: chol_data: Vector numérico de niveles de colesterol sin valores NA. mu = 200: Valor de la media poblacional bajo \(H_0\). alternative = “greater”: Indica una prueba de hipótesis unilateral derecha, ya que se busca evidencia de que la media es mayor a 200 mg/dL.
Resultados e Interpretación:
cat(paste("Estadístico t:", round(prueba_chol_media$statistic, 3), "\n"))
## Estadístico t: 51.456
cat(paste("Grados de libertad (df):",round(prueba_chol_media$parameter, 3), "\n"))
## Grados de libertad (df): 3892
cat(paste("Valor p:", format.pval(prueba_chol_media$p.value, digits = 3, eps = 0.001),"\n"))
## Valor p: <0.001
cat(paste("Intervalo de confianza del 95% (unilateral inferior) para la media: [",
round(prueba_chol_media$conf.int[1], 2), ", Inf)\n")) # El límite superior es Inf para "greater"
## Intervalo de confianza del 95% (unilateral inferior) para la media: [ 235.43 , Inf)
cat(paste("Media muestral:", round(prueba_chol_media$estimate[1], 2), "mg/dL\n"))
## Media muestral: 236.6 mg/dL
Estadístico t:
round(prueba_chol_media$statistic, 3)
## t
## 51.456
Grados de libertad (df):
round(prueba_chol_media$parameter, 3)
## df
## 3892
Valor p: r
format.pval(prueba_chol_media$p.value, digits = 3, eps = 0.001)
## [1] "<0.001"
Intervalo de confianza del 95% (unilateral inferior) para la media:
round(prueba_chol_media$conf.int[1], 2)
## [1] 235.43
Media muestral: r
round(prueba_chol_media$estimate[1], 2) #mg/dL
## mean of x
## 236.6
Decisión: El valor p obtenido es r
format.pval(prueba_chol_media$p.value, digits = 3, eps = 0.001)
## [1] "<0.001"
. Asumiendo \(\alpha = 0.05\): Como el valor p
format.pval(prueba_chol_media$p.value, digits = 3, eps = 0.001)
## [1] "<0.001"
ifelse(prueba_chol_media$p.value < 0.05, "menor", "mayor o igual")
## [1] "menor"
que \(\alpha = 0.05\), se
ifelse(prueba_chol_media$p.value < 0.05, "rechaza", "no se rechaza")
## [1] "rechaza"
la hipótesis nula (\(H_0\)).
Conclusión:
ifelse(prueba_chol_media$p.value < 0.05, "Existe evidencia estadística suficiente para concluir que el nivel medio de colesterol en la población representada por la muestra es significativamente mayor a 200 mg/dL.", "No existe evidencia estadística suficiente para concluir que el nivel medio de colesterol en la población representada por la muestra sea mayor a 200 mg/dL.")
## [1] "Existe evidencia estadística suficiente para concluir que el nivel medio de colesterol en la población representada por la muestra es significativamente mayor a 200 mg/dL."
La media muestral de colesterol es de
round(prueba_chol_media$estimate[1], 2) #"mg/dL.
## mean of x
## 236.6
Estas pruebas evalúan si la proporción de una característica de interés en una población difiere de un valor específico. Se utiliza la función prop.test() en R. Se asume \(\alpha = 0.05\).
Variable de Interés: Z_colesterol_alto ( si chol > 240, 0 si no).
Objetivo: Evaluar si la proporción de personas con colesterol alto (chol > 240 mg/dL) es mayor al 20%.
Hipótesis:
\(H_0: p_Z = 0.20\) (La proporción poblacional de personas con colesterol alto es igual al 20%).
\(H_1: p_Z > 0.20\) (La proporción poblacional de personas con colesterol alto es mayor al 20%). Comando R: Se excluyen los NAs de la variable Z_colesterol_alto.
### Prueba de proporciones para una muestra - Colesterol Alto (Z)
Z_data <- datos$Z_colesterol_alto[!is.na(datos$Z_colesterol_alto)]
exitos_Z <- sum(Z_data == 1)
total_Z <- length(Z_data)
prueba_Z_proporcion <- prop.test(exitos_Z, total_Z, p = 0.20, alternative = "greater", correct = FALSE)
print(prueba_Z_proporcion)
##
## 1-sample proportions test without continuity correction
##
## data: exitos_Z out of total_Z, null probability 0.2
## X-squared = 1272.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is greater than 0.2
## 95 percent confidence interval:
## 0.4157256 1.0000000
## sample estimates:
## p
## 0.4287182
Explicación del Comando:
exitos_Z: Número de individuos con colesterol alto (Z=1). total_Z: Número total de individuos con datos válidos para Z. p = 0.20: Proporción poblacional bajo \(H_0\). alternative = “greater”: Prueba unilateral derecha. correct = FALSE: No se aplica la corrección de continuidad de Yates. Esta corrección es más conservadora y a veces se omite para muestras grandes o para alinear con software que no la aplica por defecto en todos los casos. El comportamiento por defecto en R (correct = TRUE) la aplicaría si es posible.
###Resultados e Interpretación:
cat(paste("Estadístico X-squared:", round(prueba_Z_proporcion$statistic, 3), "\n"))
## Estadístico X-squared: 1272.817
cat(paste("Grados de libertad (df):", prueba_Z_proporcion$parameter, "\n"))
## Grados de libertad (df): 1
cat(paste("Valor p:", format.pval(prueba_Z_proporcion$p.value, digits = 3, eps = 0.001), "\n"))
## Valor p: <0.001
cat(paste("Intervalo de confianza del 95% (unilateral inferior) para la proporción: [",
round(prueba_Z_proporcion$conf.int[1], 3), ", ", round(prueba_Z_proporcion$conf.int[1], 3), "]\n")) # Límite superior es 1 para "greater"
## Intervalo de confianza del 95% (unilateral inferior) para la proporción: [ 0.416 , 0.416 ]
cat(paste("Proporción muestral:", round(prueba_Z_proporcion$estimate[1], 3), "\n"))
## Proporción muestral: 0.429
Decisión: El valor p es
format.pval(prueba_Z_proporcion$p.value, digits = 3, eps = 0.001)
## [1] "<0.001"
Como este valor p es
ifelse(prueba_Z_proporcion$p.value < 0.05, "menor", "mayor o igual")
## [1] "menor"
que \(\alpha = 0.05\), se
ifelse(prueba_Z_proporcion$p.value < 0.05, "rechaza", "no se rechaza")
## [1] "rechaza"
\(H_0\).
Conclusión:
ifelse(prueba_Z_proporcion$p.value < 0.05, "Existe evidencia estadística suficiente para concluir que la proporción de personas con colesterol alto (superior a 240 mg/dL) en la población es mayor al 20%.", "No existe evidencia estadística suficiente para concluir que la proporción de personas con colesterol alto (superior a 240 mg/dL) en la población sea mayor al 20%.")
## [1] "Existe evidencia estadística suficiente para concluir que la proporción de personas con colesterol alto (superior a 240 mg/dL) en la población es mayor al 20%."
La proporción observada en la muestra es de
round(prueba_Z_proporcion$estimate, 3)*100 #%
## p
## 42.9
Variable de Interés: W_taquicardia (1 si heart_rate > 100 lpm, 0 si no).
Objetivo: Evaluar si la proporción de personas con taquicardia es diferente del 5%. Hipótesis: \(H_0: p_W = 0.05\) (La proporción poblacional de personas con taquicardia es igual al 5%). \(H_1: p_W \neq 0.05\) (La proporción poblacional de personas con taquicardia es diferente del 5%). Comando R:
# Prueba de proporciones para una muestra - Taquicardia (W)
W_data <- datos$W_taquicardia[!is.na(datos$W_taquicardia)]
exitos_W <- sum(W_data == 1)
total_W <- length(W_data)
prueba_W_proporcion <- prop.test(exitos_W, total_W, p = 0.05, alternative = "two.sided", correct = FALSE)
print(prueba_W_proporcion)
##
## 1-sample proportions test without continuity correction
##
## data: exitos_W out of total_W, null probability 0.05
## X-squared = 56.162, df = 1, p-value = 6.674e-14
## alternative hypothesis: true p is not equal to 0.05
## 95 percent confidence interval:
## 0.01950584 0.02912355
## sample estimates:
## p
## 0.02384615
Explicación del Comando: alternative = “two.sided”: Indica una prueba bilateral.
Resultados e Interpretación:
cat(paste("Estadístico X-squared:", round(prueba_W_proporcion$statistic, 3), "\n"))
## Estadístico X-squared: 56.162
cat(paste("Grados de libertad (df):", prueba_W_proporcion$parameter, "\n"))
## Grados de libertad (df): 1
cat(paste("Valor p:", format.pval(prueba_W_proporcion$p.value, digits = 3, eps = 0.001), "\n"))
## Valor p: <0.001
cat(paste("Intervalo de confianza del 95% para la proporción: [",
round(prueba_W_proporcion$conf.int[1], 3), ", ", round(prueba_W_proporcion$conf.int[2], 3), "]\n"))
## Intervalo de confianza del 95% para la proporción: [ 0.02 , 0.029 ]
cat(paste("Proporción muestral:", round(prueba_W_proporcion$estimate[1], 3), "\n"))
## Proporción muestral: 0.024
Decisión: El valor p es
format.pval(prueba_W_proporcion$p.value, digits = 3, eps = 0.001)
## [1] "<0.001"
Como este valor p es
ifelse(prueba_W_proporcion$p.value < 0.05, "menor", "mayor o igual")
## [1] "menor"
que \(\alpha = 0.05\), se
ifelse(prueba_W_proporcion$p.value < 0.05, "rechaza", "no se rechaza")
## [1] "rechaza"
\(H_0\).
Conclusión: r
ifelse(prueba_W_proporcion$p.value < 0.05, "Existe evidencia estadística suficiente para concluir que la proporción de personas con taquicardia en la población es diferente del 5%.", "No existe evidencia estadística suficiente para concluir que la proporción de personas con taquicardia en la población sea diferente del 5%.")
## [1] "Existe evidencia estadística suficiente para concluir que la proporción de personas con taquicardia en la población es diferente del 5%."
La proporción observada en la muestra es de
round(prueba_W_proporcion$estimate, 3)*100#%
## p
## 2.4
Estas pruebas comparan las medias de una variable numérica continua entre dos grupos independientes: fumadores y no fumadores.
La función t.test() se utiliza con una interfaz de fórmula (ej. variable ~ grupo). Un aspecto importante en las pruebas t para dos muestras es la suposición de igualdad de varianzas entre los grupos. La prueba t de Student clásica asume varianzas iguales. Sin embargo, la prueba t de Welch, que es la opción por defecto en R (var.equal = FALSE en t.test()), no requiere esta suposición y es generalmente más robusta, comportándose bien incluso si las varianzas son iguales y siendo más confiable si son desiguales.
Por esta razón, se utilizará la prueba de Welch para los siguientes análisis, a menos que se indique lo contrario.
Objetivo: Evaluar si existen diferencias significativas en los niveles promedio de colesterol entre personas fumadoras y no fumadoras.
Hipótesis: \(H_0: \mu_{chol_fumadores} = \mu_{chol_no_fumadores}\) (No hay diferencia en los niveles medios de colesterol). \(H_1: \mu_{chol_fumadores} \neq \mu_{chol_no_fumadores}\) (Existe una diferencia significativa). Nivel de Significancia: \(\alpha = 0.05\) (especificado en ). Comando R: La variable current_smoker ya fue convertida a factor con niveles “No Fumador” y “Fumador”.
# Prueba t para dos muestras - Colesterol vs Tabaquismo
# La función t.test con fórmula maneja NAs en 'chol' o 'current_smoker' omitiendo esas filas.
prueba_chol_dos_muestras <- t.test(chol ~ current_smoker, data = datos, alternative = "two.sided", var.equal = FALSE) # Prueba de Welch
print(prueba_chol_dos_muestras)
##
## Welch Two Sample t-test
##
## data: chol by current_smoker
## t = 2.9119, df = 3884.8, p-value = 0.003612
## alternative hypothesis: true difference in means between group No Fumador and group Fumador is not equal to 0
## 95 percent confidence interval:
## 1.352281 6.925837
## sample estimates:
## mean in group No Fumador mean in group Fumador
## 238.6458 234.5067
Explicación del Comando: chol ~ current_smoker: Fórmula que indica que chol es la variable dependiente y current_smoker es la variable de agrupación independiente. data = datos: Especifica el data frame. alternative = “two.sided”: Prueba bilateral. var.equal = FALSE: Realiza la prueba t de Welch, que no asume varianzas iguales. Resultados e Interpretación:
cat(paste("Estadístico t (Welch):", round(prueba_chol_dos_muestras$statistic, 3), "\n"))
## Estadístico t (Welch): 2.912
cat(paste("Grados de libertad (df):", round(prueba_chol_dos_muestras$parameter, 3), "\n"))
## Grados de libertad (df): 3884.78
cat(paste("Valor p:", format.pval(prueba_chol_dos_muestras$p.value, digits = 3, eps = 0.001), "\n"))
## Valor p: 0.00361
cat(paste("Intervalo de confianza del 95% para la diferencia de medias (",
levels(datos$current_smoker), " - ", levels(datos$current_smoker), "): [",
round(prueba_chol_dos_muestras$conf.int[1], 2), ", ", round(prueba_chol_dos_muestras$conf.int[2], 2), "]\n"))
## Intervalo de confianza del 95% para la diferencia de medias ( No Fumador - No Fumador ): [ 1.35 , 6.93 ]
## Intervalo de confianza del 95% para la diferencia de medias ( Fumador - Fumador ): [ 1.35 , 6.93 ]
cat(paste("Media muestral (", levels(datos$current_smoker), "):", round(prueba_chol_dos_muestras$estimate, 2), "mg/dL\n"))
## Media muestral ( No Fumador ): 238.65 mg/dL
## Media muestral ( Fumador ): 234.51 mg/dL
cat(paste("Media muestral (", levels(datos$current_smoker), "):", round(prueba_chol_dos_muestras$estimate, 2), "mg/dL\n"))
## Media muestral ( No Fumador ): 238.65 mg/dL
## Media muestral ( Fumador ): 234.51 mg/dL
Estadístico t (Welch):
round(prueba_chol_dos_muestras$statistic, 3)
## t
## 2.912
Grados de libertad (df):
round(prueba_chol_dos_muestras$parameter, 3)
## df
## 3884.78
Valor p:
format.pval(prueba_chol_dos_muestras$p.value, digits = 3, eps = 0.001)
## [1] "0.00361"
Intervalo de confianza del 95% para la diferencia de medias
levels(datos$current_smoker)
## [1] "No Fumador" "Fumador"
round(prueba_chol_dos_muestras$conf.int[1], 2)
## [1] 1.35
round(prueba_chol_dos_muestras$conf.int[2], 2)
## [1] 6.93
Media muestral
levels(datos$current_smoker)
## [1] "No Fumador" "Fumador"
round(prueba_chol_dos_muestras$estimate, 2)# mg/dL
## mean in group No Fumador mean in group Fumador
## 238.65 234.51
Decisión: El valor p es
format.pval(prueba_chol_dos_muestras$p.value, digits = 3, eps = 0.001)
## [1] "0.00361"
Como este valor p es
ifelse(prueba_chol_dos_muestras$p.value < 0.05, "menor", "mayor o igual")
## [1] "menor"
que \(\alpha = 0.05\), se
ifelse(prueba_chol_dos_muestras$p.value < 0.05, "rechaza", "no se rechaza")
## [1] "rechaza"
\(H_0\). Conclusión:
ifelse(prueba_chol_dos_muestras$p.value < 0.05, "Existe evidencia estadística suficiente para concluir que hay una diferencia significativa en los niveles promedio de colesterol entre fumadores y no fumadores.", "No existe evidencia estadística suficiente para concluir que haya una diferencia significativa en los niveles promedio de colesterol entre fumadores y no fumadores.")
## [1] "Existe evidencia estadística suficiente para concluir que hay una diferencia significativa en los niveles promedio de colesterol entre fumadores y no fumadores."
Específicamente, los
ifelse(prueba_chol_dos_muestras$estimate > prueba_chol_dos_muestras$estimate, "fumadores", "no fumadores")
## mean in group No Fumador mean in group Fumador
## "no fumadores" "no fumadores"
presentan un nivel promedio de colesterol de
round(prueba_chol_dos_muestras$estimate, 2) #mg/dL
## mean in group No Fumador mean in group Fumador
## 238.65 234.51
mientras que los
ifelse(prueba_chol_dos_muestras$estimate > prueba_chol_dos_muestras$estimate, "no fumadores", "fumadores")
## mean in group No Fumador mean in group Fumador
## "fumadores" "fumadores"
tienen un promedio de
round(prueba_chol_dos_muestras$estimate, 2) #mg/dL
## mean in group No Fumador mean in group Fumador
## 238.65 234.51
Objetivo: Analizar si la frecuencia cardíaca promedio de los fumadores es mayor que la de los no fumadores.
Hipótesis: $H_0: *{FC_fumadores}* $ (La frecuencia cardíaca promedio de los fumadores es menor o igual a la de los no fumadores).
\(H_1: \mu_{FC_fumadores} > \mu_{FC_no_fumadores}\) (La frecuencia cardíaca promedio de los fumadores es mayor que la de los no fumadores). Nivel de Significancia: \(\alpha = 0.05\) (asumido).
Comando R: Para pruebas unilaterales con la interfaz de fórmula, el orden de los niveles del factor es crucial. Si current_smoker es un factor con niveles “No Fumador” (level 1) y “Fumador” (level 2), t.test(heart_rate ~ current_smoker) calculará \(\mu_{No Fumador} - \mu_{Fumador}\). Para probar \(H_1: \mu_{Fumador} > \mu_{No Fumador}\) (o equivalentemente \(\mu_{No Fumador} - \mu_{Fumador} < 0\)), se usaría alternative = “less”. Alternativamente, para mayor claridad y evitar errores por el orden de los factores, se pueden extraer los vectores de datos para cada grupo y especificar el orden en t.test().
# Asegurar que 'current_smoker' es factor con el orden deseado o usar la forma explícita
# datos$current_smoker <- factor(datos$current_smoker, levels = c("No Fumador", "Fumador"))
# Forma explícita para evitar confusión con el orden de los niveles del factor:
hr_fumadores <- datos$heart_rate[datos$current_smoker == "Fumador" &!is.na(datos$heart_rate)]
hr_no_fumadores <- datos$heart_rate[datos$current_smoker == "No Fumador" &!is.na(datos$heart_rate)]
prueba_hr_dos_muestras_explicita <- t.test(hr_fumadores, hr_no_fumadores, alternative = "greater", var.equal = FALSE)
print(prueba_hr_dos_muestras_explicita)
##
## Welch Two Sample t-test
##
## data: hr_fumadores and hr_no_fumadores
## t = 3.5809, df = 3896.4, p-value = 0.0001733
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
## 0.7434658 Inf
## sample estimates:
## mean of x mean of y
## 76.38302 75.00762
Explicación del Comando (forma explícita): t.test(hr_fumadores, hr_no_fumadores,…): Compara directamente los dos vectores. La diferencia se calcula como mean(hr_fumadores) - mean(hr_no_fumadores). alternative = “greater”: Corresponde a \(H_1: \mu_{FC_fumadores} > \mu_{FC_no_fumadores}\). var.equal = FALSE: Prueba de Welch. Resultados e Interpretación:
cat(paste("Estadístico t (Welch):", round(prueba_hr_dos_muestras_explicita$statistic, 3), "\n"))
## Estadístico t (Welch): 3.581
cat(paste("Grados de libertad (df):", round(prueba_hr_dos_muestras_explicita$parameter, 3), "\n"))
## Grados de libertad (df): 3896.421
cat(paste("Valor p:", format.pval(prueba_hr_dos_muestras_explicita$p.value, digits = 3, eps = 0.001), "\n"))
## Valor p: <0.001
cat(paste("Intervalo de confianza del 95% (unilateral inferior) para la diferencia de medias (Fumadores - No Fumadores): [",
round(prueba_hr_dos_muestras_explicita$conf.int[1], 2), ", ", round(prueba_hr_dos_muestras_explicita$conf.int[2], 2), "]\n")) # Límite superior es Inf para "greater"
## Intervalo de confianza del 95% (unilateral inferior) para la diferencia de medias (Fumadores - No Fumadores): [ 0.74 , Inf ]
cat(paste("Media muestral (Fumadores):", round(prueba_hr_dos_muestras_explicita$estimate[1], 2), "lpm\n"))
## Media muestral (Fumadores): 76.38 lpm
cat(paste("Media muestral (No Fumadores):", round(prueba_hr_dos_muestras_explicita$estimate[2], 2), "lpm\n"))
## Media muestral (No Fumadores): 75.01 lpm
Decisión: El valor p es
format.pval(prueba_hr_dos_muestras_explicita$p.value, digits = 3, eps = 0.001)
## [1] "<0.001"
Como este valor p es
ifelse(prueba_hr_dos_muestras_explicita$p.value < 0.05, "menor", "mayor o igual")
## [1] "menor"
que \(\alpha = 0.05\), se
ifelse(prueba_hr_dos_muestras_explicita$p.value < 0.05, "rechaza", "no se rechaza")
## [1] "rechaza"
\(H_0\).
Conclusión:
ifelse(prueba_hr_dos_muestras_explicita$p.value < 0.05, "Existe evidencia estadística suficiente para concluir que la frecuencia cardíaca promedio de los fumadores es significativamente mayor que la de los no fumadores.", "No existe evidencia estadística suficiente para concluir que la frecuencia cardíaca promedio de los fumadores sea mayor que la de los no fumadores.")
## [1] "Existe evidencia estadística suficiente para concluir que la frecuencia cardíaca promedio de los fumadores es significativamente mayor que la de los no fumadores."
La frecuencia cardíaca media observada en fumadores fue de
round(prueba_hr_dos_muestras_explicita$estimate[1], 2) #lpm, comparada con
## mean of x
## 76.38
round(prueba_hr_dos_muestras_explicita$estimate[2], 2) #lpm en no fumadores.
## mean of y
## 75.01
Esta prueba compara la proporción de una característica binaria entre dos grupos independientes (fumadores vs. no fumadores). Se utiliza la función prop.test() en R.
Variable de Interés: Z_colesterol_alto (1 si chol > 240 mg/dL).
Objetivo: Determinar si la proporción de individuos con colesterol elevado difiere entre quienes fuman y quienes no lo hacen.
Hipótesis: \(H_0: p\_{Z_fumadores} = p\_{Z_no_fumadores}\$ (La proporción de personas con colesterol alto es la misma en ambos grupos).\)H_1: p_{Z_fumadores} p_{Z_no_fumadores}$ (La proporción de personas con colesterol alto es diferente entre los grupos). Nivel de Significancia: \(\alpha = 0.05\) (especificado en ).
Comando R: Se crea una tabla de contingencia con los recuentos de individuos con colesterol alto/normal para fumadores y no fumadores. Los NAs en Z_colesterol_alto o current_smoker se omiten para la creación de la tabla.
# Prueba de proporciones para dos muestras - Colesterol Alto (Z) vs Tabaquismo
# Filtrar NAs para las variables involucradas en la tabla
datos_completos_Z_smoker <- datos[!is.na(datos$Z_colesterol_alto) &!is.na(datos$current_smoker), ]
# Opción 1: Crear vectores de éxitos y totales (más explícito)
# Éxitos = número de personas con colesterol alto (Z_colesterol_alto == 1)
# El orden de los grupos en los vectores debe ser consistente.
# Aquí: primero Fumadores, luego No Fumadores.
exitos_por_grupo_Z <- c(sum(datos_completos_Z_smoker$Z_colesterol_alto[datos_completos_Z_smoker$current_smoker == "Fumador"] == 1),sum(datos_completos_Z_smoker$Z_colesterol_alto[datos_completos_Z_smoker$current_smoker == "No Fumador"] == 1) )
totales_por_grupo_Z <- c( sum(datos_completos_Z_smoker$current_smoker == "Fumador"),
sum(datos_completos_Z_smoker$current_smoker == "No Fumador") )
prueba_Z_dos_proporciones <- prop.test(exitos_por_grupo_Z, totales_por_grupo_Z, alternative = "two.sided", correct = FALSE) #
print(prueba_Z_dos_proporciones)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: exitos_por_grupo_Z out of totales_por_grupo_Z
## X-squared = 5.6106, df = 1, p-value = 0.01785
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.068644839 -0.006509575
## sample estimates:
## prop 1 prop 2
## 0.4097510 0.4473282
# También se puede usar una tabla de contingencia directamente si está formateada como (grupos x resultado_binario)
# La tabla debe tener grupos en filas y las dos categorías del resultado binario en columnas.
# La función table() con las variables factorizadas correctamente produce esto.
# 'Z_colesterol_alto_factor' tiene niveles "Normal/Saludable" y "Alto".
# 'prop.test' considerará la proporción del segundo nivel del factor columna ("Alto") por defecto
tabla_contingencia_Z_factor <- table(datos_completos_Z_smoker$current_smoker,datos_completos_Z_smoker$Z_colesterol_alto_factor)
print(tabla_contingencia_Z_factor) # Para verificar la estructura
##
## Normal/Saludable Alto
## No Fumador 1086 879
## Fumador 1138 790
prop.test(tabla_contingencia_Z_factor, correct = FALSE) # Debería dar el mismo resultado
##
## 2-sample test for equality of proportions without continuity correction
##
## data: tabla_contingencia_Z_factor
## X-squared = 5.6106, df = 1, p-value = 0.01785
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.068644839 -0.006509575
## sample estimates:
## prop 1 prop 2
## 0.5526718 0.5902490
Explicación del Comando (usando vectores de éxitos y totales):
exitos_por_grupo_Z: Un vector con el número de “éxitos” (colesterol alto) para fumadores y no fumadores, respectivamente.
totales_por_grupo_Z: Un vector con el número total de observaciones para fumadores y no fumadores, respectivamente.
alternative = “two.sided”: Prueba bilateral.
correct = FALSE: No se aplica la corrección de continuidad.
Resultados e Interpretación:
cat(paste("Estadístico X-squared:", round(prueba_Z_dos_proporciones$statistic, 3), "\n"))
## Estadístico X-squared: 5.611
cat(paste("Grados de libertad (df):", prueba_Z_dos_proporciones$parameter, "\n"))
## Grados de libertad (df): 1
cat(paste("Valor p:", format.pval(prueba_Z_dos_proporciones$p.value, digits = 3, eps = 0.001), "\n"))
## Valor p: 0.0179
cat(paste("Intervalo de confianza del 95% para la diferencia de proporciones (Fumadores - No Fumadores): [",
round(prueba_Z_dos_proporciones$conf.int[1], 3), ", ", round(prueba_Z_dos_proporciones$conf.int[2], 3), "]\n"))
## Intervalo de confianza del 95% para la diferencia de proporciones (Fumadores - No Fumadores): [ -0.069 , -0.007 ]
cat(paste("Proporción muestral (Fumadores):", round(prueba_Z_dos_proporciones$estimate[1], 3), "\n"))
## Proporción muestral (Fumadores): 0.41
cat(paste("Proporción muestral (No Fumadores):", round(prueba_Z_dos_proporciones$estimate[2], 3), "\n"))
## Proporción muestral (No Fumadores): 0.447
Decisión:
El valor p es
format.pval(prueba_Z_dos_proporciones$p.value, digits = 3, eps = 0.001)
## [1] "0.0179"
Como este valor p es
ifelse(prueba_Z_dos_proporciones$p.value < 0.05, "menor", "mayor o igual")
## [1] "menor"
que \(\alpha = 0.05\), se
ifelse(prueba_Z_dos_proporciones$p.value < 0.05, "rechaza", "no se rechaza")
## [1] "rechaza"
\(H_0\).
Conclusión:
ifelse(prueba_Z_dos_proporciones$p.value < 0.05, "Existe evidencia estadística suficiente para concluir que la proporción de individuos con colesterol alto (superior a 240 mg/dL) difiere significativamente entre fumadores y no fumadores.", "No existe evidencia estadística suficiente para concluir que la proporción de individuos con colesterol alto (superior a 240 mg/dL) difiera significativamente entre fumadores y no fumadores.")
## [1] "Existe evidencia estadística suficiente para concluir que la proporción de individuos con colesterol alto (superior a 240 mg/dL) difiere significativamente entre fumadores y no fumadores."
La proporción de colesterol alto en fumadores fue de
round(prueba_Z_dos_proporciones$estimate[1]*100, 1)#%
## prop 1
## 41
mientras que en no fumadores fue de
round(prueba_Z_dos_proporciones$estimate[2]*100, 1)#%
## prop 2
## 44.7
Todas las Pruebas de Hipótesis A continuación, se presenta una tabla que resume los hallazgos clave de las siete pruebas de hipótesis realizadas.
# Crear data frame con los resultados
resumen_pruebas <- data.frame(
Prueba = 1:7,
Descripcion = c(
"FC media vs 75 lpm",
"Colesterol medio vs 200 mg/dL",
"Proporción Colesterol > 240 vs 20%",
"Proporción Taquicardia vs 5%",
"Diferencia Colesterol medio (Fum vs NoFum)",
"Diferencia FC media (Fum vs NoFum)",
"Diferencia Proporción Colesterol > 240 (Fum vs NoFum)"
),
H0 = c(
"μ_FC = 75",
"μ_Col ≤ 200",
"p_Z = 0.20",
"p_W = 0.05",
"μ_Col_Fum = μ_Col_NoFum",
"μ_FC_Fum ≤ μ_FC_NoFum",
"p_Z_Fum = p_Z_NoFum"
),
H1 = c(
"μ_FC ≠ 75",
"μ_Col > 200",
"p_Z > 0.20",
"p_W ≠ 0.05",
"μ_Col_Fum ≠ μ_Col_NoFum",
"μ_FC_Fum > μ_FC_NoFum",
"p_Z_Fum ≠ p_Z_NoFum"
),
Estadistico_Valor = c(
round(prueba_hr_media$statistic, 3),
round(prueba_chol_media$statistic, 3),
round(prueba_Z_proporcion$statistic, 3),
round(prueba_W_proporcion$statistic, 3),
round(prueba_chol_dos_muestras$statistic, 3),
round(prueba_hr_dos_muestras_explicita$statistic, 3),
round(prueba_Z_dos_proporciones$statistic, 3)
),
df = c(
round(prueba_hr_media$parameter, 0),
round(prueba_chol_media$parameter, 0),
prueba_Z_proporcion$parameter,
prueba_W_proporcion$parameter,
round(prueba_chol_dos_muestras$parameter, 0),
round(prueba_hr_dos_muestras_explicita$parameter, 0),
prueba_Z_dos_proporciones$parameter
),
Valor_p = c(
format.pval(prueba_hr_media$p.value, digits = 3, eps = 0.001),
format.pval(prueba_chol_media$p.value, digits = 3, eps = 0.001),
format.pval(prueba_Z_proporcion$p.value, digits = 3, eps = 0.001),
format.pval(prueba_W_proporcion$p.value, digits = 3, eps = 0.001),
format.pval(prueba_chol_dos_muestras$p.value, digits = 3, eps = 0.001),
format.pval(prueba_hr_dos_muestras_explicita$p.value, digits = 3, eps = 0.001),
format.pval(prueba_Z_dos_proporciones$p.value, digits = 3, eps = 0.001)
),
Alpha = rep(0.05, 7),
Decision_H0 = c(
ifelse(prueba_hr_media$p.value < 0.05, "Rechazar H0", "No Rechazar H0"),
ifelse(prueba_chol_media$p.value < 0.05, "Rechazar H0", "No Rechazar H0"),
ifelse(prueba_Z_proporcion$p.value < 0.05, "Rechazar H0", "No Rechazar H0"),
ifelse(prueba_W_proporcion$p.value < 0.05, "Rechazar H0", "No Rechazar H0"),
ifelse(prueba_chol_dos_muestras$p.value < 0.05, "Rechazar H0", "No Rechazar H0"),
ifelse(prueba_hr_dos_muestras_explicita$p.value < 0.05, "Rechazar H0", "No Rechazar H0"),
ifelse(prueba_Z_dos_proporciones$p.value < 0.05, "Rechazar H0", "No Rechazar H0")
)
)
kable(resumen_pruebas, caption = "Resumen de Resultados de las Pruebas de Hipótesis", digits=3,
col.names = c("Nº", "Descripción", "H0", "H1", "Estadístico", "df", "Valor p", "α", "Decisión"))
| Nº | Descripción | H0 | H1 | Estadístico | df | Valor p | α | Decisión |
|---|---|---|---|---|---|---|---|---|
| 1 | FC media vs 75 lpm | μ_FC = 75 | μ_FC ≠ 75 | 3.581 | 3899 | <0.001 | 0.05 | Rechazar H0 |
| 2 | Colesterol medio vs 200 mg/dL | μ_Col ≤ 200 | μ_Col > 200 | 51.456 | 3892 | <0.001 | 0.05 | Rechazar H0 |
| 3 | Proporción Colesterol > 240 vs 20% | p_Z = 0.20 | p_Z > 0.20 | 1272.817 | 1 | <0.001 | 0.05 | Rechazar H0 |
| 4 | Proporción Taquicardia vs 5% | p_W = 0.05 | p_W ≠ 0.05 | 56.162 | 1 | <0.001 | 0.05 | Rechazar H0 |
| 5 | Diferencia Colesterol medio (Fum vs NoFum) | μ_Col_Fum = μ_Col_NoFum | μ_Col_Fum ≠ μ_Col_NoFum | 2.912 | 3885 | 0.00361 | 0.05 | Rechazar H0 |
| 6 | Diferencia FC media (Fum vs NoFum) | μ_FC_Fum ≤ μ_FC_NoFum | μ_FC_Fum > μ_FC_NoFum | 3.581 | 3896 | <0.001 | 0.05 | Rechazar H0 |
| 7 | Diferencia Proporción Colesterol > 240 (Fum vs NoFum) | p_Z_Fum = p_Z_NoFum | p_Z_Fum ≠ p_Z_NoFum | 5.611 | 1 | 0.0179 | 0.05 | Rechazar H0 |
El análisis de los datos de “Smokers Health Data” mediante siete pruebas de hipótesis ha arrojado varios resultados significativos: Frecuencia Cardíaca General: La frecuencia cardíaca promedio de la muestra resultó ser significativamente diferente del valor de referencia de 75 lpm. La media muestral fue de
round(prueba_hr_media$estimate, 2)
## mean of x
## 75.69
lpm.
Niveles de Colesterol General: Se encontró evidencia de que el nivel medio de colesterol en la muestra supera el umbral de 200 mg/dL, con una media muestral de
round(prueba_chol_media$estimate, 2)
## mean of x
## 236.6
mg/dL. Proporción de Colesterol Alto (>240 mg/dL): La proporción de individuos con colesterol alto en la muestra
round(prueba_Z_proporcion$estimate*100, 1)
## p
## 42.9
% fue significativamente mayor que el 20% de referencia.
Proporción de Taquicardia (>100 lpm): La proporción de individuos con taquicardia en la muestra
round(prueba_W_proporcion$estimate*100, 1)
## p
## 2.4
% fue significativamente diferente del 5% de referencia. Al comparar fumadores y no fumadores: Colesterol Medio: Se observó una diferencia estadísticamente significativa en los niveles promedio de colesterol, siendo
ifelse(prueba_chol_dos_muestras$estimate[1] > prueba_chol_dos_muestras$estimate, "mayor en fumadores", "mayor en no fumadores")
## mean in group No Fumador mean in group Fumador
## "mayor en no fumadores" "mayor en fumadores"
round(prueba_chol_dos_muestras$estimate, 2)
## mean in group No Fumador mean in group Fumador
## 238.65 234.51
mg/dL vs.
round(prueba_chol_dos_muestras$estimate, 2)
## mean in group No Fumador mean in group Fumador
## 238.65 234.51
mg/dL. Frecuencia Cardíaca Media: Se encontró que la frecuencia cardíaca promedio de los fumadores
round(prueba_hr_dos_muestras_explicita$estimate[1], 2)
## mean of x
## 76.38
lpm) es significativamente mayor que la de los no fumadores
round(prueba_hr_dos_muestras_explicita$estimate[2], 2)
## mean of y
## 75.01
lpm. Proporción de Colesterol Alto (>240 mg/dL):
La proporción de individuos con colesterol alto difirió significativamente entre fumadores
round(prueba_Z_dos_proporciones$estimate[1]*100, 1)
## prop 1
## 41
% y no fumadores
round(prueba_Z_dos_proporciones$estimate[1]*100, 1)
## prop 1
## 41
%, siendo
ifelse(prueba_Z_dos_proporciones$estimate[1] > prueba_Z_dos_proporciones$estimate[2], "mayor en fumadores", "mayor en no fumadores")
## prop 1
## "mayor en no fumadores"
Estos resultados, en conjunto, sugieren que, en la muestra analizada, los indicadores de salud cardiovascular como la frecuencia cardíaca y los niveles de colesterol tienden a ser menos favorables en el grupo de fumadores en comparación con los no fumadores.
Por ejemplo, el hecho de que los fumadores tengan tanto un nivel promedio de colesterol más alto (Prueba 5) como una mayor proporción de individuos con colesterol clínicamente alto (Prueba 7) refuerza la asociación entre el tabaquismo y el perfil lipídico adverso.
De manera similar, una frecuencia cardíaca promedio más alta en fumadores (Prueba 6) es un hallazgo consistente con los efectos conocidos del tabaquismo sobre el sistema cardiovascular.
Es importante reconocer ciertas limitaciones de este análisis: Naturaleza Observacional: Los datos provienen de un estudio observacional (según la descripción) , lo que significa que no se pueden establecer relaciones de causalidad directa entre el tabaquismo y los indicadores de salud. Solo se pueden identificar asociaciones. Manejo de Valores Faltantes: La exclusión de casos con valores faltantes (listwise deletion implícita o explícita) podría haber reducido el tamaño muestral efectivo para algunas pruebas, potencialmente afectando la potencia de las mismas. Generalización: Los resultados son específicos de la muestra estudiada y su generalización a otras poblaciones debe hacerse con cautela, dependiendo de la representatividad de la muestra. Variables Confusoras: Este análisis no ha controlado por posibles variables confusoras (ej. edad, sexo, otras condiciones médicas) que podrían influir tanto en el hábito de fumar como en los indicadores de salud. ## 8.4. Sugerencias para Futuros Análisis Para profundizar en la comprensión de estos datos, se podrían considerar: Análisis Multivariados: Utilizar modelos de regresión para evaluar la asociación entre el tabaquismo y los indicadores de salud controlando por edad, sexo y otras covariables relevantes presentes en el dataset. Exploración de Otras Variables: El conjunto de datos contiene otras variables (ej. presión arterial, IMC, nivel de glucosa, hemoglobina, capacidad pulmonar) que podrían analizarse de manera similar. Análisis de Subgrupos: Investigar si los efectos del tabaquismo varían entre diferentes subgrupos (ej. hombres vs. mujeres, diferentes grupos de edad). IX. Apéndice: Código R Completo El siguiente es el script R Markdown completo utilizado para generar este informe.