Diferencia entre dos proporciones

Supongamos que tenemos dos poblaciones y queremos comparar la proporción de éxitos en ambas. Para ello, consideramos dos muestras aleatorias independientes de tamaño \(n_1\) y \(n_2\) de las poblaciones 1 y 2, respectivamente. La proporción de éxitos en la muestra 1 es \(\hat{p}_1\) y en la muestra 2 es \(\hat{p}_2\). La diferencia entre las proporciones de éxitos en ambas poblaciones es \(\hat{p}_1 - \hat{p}_2\).

Podemos calcular el error estándar de la diferencia entre las proporciones de éxitos en ambas poblaciones utilizando la fórmula:

\[ SE = \sqrt{\hat{p}_1(1-\hat{p}_1)/n_1 + \hat{p}_2(1-\hat{p}_2)/n_2} \]

La estimación de la diferencia entre las proporciones de éxitos en ambas poblaciones y su intervalo de confianza se puede calcular utilizando la fórmula:

\[ \hat{p}_1 - \hat{p}_2 \pm z_{\alpha/2} \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}} \]

donde \(z_{\alpha/2}\) es el valor crítico de la distribución normal estándar para un nivel de confianza de \(1-\alpha\). Este valor z lo calculamos como:

\[ z = \frac{(\hat{p}_1 - \hat{p}_2)}{SE} \]

Con este valor z se puede calcular el valor-p para la prueba de hipótesis de que la diferencia entre las proporciones es cero, utilizando la distribución normal estándar.

Cálculo del valor-p:

\[ p = 2(1 - \Phi(|z|)) \]

donde \(\Phi\) es la función de distribución acumulada de la distribución normal estándar (la función pnorm en R).

Este valor-p se compara con un nivel de significancia \(\alpha\) para determinar si se rechaza o no la hipótesis nula.

EJEMPLO 1: Prueba de Hipótesis de 2 Proporciones

La mamografía es un procedimiento de rayos X que se utiliza para detectar cáncer de mama. Si se deben utilizar las mamografías es parte de una discusión controvertida y lo utilizaremos de ejemplo de prueba de hipótesis de 2 proporciones, que podemos plantear como:

  • \(H_0: p_1 = p_2\) (la proporción de muertes por cáncer de mama es la misma en ambos grupos) o \(H_0: p_1 - p_2 = 0\)
  • \(H_a: p_1 \neq p_2\) (la proporción de muertes por cáncer de mama es diferente en ambos grupos) o \(H_a: p_1 - p_2 \neq 0\)

Descripción del estudio

Se realizó un estudio de 30 años con casi 90 000 participantes femeninas. Durante un período de detección de 5 años, cada mujer fue asignada aleatoriamente a uno de dos grupos: en el primer grupo, las mujeres recibieron mamografías regulares para detectar el cáncer de mama, y en el segundo grupo, las mujeres recibieron exámenes regulares de cáncer de mama sin mamografía. No se realizó ninguna intervención durante los siguientes 25 años del estudio, y consideraremos la muerte resultante de cáncer de mama durante el período completo de 30 años. Los resultados del estudio se resumen en la siguiente tabla.

# Load the gt package
library(gt)

# Create a data frame with the given data
death_table_df <- data.frame(
  Group = c("Mamografía", "Control"),
  Yes = c(500, 505),
  No = c(44425, 44405)
)

# Create a gt table
death_table_gt <- death_table_df %>%
  gt() %>%
  tab_header(
    title = "TABLA 1. Muertes por Cáncer de Mama",
    subtitle = "Comparación entre Mamografía y Control"
  ) %>%
  cols_label(
    Group = "Grupo",
    Yes = "Muertes por Cáncer de Mama (Sí)",
    No = "Muertes por Cáncer de Mama (No)"
  ) %>%
  fmt_number(
    columns = c(Yes, No),
    decimals = 0
  ) %>%
  tab_style(
    style = cell_borders(sides = "all", color = "gray"),
    locations = cells_body()
  )

# Print the gt table
death_table_gt
TABLA 1. Muertes por Cáncer de Mama
Comparación entre Mamografía y Control
Grupo Muertes por Cáncer de Mama (Sí) Muertes por Cáncer de Mama (No)
Mamografía 500 44,425
Control 505 44,405

Si las mamografías son mucho más efectivas que los exámenes de cáncer de mama sin mamografía, entonces esperaríamos ver muertes adicionales por cáncer de mama en el grupo de control. Por otro lado, si las mamografías no son tan efectivas como los exámenes regulares de cáncer de mama, esperaríamos ver un aumento en las muertes por cáncer de mama en el grupo de mamografía.

Prueba de Hipótesis

A continuación, realizaremos una prueba de hipótesis para determinar si hay una diferencia significativa en la proporción de muertes por cáncer de mama entre los dos grupos.

# Data from the study
mammogram_deaths <- 500
mammogram_total <- 500 + 44425

control_deaths <- 505
control_total <- 505 + 44405

# Calculate proportions
p1 <- mammogram_deaths / mammogram_total
p2 <- control_deaths / control_total

# Difference in proportions
p_diff <- p1 - p2

# Standard error of difference
SEd <- sqrt((p1*(1-p1)/mammogram_total) + (p2*(1-p2)/control_total))

# Confidence interval of difference
CId <- p_diff + c(-1, 1) * qnorm(0.975) * SEd

# Combine proportions for pooled estimate
p_pool <- (mammogram_deaths + control_deaths) / (mammogram_total + control_total)

# Standard Error
SE <- sqrt(p_pool * (1 - p_pool) * (1 / mammogram_total + 1 / control_total))

# 95% Confidence Interval
CI <- p_pool + c(-1, 1) * qnorm(0.975) * SE

# Calculate z-score
z <- (p1 - p2) / SEd

# Calculate p-value (two-tailed test)
p_value <- 2 * (1 - pnorm(abs(z)))

Lista de resultados y decisión para \(\alpha\) = 0.05:

library(dplyr)
library(gt)

# Create a data frame with the results
results_df <- data.frame(
  "Estadística" = c("Proporción 1", "Proporción 2", "Diferencia", "Error Estándar", "Intervalo de Confianza", "Valor Z", "Valor p"),
  "Valor" = c(round(p1,5), round(p2,5), round(p_diff,5), round(SEd,6), paste0("(", round(CId[1], 4), ", ", round(CId[2], 4), ")"), round(z,3), round(p_value,3)
))

# Create a gt table with the results
results_gt <- results_df %>%
  gt() %>%
  tab_header(
    title = "TABLA 2. Resultados de la Prueba de Hipótesis",
    subtitle = "Comparación de Proporciones de Muertes por Cáncer de Mama"
  ) %>%
  cols_label(
    Estadística = "Estadístico",
    Valor = "Valor"
  ) %>%
  tab_style(
    style = cell_borders(sides = "all", color = "gray"),
    locations = cells_body()
  )

results_gt
TABLA 2. Resultados de la Prueba de Hipótesis
Comparación de Proporciones de Muertes por Cáncer de Mama
Estadístico Valor
Proporción 1 0.01113
Proporción 2 0.01124
Diferencia -0.00012
Error Estándar 0.000702
Intervalo de Confianza (-0.0015, 0.0013)
Valor Z -0.164
Valor p 0.87
# Decision based on p-value
if (p_value < 0.05) {
  cat("Rechazar la hipótesis nula: Existe una diferencia significativa entre las proporciones.\n")
} else {
  cat("No se rechaza la hipótesis nula: No hay diferencia significativa entre las proporciones.\n")
}
## No se rechaza la hipótesis nula: No hay diferencia significativa entre las proporciones.

Gráfica de la distribución normal estándar con el área crítica y el valor-z

# Load ggplot2 library
library(ggplot2)

# Define the Z-score and alpha level
z_value <- -0.1639328
alpha <- 0.05

# Create a data frame for the normal distribution
x <- seq(-4, 4, length = 1000) # Range of Z-scores
y <- dnorm(x) # Standard normal distribution density
data <- data.frame(x = x, y = y)

# Calculate the critical value for negative alpha = 0.05
z_alpha <- qnorm(alpha)

# Create the plot
ggplot(data, aes(x = x, y = y)) +
  # Plot the normal distribution curve
  geom_line(color = "blue", size = 1) +
  # Shade the negative alpha area
  geom_area(data = subset(data, x <= z_alpha), aes(x = x, y = y), fill = "red", alpha = 0.5) +
  # Add a vertical line for the Z-value
  geom_vline(xintercept = z_value, color = "black", linetype = "dashed", size = 1) +
  # Add text annotation for the Z-value
  annotate("text", x = z_value, y = 0.2, label = paste("Z =", round(z_value, 3)), color = "black", hjust = -0.1) +
  # Add text annotation for alpha
  annotate("text", x = z_alpha, y = 0.05, label = expression(alpha == 0.05), color = "red", hjust = 1.2) +
  # Customize the plot
  labs(x = "Valor Z", y = "Densidad") +
  theme_minimal()

Figura 1. Gráfica de la distribución normal con el área para \(\alpha\) = 0.05 y el valor z de la diferencia de las proporciones.

Conclusiones

  • No rechazamos la hipótesis nula, lo que significa que no contamos con evidencia suficiente para concluir que las mamografías reducen o aumentan las muertes por cáncer de mama.

  • Si las mamografías son beneficiosas o perjudiciales, los datos sugieren que el efecto no es muy significativo.

  • ¿Son las mamografías más o menos costosas que un examen de mama sin mamografía? Si una opción es mucho más costosa que la otra y no ofrece beneficios claros, entonces deberíamos inclinarnos por la opción más económica.

Prueba de bondad de ajuste mediante chi-cuadrado

La prueba de bondad de ajuste mediante chi-cuadrado se utiliza para determinar si una muestra de datos se ajusta a una distribución de probabilidad específica. La hipótesis nula (\(H_0\)) es que los datos se ajustan a la distribución de probabilidad especificada, mientras que la hipótesis alternativa (\(H_a\)) es que los datos no se ajustan a la distribución de probabilidad especificada.

Los supuestos de esta prueba son:

  1. Los datos son independientes.
  2. Las categorías son mutuamente excluyentes.
  3. Las frecuencias esperadas en cada categoría son mayores que 5.

La distribución chi-cuadrado

La distribución chi-cuadrado es una distribución de probabilidad continua que se utiliza en estadística para probar la independencia de dos eventos. La distribución chi-cuadrado se utiliza en pruebas de bondad de ajuste, pruebas de independencia y pruebas de homogeneidad.

La distribución chi-cuadrado se utiliza a veces para caracterizar conjuntos de datos y estadísticas que siempre son positivos y, por lo general, con sesgo a la derecha. Recordemos que una distribución normal tenía dos parámetros (media y desviación estándar) que podían utilizarse para describir sus características exactas. La distribución chi-cuadrado tiene un solo parámetro llamado grados de libertad (gl), que influye en la forma, el centro y la dispersión de la distribución.

Ejemplo de distribución chi-cuadrado con diferentes grados de libertad

# Load necessary libraries
library(ggplot2)
  
# Create a data frame with chi-squared distributions
chi_df <- data.frame(x = seq(0, 20, by = 0.1))
chi_df$df1 <- dchisq(chi_df$x, df = 1)
chi_df$df2 <- dchisq(chi_df$x, df = 2)
chi_df$df4 <- dchisq(chi_df$x, df = 4)

# Plot chi-squared distributions
ggplot(chi_df, aes(x = x)) +
  geom_line(aes(y = df1, color = "df = 1"), size = 1) +
  geom_line(aes(y = df2, color = "df = 2"), size = 1) +
  geom_line(aes(y = df4, color = "df = 4"), size = 1) +
  labs(
       x = "Valor del estadístico", y = "Densidad") +
  scale_color_manual(values = c("df = 1" = "red", "df = 2" = "blue", "df = 4" = "green")) +
  theme_minimal()

Figura 2. Distribución chi-cuadrado con diferentes grados de libertad.

Cálculo del estadístico de prueba chi-cuadrado

El estadístico de prueba chi-cuadrado se calcula como:

\[ \chi^2 = \sum \frac{(O_i - E_i)^2}{E_i} \]

donde:

  • \(O_i\) es la frecuencia observada en la categoría \(i\).
  • \(E_i\) es la frecuencia esperada en la categoría \(i\).

Si el valor de \(\chi^2\) es mayor que el valor crítico para un \(\alpha\) predeterminado (usualmente 0.05), entonces rechazamos la hipótesis nula. Igualmente, si el valor-p es menor que \(\alpha\), rechazamos la hipótesis nula.

EJEMPLO 2: Prueba de Bondad de Ajuste

Genética Mendeliana para la distribución de probabilidad esperada. En un sistema dialélico, la proporción esperada de genotipos en la descendencia de un cruce monohíbrido es 1:2:1. Supongamos que realizamos un experimento genético y obtenemos los siguientes resultados:

# Observed and expected frequencies
observed <- c(24, 63, 18)               # Observed counts
total <- sum(observed)                   # Total sample size
expected <- total * c(1/4, 2/4, 1/4)     # Expected counts based on 1:2:1 ratio

# Perform Chi-square goodness-of-fit test
chi_sq_test <- chisq.test(x = observed, p = c(1/4, 2/4, 1/4))

# Print test results
print(chi_sq_test)
## 
##  Chi-squared test for given probabilities
## 
## data:  observed
## X-squared = 4.8857, df = 2, p-value = 0.08691
# Visualize the p-value area using ggplot2
library(ggplot2)

# Generate Chi-square distribution for visualization
df <- length(observed) - 1
x_vals <- seq(0, 20, by = 0.01)
y_vals <- dchisq(x_vals, df = df)

# Create a data frame for ggplot
chi_data <- data.frame(x = x_vals, y = y_vals)

# Critical value and observed statistic
critical_value <- qchisq(0.95, df = df)
observed_stat <- chi_sq_test$statistic

# Plot the Chi-square distribution
ggplot(chi_data, aes(x = x, y = y)) +
  geom_line(color = "blue", size = 1) +
  geom_area(data = subset(chi_data, x > critical_value), aes(x = x, y = y), fill = "red", alpha = 0.5) +
  geom_vline(xintercept = observed_stat, color = "darkgreen", linetype = "dashed", size = 1) +
  labs(,
    x = "Estadístico chi-cuadrado",
    y = "Densidad",
  ) +
  theme_minimal()

Figura 3. Distribución chi-cuadrado con la región crítica en rojo (\(\alpha = 0.05\)) y el estadístico de prueba (\(\chi^2\)) en verde oscuro.

Conclusiones

  • No podemos rechazar la hipótesis nula, lo que sugiere que los datos se ajustan a la distribución de probabilidad esperada.

Tabla de contingencia y prueba de independencia

Una tabla de contingencia es una tabla que muestra la distribución conjunta de dos o más variables categóricas. La prueba de independencia se utiliza para determinar si existe una relación significativa entre dos variables categóricas.

La hipótesis nula (\(H_0\)) es que las dos variables son independientes, mientras que la hipótesis alternativa (\(H_a\)) es que las dos variables están relacionadas.

La hipótesis se prueba con el estadístico de prueba chi-cuadrado, que se calcula como:

\[ \chi^2 = \sum_{i=1}^r \sum_{j=1}^c \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]

donde:

La frecuencia esperada \(E_{ij}\) se calcula como:

\[ E_{ij} = \frac{R_i \times C_j}{N} \]

donde:

Los grados de libertad (gl) para la prueba de independencia se calculan como:

\[ gl = (R - 1) \times (C - 1) \]

donde \(R\) es el número de filas y \(C\) es el número de columnas en la tabla de contingencia.

Una vez obtenido el valor de \(\chi^2\), se compara con el valor crítico de la distribución chi-cuadrado para determinar si se rechaza o no la hipótesis nula.

El valor-p se calcula utilizando la distribución chi-cuadrado con los grados de libertad correspondientes, mediante la función pchisq() en R.

EJEMPLO 3: Prueba de Independencia

Vamos a considerar un estudio clínico en el que se evalúa la eficacia de un tratamientos para una enfermedad. Se registraron los resultados (mejoría, igual y empeora) de los pacientes tratados con la droga y un placebo y se desea determinar si hay una asociación entre el tratamiento y la respuesta de los pacientes.

# Entrada de datos
datos_tc <- matrix(c(40, 5, 5, 18, 12, 20), nrow = 2, byrow = TRUE,
                dimnames = list(Tratamiento = c("Droga", "Placebo"),
                                Resultado = c("Mejoría", "No Cambio", "Empeora")))

TABLA 3. Tabla de Contingencia de Tratamiento y Resultado

# Create a contingency table
contingency_table <- as.table(datos_tc)
contingency_table
##            Resultado
## Tratamiento Mejoría No Cambio Empeora
##     Droga        40         5       5
##     Placebo      18        12      20

TABLA 4. Valores esperados en la tabla de contingencia

# Expected values
expected_values <- chisq.test(contingency_table)$expected
expected_values
##            Resultado
## Tratamiento Mejoría No Cambio Empeora
##     Droga        29       8.5    12.5
##     Placebo      29       8.5    12.5

TABLA 5. Resultados de la prueba de independencia

# Perform chi-square test for independence
chi_test <- chisq.test(contingency_table)

# Print results
print(chi_test)
## 
##  Pearson's Chi-squared test
## 
## data:  contingency_table
## X-squared = 20.227, df = 2, p-value = 4.053e-05
# Visualize the p-value area using ggplot2
library(ggplot2)

# Generate Chi-square distribution for visualization
df <- chi_test$parameter
x_vals <- seq(0, 20, by = 0.01)
y_vals <- dchisq(x_vals, df = df)

# Create a data frame for ggplot
chi_data <- data.frame(x = x_vals, y = y_vals)

# Critical value and observed statistic
critical_value <- qchisq(0.95, df = df)
observed_stat <- chi_test$statistic

# Plot the Chi-square distribution
ggplot(chi_data, aes(x = x, y = y)) +
  geom_line(color = "blue", size = 1) +
  geom_area(data = subset(chi_data, x > critical_value), aes(x = x, y = y), fill = "red", alpha = 0.5) +
  geom_vline(xintercept = observed_stat, color = "darkgreen", linetype = "dashed", linewidth = 1) +
  labs(
    x = "Estadístico chi-cuadrado",
    y = "Densidad"
  ) +
  theme_minimal()

Figura 4. Distribución chi-cuadrado con la región crítica en rojo (\(\alpha = 0.05\)) y el estadístico de prueba (\(\chi^2\)) en verde oscuro.

Gráfico de mosaico para la tabla de contingencia

# Load necessary libraries
library(vcd)
## Loading required package: grid
# Change names in contingency_table
rownames(contingency_table) <- c("Droga", "Placebo")
colnames(contingency_table) <- c("Mejoría", "NC", "Emp")

# Create mosaic plot
mosaic(contingency_table, shade = TRUE, legend = TRUE, labeling = labeling_values)

Figura 5. Gráfico de mosaico para la tabla de contingencia de tratamiento y resultado. Incluye el estadístico de residuales de Pearson.