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í).
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!]
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
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'.
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
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
.
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