Корреляционная матрица R по группам с использованием Спирмена

Я пытаюсь создать набор матриц корреляции по разным уровням факторной переменной.

На этот вопрос уже был дан ответ (корреляция копейщика по группам в R), но не для матрицы, и результат вектора не кажется обобщающим, насколько я могу судить.

Приведенный ниже код работает, но не может быть записан в csv, так как by () выводит список - ошибка "не может привести класс" "по" "к data.frame"

cor1<- by(data, INDICES=data$factor0, FUN = function(x) cor(x[,c("x","y","z","a",
    "b","c")],method="spearman",use="pairwise"))

Итак, я ищу метод для принуждения вышеуказанного в data.frame, чтобы я мог записать его в csv, или для получения вышеуказанного результата с помощью альтернативного метода, который выводит фрейм данных

Любая помощь очень ценится


person Impossible9    schedule 11.12.2014    source источник
comment
Пожалуйста, предоставьте dput(cor1)   -  person David Arenburg    schedule 11.12.2014


Ответы (3)


Причина, по которой вы получаете список, заключается в том, что если x является матрицей, то cor(x) также будет матрицей, а не скаляром. В данном случае это будет матрица 6х6. В результате получается список матриц 6x6, по одной для каждого уровня факторов.

Мне кажется, это естественный способ представить результат. Вы можете превратить это в единый фрейм данных, если хотите, хотя я не уверен, что именно вы хотите, чтобы строки и столбцы представляли. Вот один вариант.

data<-matrix(rnorm(500),100,5)
colnames(data)<-letters[1:5]
factors<-sample(LETTERS[1:3],100,T)
cors<-by(data,factors,cor)
cors[[1]]
#             a           b           c           d           e
# a  1.00000000  0.05389618 -0.16944040  0.25747174  0.21660217
# b  0.05389618  1.00000000  0.22735796 -0.06002965 -0.30115444
# c -0.16944040  0.22735796  1.00000000 -0.06625523 -0.01120225
# d  0.25747174 -0.06002965 -0.06625523  1.00000000  0.10402791
# e  0.21660217 -0.30115444 -0.01120225  0.10402791  1.00000000

corsMatrix<-do.call(rbind,lapply(cors,function(x)x[upper.tri(x)]))
names<-outer(colnames(data),colnames(data),paste,sep="X")
colnames(corsMatrix)<-names[upper.tri(names)]
corsMatrix

#           aXb         aXc        bXc         aXd         bXd         cXd
# A  0.05389618 -0.16944040 0.22735796  0.25747174 -0.06002965 -0.06625523
# B -0.34231682 -0.14225269 0.20881053 -0.14237661  0.25970138  0.27254840
# C  0.27199944 -0.01333377 0.06402734  0.02583126 -0.03336077 -0.02207024
#           aXe        bXe         cXe         dXe
# A 0.216602173 -0.3011544 -0.01120225  0.10402791
# B 0.347006942 -0.2207421  0.33123175 -0.05290809
# C 0.007748369 -0.1257357  0.23048709  0.16037247

Я не уверен, что это то, что вы ищете. Другой вариант - экспортировать каждую корреляционную матрицу в отдельный файл csv.

person mrip    schedule 11.12.2014
comment
Это хороший момент, лучше всего в качестве списка матриц. Проблема в том, что я хочу получить эти матрицы в Excel. Можно ли преобразовать элемент списка во фрейм данных? Тогда у меня было бы (для трех уровней фактора) три фрейма данных, и я мог бы записать каждый из них в csv - person Impossible9; 11.12.2014
comment
Вам не нужно принуждать их к фреймам данных. Вы можете записывать матрицы прямо в csv. Как в write.csv(cors[[1]],"temp.csv"). Просто переберите вывод by. - person mrip; 11.12.2014

Вы можете использовать ddply из пакета library(plyr):

 library(plyr)
 n <- 1e2
 mdat <- data.frame(factor0 = factor(LETTERS[sample(26, n, TRUE)]), x = rnorm(n), 
                                     y = rnorm(n), z = rnorm(n), a = rnorm(n), b = rnorm(n),
                                     c = rnorm(n))
 ddply(mdat, .(factor0), function(d) {
      ret <- as.data.frame(cor(d[, letters[c(1:3, 24:26)]], method="spearman",use="pairwise"))
      ret$col <- letters[c(1:3, 24:26)]
      ret[, c(7, 1:6)]})
person thothal    schedule 11.12.2014

Ваш вопрос не так понятен, по крайней мере, для меня. Если я правильно понял, вам может потребоваться сначала попарная матрица, прежде чем вычислять корреляцию. Вы можете попробовать следующую функцию в SciencesPo.

требуется (SciencesPo)

m<-rprob(mtcars, df = nrow(mtcars) - 2)

Следующее будет складывать вашу матрицу, так что станет легче проверять r и связанные p-значения.

rstack(m)

person daniel    schedule 11.12.2014