14.11: Eliminación del supuesto de normalidad
- Page ID
- 151281
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Ahora que hemos visto cómo verificar la normalidad, naturalmente nos llevan a preguntar qué podemos hacer para abordar las violaciones a la normalidad. En el contexto de un ANOVA unidireccional, la solución más fácil es probablemente cambiar a una prueba no paramétrica (es decir, una que no se base en ninguna suposición particular sobre el tipo de distribución involucrada). Ya hemos visto pruebas no paramétricas antes, en el Capítulo 13: cuando solo tienes dos grupos, la prueba de Wilcoxon proporciona la alternativa no paramétrica que necesitas. Cuando tengas tres o más grupos, puedes usar la prueba de suma de rangos de Kruskal-Wallis (Kruskal y Wallis 1952). Entonces esa es la prueba de la que hablaremos a continuación.
lógica detrás de la prueba de Kruskal-Wallis
La prueba de Kruskal-Wallis es sorprendentemente similar al ANOVA, de alguna manera. En ANOVA, comenzamos con Y ik, el valor de la variable de resultado para la i-ésima persona en el grupo késimo. Para la prueba de Kruskal-Wallis, lo que haremos es clasificar todos estos valores Y ik, y realizar nuestro análisis sobre los datos clasificados. Entonces dejemos que R ik se refiera al ranking dado al i-ésimo miembro del grupo késimo. Ahora, calculemos\(\ \bar{R_k}\), el rango promedio dado a las observaciones en el grupo késimo:
\(\bar{R}_{k}=\dfrac{1}{N_{K}} \sum_{i} R_{i k}\)
y calculemos también\(\ \bar{R}\), el gran rango medio:
\(\bar{R}=\dfrac{1}{N} \sum_{i} \sum_{k} R_{i k}\)
Ahora que hemos hecho esto, podemos calcular las desviaciones cuadradas del rango medio grande\(\ \bar{R}\). Cuando hacemos esto para las puntuaciones individuales —es decir, si calculamos (\(\ R_{ik} - \bar{R})^2\)—, lo que tenemos es una medida “no paramétrica” de hasta qué punto la observación ik-ésima se desvía del rango de la gran media. Cuando calculamos la desviación cuadrada de las medias grupales a partir de las grandes medias —es decir, si calculamos (\(\ \bar{R_k} - \bar{R})^2 \)—, entonces lo que tenemos es una medida no paramétrica de cuánto se desvía el grupo del rango de la gran media. Con esto en mente, sigamos la misma lógica que hicimos con ANOVA, y definamos nuestras sumas clasificadas de medidas cuadradas de la misma manera que hicimos antes. Primero, tenemos nuestras “sumas totales clasificadas de cuadrados”:
\(\mathrm{RSS}_{t o t}=\sum_{k} \sum_{i}\left(R_{i k}-R\right)^{2}\)
y podemos definir el “entre grupos clasificados sumas de cuadrados” así:
\(\begin{aligned} \mathrm{RSS}_{b} &=\sum_{k} \sum_{i}\left(\bar{R}_{k}-\bar{R}\right)^{2} \\ &=\sum_{k} N_{k}\left(\bar{R}_{k}-\bar{R}\right)^{2} \end{aligned}\)
Entonces, si la hipótesis nula es verdadera y no hay diferencias de grupo verdaderas en absoluto, esperarías que las sumas de rango entre grupos RSS b sean muy pequeñas, mucho más pequeñas que las sumas de rango total RSS tot. Cualitativamente esto es muy similar a lo que encontramos cuando fuimos a construir el estadístico ANOVA F; pero por razones técnicas el estadístico de prueba de Kruskal-Wallis, generalmente denotado K, se construye de una manera ligeramente diferente:
\(\ K = (N-1)\ x\ {RSS_b \over RSS_{tot}}\)
y, si la hipótesis nula es verdadera, entonces la distribución de muestreo de K es aproximadamente chi-cuadrado con G-1 grados de libertad (donde G es el número de grupos). Cuanto mayor sea el valor de K, menos consistentes son los datos con hipótesis nula, por lo que esta es una prueba unilateral: rechazamos H 0 cuando K es suficientemente grande.
Detalles adicionales
La descripción de la sección anterior ilustra la lógica detrás de la prueba de Kruskal-Wallis. A nivel conceptual, esta es la forma correcta de pensar cómo funciona la prueba. Sin embargo, desde una perspectiva puramente matemática es innecesariamente complicado. No te voy a mostrar la derivación, pero puedes usar un poco de jiggery-pokery algebraico 213 para demostrar que la ecuación para K se puede reescribir como
\(K=\dfrac{12}{N(N-1)} \sum_{k} N_{k} \bar{R}_{k}^{2}-3(N+1)\)
Es esta última ecuación que a veces ves dada para K. Esto es mucho más fácil de calcular que la versión que describí en la sección anterior, es solo que no tiene sentido para los humanos reales. Probablemente sea mejor pensar en K como lo describí antes... como un análogo de ANOVA basado en rangos. Pero ten en cuenta que el estadístico de prueba que se calcula termina con un aspecto bastante diferente al que usamos para nuestro ANOVA original.
Pero espera, ¡hay más! Querido señor, ¿por qué siempre hay más? La historia que he contado hasta ahora solo es verdadera cuando no hay vínculos en los datos brutos. Es decir, si no hay dos observaciones que tengan exactamente el mismo valor. Si hay vínculos, entonces tenemos que introducir un factor de corrección a estos cálculos. En este punto estoy asumiendo que incluso el lector más diligente ha dejado de preocuparse (o al menos ha formado la opinión de que el factor de corrección de empate es algo que no requiere de su atención inmediata). Entonces te diré muy rápidamente cómo se calcula, y omitiré los tediosos detalles sobre por qué se hace de esta manera. Supongamos que construimos una tabla de frecuencias para los datos brutos, y dejamos que f j sea el número de observaciones que tienen el j-ésimo valor único. Esto puede sonar un poco abstracto, así que aquí está el código R que muestra un ejemplo concreto:
f <- table( clin.trial$mood.gain ) # frequency table for mood gain
print(f) # we have some ties
##
## 0.1 0.2 0.3 0.4 0.5 0.6 0.8 0.9 1.1 1.2 1.3 1.4 1.7 1.8
## 1 1 2 1 1 2 1 1 1 1 2 2 1 1
Al mirar esta tabla, observe que la tercera entrada en la tabla de frecuencias tiene un valor de 2. Ya que esto corresponde a un estado de ánimo.ganancia
de 0.3, esta tabla nos está diciendo que el estado de ánimo de dos personas aumentó en 0.3. Más al grano, tenga en cuenta que podemos decir que f [3]
tiene un valor de 2
. O bien, en la notación matemática que introduje anteriormente, esto nos está diciendo que f 3 =2. Yay. Entonces, ahora que sabemos esto, el factor de corrección de empate (TCF) es:
\(\mathrm{TCF}=1-\dfrac{\sum_{j} f_{j}^{3}-f_{j}}{N^{3}-N}\)
El valor de empate corregido del estadístico Kruskal-Wallis obtenido dividiendo el valor de K por esta cantidad: es esta versión corregida por empate la que R calcula. Y por fin, en realidad hemos terminado con la teoría de la prueba de Kruskal-Wallis. Estoy seguro de que todos ustedes están terriblemente aliviados de que los haya curado de la ansiedad existencial que naturalmente surge cuando se dan cuenta de que no saben cómo calcular el factor de corrección de vínculo para la prueba de Kruskal-Wallis. ¿Verdad?
ejecutar la prueba de Kruskal-Wallis en R
A pesar del horror por el que hemos pasado al tratar de entender lo que realmente hace la prueba de Kruskal-Wallis, resulta que ejecutar la prueba es bastante indoloro, ya que R tiene una función llamada kruskal.test ()
. La función es bastante flexible, y le permite ingresar sus datos de varias maneras diferentes. La mayoría de las veces tendrás datos como el conjunto de datos clin.trial
, en el que tienes tu variable de resultado mood.gain
, y un fármaco
variable de agrupación. Si es así, puede llamar a la función kruskal.test ()
especificando una fórmula y un marco de datos:
kruskal.test(mood.gain ~ drug, data = clin.trial)
##
## Kruskal-Wallis rank sum test
##
## data: mood.gain by drug
## Kruskal-Wallis chi-squared = 12.076, df = 2, p-value = 0.002386
Una segunda forma de usar la función kruskal.test ()
, que probablemente no tendrá muchas razones para usar, es especificar directamente la variable de resultado y la variable de agrupación como argumentos de entrada separados, x
y g
:
kruskal.test(x = clin.trial$mood.gain, g = clin.trial$drug)
##
## Kruskal-Wallis rank sum test
##
## data: clin.trial$mood.gain and clin.trial$drug
## Kruskal-Wallis chi-squared = 12.076, df = 2, p-value = 0.002386
Esto no es muy interesante, ya que es simplemente más fácil especificar una fórmula. Sin embargo, a veces puede ser útil especificar x
como una lista. Lo que quiero decir es esto. Supongamos que en realidad tenías datos como tres variables separadas, placebo
, anxifree
y joyzepam
. Si ese es el formato en el que están tus datos, entonces es conveniente saber que puedes agrupar los tres juntos como una lista:
mood.gain <- list( placebo, joyzepam, anxifree )
kruskal.test( x = mood.gain )
Y nuevamente, esto te daría exactamente los mismos resultados que el comando que intentamos originalmente.