Una versión matricial de cor.prueba()


Cor.test() toma vectores x y y como argumentos, pero tengo una matriz completa de datos que quiero probar, en pares. Cor() toma esta matriz como un argumento muy bien, y espero encontrar una manera de hacer lo mismo para cor.test().

El consejo común de otras personas parece ser usar cor.prob():

Https://stat.ethz.ch/pipermail/r-help/2001-November/016201.html

Pero estos valores p no son los mismos que los generados por cor.test()!!! Cor.test() también parece mejor equipado para manejar la eliminación por pares (tengo un poco de datos faltantes en mi conjunto de datos) que cor.prob().

¿Alguien tiene alguna alternativa a cor.prob()? Si la solución implica bucles anidados para, que así sea (soy lo suficientemente nuevo para R para que incluso esto sea problemático para mí).

Author: Richard Erickson, 2012-10-28

5 answers

corr.test en el paquete psych está diseñado para hacer esto:

library("psych")
data(sat.act)
corr.test(sat.act)

Como se indica en los comentarios, para replicar los p - valores de la función base cor.test() sobre toda la matriz, entonces debe desactivar el ajuste de los p-valores para comparaciones múltiples (el valor predeterminado es usar el método de ajuste de Holm):

 corr.test(sat.act, adjust = "none")

[Pero tenga cuidado al interpretar esos resultados!]

 35
Author: Sacha Epskamp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-01 17:41:49

Si usted está estrictamente después de los pvalues en un formato de matriz de cor.test aquí hay una solución descaradamente robado de Vincent (ENLACE):

cor.test.p <- function(x){
    FUN <- function(x, y) cor.test(x, y)[["p.value"]]
    z <- outer(
      colnames(x), 
      colnames(x), 
      Vectorize(function(i,j) FUN(x[,i], x[,j]))
    )
    dimnames(z) <- list(colnames(x), colnames(x))
    z
}

cor.test.p(mtcars)

Nota: Tommy también proporciona una solución más rápida, aunque menos fácil de implementar. Oh y no para bucles:)

Edit Tengo una función v_outer en mi paquete qdapTools que hace que esta tarea sea bastante fácil:

library(qdapTools)
(out <- v_outer(mtcars, function(x, y) cor.test(x, y)[["p.value"]]))
print(out, digits=4)  # for more digits
 13
Author: Tyler Rinker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:26

Probablemente la forma más fácil es usar el rcorr() desde Hmisc. Solo tomará una matriz, así que use rcorr(as.matrix(x)) si sus datos están en un data.marco. Le devolverá una lista con: 1) matriz de r en pares, 2) matriz de n en pares, 3) matriz de valores de p para las r. Ignora automáticamente los datos faltantes.

Idealmente, una función de este tipo debería tomar datos.frames too and also output confidence intervals in line with the'New Statistics'.

 4
Author: Deleet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-26 18:58:58

La solución aceptada (corr.función de prueba en el paquete psych) funciona, pero es extremadamente lento para matrices grandes. Estaba trabajando con una matriz de expresión génica (~20.000 por ~1.000) correlacionada con una matriz de sensibilidad a los fármacos (~1.000 por ~500) y tuve que detenerla porque me llevaba una eternidad.

Tomé algo de código del paquete psych y usé la función cor () directamente en su lugar y obtuve resultados mucho mejores:

# find (pairwise complete) correlation matrix between two matrices x and y
# compare to corr.test(x, y, adjust = "none")
n <- t(!is.na(x)) %*% (!is.na(y)) # same as count.pairwise(x,y) from psych package
r <- cor(x, y, use = "pairwise.complete.obs") # MUCH MUCH faster than corr.test()
cor2pvalue = function(r, n) {
  t <- (r*sqrt(n-2))/sqrt(1-r^2)
  p <- 2*(1 - pt(abs(t),(n-2)))
  se <- sqrt((1-r*r)/(n-2))
  out <- list(r, n, t, p, se)
  names(out) <- c("r", "n", "t", "p", "se")
  return(out)
}
# get a list with matrices of correlation, pvalues, standard error, etc.
result = cor2pvalue(r,n)

Incluso con dos matrices de 100 x 200, la diferencia era asombroso. Un segundo o dos contra 45 segundos.

> system.time(test_func(x,y))
   user  system elapsed 
  0.308   2.452   0.130 
> system.time(corr.test(x,y, adjust = "none"))
   user  system elapsed 
 45.004   3.276  45.814 
 2
Author: Nick Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-14 01:59:39

"La solución aceptada (funcióncorr.test en el paquete psych) funciona, pero es extremadamente lenta para matrices grandes."

Si usas ci=FALSE, entonces la velocidad es mucho más rápida. De forma predeterminada, se encuentran los intervalos de confianza. Sin embargo, esto conduce a una ligera desaceleración de la velocidad. Así que, sólo para el rs, ts y ps, conjunto ci=FALSE.

 -1
Author: user10412376,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-25 10:01:03