Distribución chi-cuadrado en R

Estadística con R Distribuciones
Distribución chi-cuadrado en R con dchisq, pchisq, qchisq y rchisq

La distribución chi-cuadrado (\(\chi^2\)) es la distribución de referencia de los test chi-cuadrado y del intervalo de confianza para la varianza. En este tutorial aprenderás a usar las funciones dchisq, pchisq, qchisq y rchisq en R, a obtener el p-valor a partir de un estadístico chi-cuadrado (evitando el error más común), a calcular valores críticos de la chi-cuadrado y a construir un intervalo de confianza para la varianza a mano.

La distribución chi-cuadrado

Si \(Z_1, Z_2, \dots, Z_k\) son variables aleatorias normales estándar independientes, la suma de sus cuadrados

\[X = Z_1^2 + Z_2^2 + \dots + Z_k^2\]

sigue una distribución chi-cuadrado con \(k\) grados de libertad (gl), lo que se denota como \(X \sim \chi^2_k\). Los grados de libertad son el único parámetro de la distribución. Además:

  • Solo toma valores no negativos, ya que es una suma de cuadrados.
  • Es asimétrica a la derecha, y la asimetría disminuye al aumentar los grados de libertad.
  • La esperanza y la varianza son \(E(X) = k\) y \(Var(X) = 2k\).
  • Con muchos grados de libertad se aproxima a una normal de media \(k\) y varianza \(2k\).

Esta distribución está detrás del test chi-cuadrado de Pearson, del estadístico del test de Kruskal-Wallis y del intervalo de confianza para la varianza de una población normal. En R, las funciones relacionadas con la distribución chi-cuadrado son las siguientes:

Función Descripción Uso habitual
dchisq Densidad chi-cuadrado
(Función de densidad de probabilidad)
Dibujar la curva
pchisq Distribución chi-cuadrado
(Función de distribución acumulada)
p-valores
qchisq Función cuantil de la distribución chi-cuadrado Valores críticos e intervalos de confianza
rchisq Generación de números
pseudoaleatorios chi-cuadrado
Simulación

La función dchisq

La función dchisq devuelve la densidad de la distribución chi-cuadrado. Su sintaxis es la siguiente:

dchisq(x,           # Vector de valores (cuantiles)
       df,          # Grados de libertad (no negativos, pueden ser no enteros)
       ncp = 0,     # Parámetro de no centralidad
       log = FALSE) # Si es TRUE, las densidades se devuelven en logaritmo

Por ejemplo, la densidad de una chi-cuadrado con 3 grados de libertad en 0.5, 1, 2 y 5 es:

dchisq(c(0.5, 1, 2, 5), df = 3)
[1] 0.21969564 0.24197072 0.20755375 0.07322491

Recuerda que una densidad no es una probabilidad. Por ejemplo, dchisq(0, df = 1) devuelve Inf, porque la curva con 1 grado de libertad tiende a infinito en el cero, mientras que con 2 gl la densidad en cero es 0.5 y con 3 o más gl es 0.

Dibujar la distribución chi-cuadrado en R

La forma de la distribución cambia mucho con los grados de libertad. El siguiente código dibuja la densidad para 1, 2, 3, 5 y 10 grados de libertad con un bucle for:

# Rejilla de valores del eje X
x <- seq(0, 20, length = 300)

gl <- c(1, 2, 3, 5, 10)
cols <- c("red", "orange", "darkgreen", "blue", "purple")

# Gráfico vacío
plot(x, dchisq(x, df = 1), type = "n", ylim = c(0, 0.5),
     xlab = "x", ylab = "Densidad")

# Una línea para cada valor de gl
for (i in seq_along(gl)) {
  lines(x, dchisq(x, df = gl[i]), lwd = 2, col = cols[i])
}

legend("topright", legend = paste("gl =", gl), col = cols,
       lwd = 2, box.lty = 0)

Distribución chi-cuadrado en R con 1, 2, 3, 5 y 10 grados de libertad

Con 1 y 2 grados de libertad la densidad es decreciente. A partir de 3 gl la curva tiene un máximo (la moda es \(k - 2\)) y, a medida que \(k\) aumenta, se desplaza a la derecha y se vuelve más simétrica.

La función pchisq

La función pchisq devuelve la función de distribución acumulada, \(P(X \leq q)\). Con lower.tail = FALSE obtienes la cola superior, \(P(X > q)\).

pchisq(q,                 # Vector de cuantiles
       df,                # Grados de libertad
       ncp = 0,           # Parámetro de no centralidad
       lower.tail = TRUE, # Si es TRUE, P(X <= q); si no, P(X > q)
       log.p = FALSE)     # Si es TRUE, las probabilidades se devuelven en logaritmo

Por ejemplo, la probabilidad de que una chi-cuadrado con 3 gl sea menor o igual que 3 y la probabilidad de que sea mayor que 3:

pchisq(3, df = 3)                     # P(X <= 3)
pchisq(3, df = 3, lower.tail = FALSE) # P(X > 3)
[1] 0.6083748
[1] 0.3916252

p-valor a partir del estadístico chi-cuadrado

En los test chi-cuadrado, los valores grandes del estadístico son evidencia en contra de la hipótesis nula, así que el p-valor es siempre la probabilidad de la cola superior, \(P(X > \chi^2_{obs})\).

Considera el ejemplo del test chi-cuadrado de independencia entre el precio y la calidad de 100 productos:

datos <- matrix(c(40, 20, 10, 30), nrow = 2)
rownames(datos) <- c("Precio alto", "Precio bajo")
colnames(datos) <- c("Calidad alta", "Calidad baja")

chi <- chisq.test(datos)
chi
	Pearson's Chi-squared test with Yates' continuity correction

data:  datos
X-squared = 15.042, df = 1, p-value = 0.0001052

Puedes acceder al estadístico y a los grados de libertad con chi$statistic y chi$parameter y calcular el p-valor con pchisq:

# Cola superior: P(X > estadístico)
pchisq(chi$statistic, df = chi$parameter, lower.tail = FALSE)
   X-squared
0.0001051636

El resultado es el mismo p-valor que devuelve chisq.test. Esto te será útil cuando solo tengas el estadístico, por ejemplo, de un artículo o de otro software, y necesites el p-valor.

El error más común es olvidar lower.tail = FALSE. pchisq(15.042, df = 1) devuelve 0.9998949, que es uno menos el p-valor, y te llevaría a la conclusión contraria. A diferencia del t-test, no tienes que multiplicar por 2: los test chi-cuadrado son unilaterales por construcción.

La función qchisq

La función qchisq es la inversa de pchisq: devuelve el valor \(q\) que deja una probabilidad \(p\) a su izquierda. Sus usos principales son los valores críticos y los intervalos de confianza.

qchisq(p,                 # Vector de probabilidades
       df,                # Grados de libertad
       ncp = 0,           # Parámetro de no centralidad
       lower.tail = TRUE, # Si es TRUE, P(X <= x); si no, P(X > x)
       log.p = FALSE)     # Si es TRUE, las probabilidades se dan en logaritmo

Valores críticos de la chi-cuadrado

Como la región de rechazo de un test chi-cuadrado está en la cola superior, el valor crítico para un nivel de significación \(\alpha\) es el cuantil \(1 - \alpha\):

qchisq(0.95, df = 1)                     # alpha = 0.05, gl = 1
qchisq(0.05, df = 1, lower.tail = FALSE) # Equivalente
qchisq(0.95, df = 3)                     # alpha = 0.05, gl = 3
[1] 3.841459
[1] 3.841459
[1] 7.814728

Fíjate en que \(3.841 = 1.96^2\): con un grado de libertad la chi-cuadrado es el cuadrado de una normal estándar, así que qchisq(0.95, 1) es igual a qnorm(0.975)^2.

Veamos cómo usar el valor crítico en un test de bondad de ajuste. Supón que 100 clientes eligieron entre cuatro colores de un producto y quieres contrastar si todos los colores son igual de populares:

obs <- c(25, 18, 22, 35)
chisq.test(obs)
	Chi-squared test for given probabilities

data:  obs
X-squared = 6.32, df = 3, p-value = 0.09704

El estadístico (6.32) es menor que el valor crítico con 3 gl (7.815), así que no rechazas la hipótesis nula al 5%. Los dos enfoques llevan siempre a la misma decisión: estadístico mayor que el valor crítico equivale a p-valor menor que \(\alpha\).

El siguiente código crea una tabla con los valores críticos para varios grados de libertad y niveles de significación:

gl <- c(1:10, 15, 20, 30)
alpha <- c(0.10, 0.05, 0.01)

crit <- sapply(alpha, function(a) qchisq(1 - a, df = gl))
dimnames(crit) <- list(gl = gl, alpha = alpha)
round(crit, 3)
    alpha
gl      0.1   0.05   0.01
  1   2.706  3.841  6.635
  2   4.605  5.991  9.210
  3   6.251  7.815 11.345
  4   7.779  9.488 13.277
  5   9.236 11.070 15.086
  6  10.645 12.592 16.812
  7  12.017 14.067 18.475
  8  13.362 15.507 20.090
  9  14.684 16.919 21.666
  10 15.987 18.307 23.209
  15 22.307 24.996 30.578
  20 28.412 31.410 37.566
  30 40.256 43.773 50.892

Intervalo de confianza para la varianza

Si los datos proceden de una población normal, \((n-1)s^2/\sigma^2\) sigue una distribución chi-cuadrado con \(n - 1\) grados de libertad. Por tanto, el intervalo de confianza para la varianza \(\sigma^2\) con nivel de confianza \(1 - \alpha\) es

\[\left( \frac{(n-1)s^2}{\chi^2_{1-\alpha/2,\, n-1}}, \frac{(n-1)s^2}{\chi^2_{\alpha/2,\, n-1}} \right)\]

Fíjate en que el intervalo no es simétrico respecto a \(s^2\), porque la chi-cuadrado tampoco lo es. R base no tiene una función para este intervalo, pero puedes calcularlo con qchisq y var. Para la variable mpg de mtcars:

x <- mtcars$mpg
n <- length(x)
s2 <- var(x) # 36.3241

alpha <- 0.05
inf <- (n - 1) * s2 / qchisq(1 - alpha / 2, df = n - 1)
sup <- (n - 1) * s2 / qchisq(alpha / 2, df = n - 1)

# Intervalo para la varianza
c(inf, sup)

# Intervalo para la desviación típica
sqrt(c(inf, sup))
[1] 23.34653 64.20343
[1] 4.831825 8.012704

Es decir, la varianza poblacional está entre 23.35 y 64.20 con una confianza del 95%, y la desviación típica (6.03 en la muestra) entre 4.83 y 8.01. Fíjate en lo ancho que es el intervalo con 32 observaciones: las varianzas se estiman con mucha menos precisión que las medias.

A diferencia del intervalo para la media, este intervalo es muy sensible a la falta de normalidad, incluso con muestras grandes. Comprueba antes la normalidad de los datos, por ejemplo, con el test de Shapiro-Wilk.

La función rchisq

La función rchisq genera observaciones aleatorias de una distribución chi-cuadrado. Usa set.seed para que los resultados sean reproducibles:

rchisq(n,       # Número de observaciones a generar
       df,      # Grados de libertad
       ncp = 0) # Parámetro de no centralidad
set.seed(1)
rchisq(5, df = 3)
[1] 0.9433146 5.5437816 5.3543968 2.9152466 5.0531908

Una buena forma de entender la definición de la distribución es simularla. El siguiente código genera 100000 sumas de tres normales estándar al cuadrado y compara su media y su varianza con las de rchisq con 3 grados de libertad. Según la teoría, ambas deberían estar cerca de \(k = 3\) y \(2k = 6\):

set.seed(1)

# Suma de 3 normales estándar al cuadrado
z <- matrix(rnorm(100000 * 3), ncol = 3)
q <- rowSums(z^2)

# Chi-cuadrado con 3 gl
y <- rchisq(100000, df = 3)

c(media = mean(q), varianza = var(q))
c(media = mean(y), varianza = var(y))
   media varianza
3.004272 6.028960
   media varianza
2.990382 5.948571

Las dos simulaciones dan una media próxima a 3 y una varianza próxima a 6. También puedes comprobarlo visualmente con un histograma de las sumas simuladas y la densidad teórica superpuesta:

set.seed(1)
z <- matrix(rnorm(100000 * 3), ncol = 3)
q <- rowSums(z^2)

hist(q, breaks = 60, prob = TRUE, col = "lightgray", border = "white",
     main = "", xlab = "Suma de 3 N(0, 1) al cuadrado", ylab = "Densidad",
     xlim = c(0, 20))
curve(dchisq(x, df = 3), add = TRUE, lwd = 2, col = "red")

Histograma de la suma de tres normales al cuadrado y densidad chi-cuadrado con 3 grados de libertad

La curva roja se ajusta perfectamente al histograma. Por último, todas las funciones aceptan el argumento ncp para la distribución chi-cuadrado no central, que es la distribución del estadístico cuando la hipótesis nula es falsa y se usa en el cálculo de la potencia.