1 votos

Ajuste de las pruebas múltiples de Kruskal-Wallis

He ejecutado 3 algoritmos de aprendizaje automático diferentes en 10 conjuntos de datos distintos, generando una precisión en cada uno de ellos. Mi hipótesis es que dos de los algoritmos son sistemáticamente mejores que el tercero. Me he dado cuenta de que las precisiones no se distribuyen normalmente, por lo que quiero utilizar pruebas no paramétricas.

Mi idea inicial sobre cómo evaluar cualquier diferencia es ejecutar Kruskal-Wallis en cada conjunto de datos, para ver si hay una diferencia significativa en las precisiones de cada algoritmo. Dado que ejecutaría K-W 10 veces, ¿tendría que tener en cuenta esto con un método de corrección de comparaciones múltiples?

Si en alguno de los conjuntos de datos obtengo un resultado significativo, realizaría un análisis post-hoc. Por lo que he visto, no hay muchas técnicas post-hoc sencillas (en R) y no paramétricas, por lo que realizaría 3 pruebas U de Mann-Whitney por pares entre las puntuaciones de cada algoritmo.

Mis preguntas son:

  1. ¿Es la realización de 10 pruebas K-W el enfoque correcto para la primera parte? Si es así, ¿tendré que corregir las pruebas múltiples?
  2. ¿Es mi análisis post-hoc un buen enfoque?

1voto

llg179 Puntos 1

Demos un paso atrás y veamos cómo serían los datos. Por lo que describes, 3 algoritmos (es decir, grupos o tratamientos) y 10 conjuntos de datos (es decir, sujetos). En este caso, tiene un diseño dentro de los sujetos (es decir, medidas repetidas) con un factor. Una forma de representar esto es así:

set.seed(123)
df <- data.frame(dataset = rep(seq(10), 3), 
                 algorithm = rep(c("ML1","ML2","ML3"), each=10), 
                 Accuracy = runif(30))
> df
   dataset algorithm   Accuracy
1        1       ML1 0.28757752
2        2       ML1 0.78830514
3        3       ML1 0.40897692
4        4       ML1 0.88301740
5        5       ML1 0.94046728
6        6       ML1 0.04555650
7        7       ML1 0.52810549
8        8       ML1 0.89241904
9        9       ML1 0.55143501
10      10       ML1 0.45661474
11       1       ML2 0.95683335
12       2       ML2 0.45333416
13       3       ML2 0.67757064
14       4       ML2 0.57263340
15       5       ML2 0.10292468
16       6       ML2 0.89982497
17       7       ML2 0.24608773
18       8       ML2 0.04205953
19       9       ML2 0.32792072
20      10       ML2 0.95450365
21       1       ML3 0.88953932
22       2       ML3 0.69280341
23       3       ML3 0.64050681
24       4       ML3 0.99426978
25       5       ML3 0.65570580
26       6       ML3 0.70853047
27       7       ML3 0.54406602
28       8       ML3 0.59414202
29       9       ML3 0.28915974
30      10       ML3 0.14711365

Lo normal es que veas ejemplos que tienen como etiqueta "tema". En su caso, sus "sujetos" son "conjuntos de datos". Si se puede asumir la normalidad, se haría un ANOVA de medidas repetidas. Sin embargo, usted afirma que sabe que las precisiones no se distribuyen normalmente y naturalmente quiere un método no paramétrico. Su conjunto de datos también está equilibrado (10 muestras/grupo), por lo que podemos utilizar la prueba de Friedman (que esencialmente es un ANOVA de medidas repetidas no paramétrico).

Si obtiene un valor p significativo en la prueba, deberá realizar un análisis post-hoc con una prueba de Wilcoxon por pares con algún tipo de corrección (por ejemplo, Bonferroni, Holm, etc.). No utilizaría Mann-Whitney porque tiene datos de "medidas emparejadas/repetidas".

Por último, probablemente quiera conocer el tamaño del efecto de cualquier diferencia significativa. Para ello también se utilizaría la prueba de wilcoxon. En R no hay ninguna función que pueda recordar ahora mismo, pero la ecuación es muy simple:

$$r=\frac{Z}{sqrt(N)}$$

Donde Z es la puntuación Z y N es el tamaño de la muestra (entre los dos grupos que se comparan). Puede obtener esta puntuación Z utilizando la función wilcoxsign_test de la coin paquete.

Utilizando los datos anteriores, esto se puede hacer en R con lo siguiente. Tenga en cuenta que los datos anteriores fueron generados aleatoriamente, por lo que no son significativos. Esto es sólo para demostrar algo de código:

# Friedman Test
friedman.test(Accuracy ~ algorithm|dataset, data=df)

# Post-hoc tests with 'bonferroni correction'
with(df, pairwise.wilcox.test(Accuracy, algorithm, p.adj="bonferroni", paired=T))

# Get Z-score for calculating effect-size
library(coin)
with(df, wilcoxsign_test(Accuracy ~ factor(algorithm)|factor(dataset), 
                         data=df[algorithm == "ML1" | algorithm == "ML2",]))

# Calculate effect size, in this case Z = -0.2548, two groups is 20 datasets
0.2548/sqrt(20)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X