2011-10-23 15 views
5

Ésta es la salida normal de la prueba:pairwise.wilcox.test - Salida de reformateo

attach(airquality) 
pw <- pairwise.wilcox.test(Ozone, Month, p.adj = "bonf") 
pw 

data: Ozone and Month 

    May Jun Jul Aug 
Jun 1.0000 -  -  -  
Jul 0.0003 0.1414 -  -  
Aug 0.0012 0.2591 1.0000 -  
Sep 1.0000 1.0000 0.0074 0.0325 

Hace poco tuvieron que realizar una prueba con 10 niveles de un factor. Si bien el formato triangular inferior de pairwise.wilcox.test es útil y conciso, pensé que sería conveniente organizarlo de manera similar a la salida de Tukey HSD, donde cada combinación de pares se enumera junto con su valor de p asociado. Este fue mi intento de hacer esto:

pw.df <- as.data.frame(pw$p.value) 
pw.diff <- vector("character") 
pw.pval <- vector("numeric") 
for (i in 1:ncol(pw.df)) 
    for (j in i:length(pw.df)) { 
    pw.diff <- c(pw.diff,paste(colnames(pw.df[i]),"-",rownames(pw.df)[j])) 
    pw.pval <- c(pw.pval,pw.df[j,i]) 
    } 


# order them by ascending p value 
v <- order(pw.pval,decreasing = F) 
pw.df <- data.frame(pw.diff[v],pw.pval[v]) 


# display those that are significant at the 5% level 
pw.df[pw.df$pw.pval<0.05,] 

    pw.diff.v. pw.pval.v. 
1 May - Jul 0.000299639 
2 May - Aug 0.001208078 
3 Jul - Sep 0.007442604 
4 Aug - Sep 0.032479550 

Si alguien tiene alguna consejos/trucos/consejos sobre cómo hacer esto más fácil y/o más elegante Le agradecería.

Respuesta

9

Usaría el paquete reshape o reshape2 para esta tarea, específicamente el comando melt(). El objeto devuelto por pairwise.wilcox.test contiene los datos de interés en la tercera ranura, así que algo como melt(pw[[3]]) debe hacer el truco:

X1 X2  value 
1 Jun May 1.000000000 
2 Jul May 0.000299639 
3 Aug May 0.001208078 
4 Sep May 1.000000000 
5 Jun Jun   NA 
.... 
+0

Eso es grande. Gracias :) –