17 votos

R: calcular la correlación por grupo

En R, tengo un marco de datos que comprende una etiqueta de clase C (un factor) y dos medidas, M1 y M2 . ¿Cómo puedo calcular la correlación entre M1 y M2 dentro de cada clase?

Lo ideal sería obtener un marco de datos con una fila para cada clase y dos columnas: la etiqueta de la clase C y la correlación.

20voto

Scott Cowan Puntos 1564

Creo que la solución de Henry tampoco funciona. En ese ejemplo, llego a 2 a = ta 3 t = a 6 b 3 t 2 . Pero creo que esta construcción se puede arreglar.

Consideremos el grupo de mapas lineales afines f(x) = αx+β sobre los reales ℝ. Que a actúe por multiplicación por α, donde α es trascendental, que b actúe sumando 1, que F sea el semigrupo que generan y que G sea el grupo que generan. F es libre porque dos palabras distintas en a y b, si tienen el mismo grado en a, tienen en ellas dos polinomios distintos en α con coeficientes enteros no negativos. (Es interesante que α debe ser trascendental para que esto funcione.) Entonces G contiene un ℤ x ℤ, generado por la adición de 1 y la adición de α.

12voto

Dillie-O Puntos 193

Si se inclina por utilizar las funciones del paquete base, puede utilizar la función by y, a continuación, volver a ensamblar los datos:

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)

# This returns a "by" object
result <- by(xx[,2:3], xx$group, function(x) {cor(x$a, x$b)})

# You get pretty close to what you want if you coerce it into a data frame via a matrix
result.dataframe <- as.data.frame(as.matrix(result))

# Add the group column from the row names
result.dataframe$C <- rownames(result)

9voto

ebarrera Puntos 107

Otro ejemplo utilizando los paquetes base y los datos de ejemplo de Tal:

DataCov <- do.call( rbind, lapply( split(xx, xx$group),
             function(x) data.frame(group=x$group[1], mCov=cov(x$a, x$b)) ) )

2voto

Yoplitein Puntos 28

Usar data.table es más corto que dplyr

dt <- data.table(xx)
dtCor <- dt[, .(mCor = cor(M1,M2)), by=C]

0voto

usef_ksa Puntos 345

Aquí hay un método similar que le dará una tabla con los valores n y p para cada correlación también (redondeado a 3 lugares decimales para la conveniencia):

library(Hmisc)
corrByGroup <- function(xx){
  return(data.frame(cbind(correl = round(rcorr(xx$a, xx$b)$r[1,2], digits=3),
                          n = rcorr(xx$a, xx$b)$n[1,2],
                          pvalue = round(rcorr(xx$a, xx$b)$P[1,2], digits=3))))
}

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