2014-12-11 1 views
0

다양한 변수 수준의 계수 변수로 상관 행렬을 만들려고합니다.R 상관 매트릭스는 스피어 맨을 사용하여 그룹으로 구성됩니다.

이 질문은 이전에 응답했지만 (spearman correlation by group in R) 매트릭스가 아니며 벡터 결과는 내가 볼 수있는 한 일반화하지 않는 것 같습니다.

아래 코드는 작동하지만 (기준으로서 CSV 기록 할 수없는)리스트를 출력

- 오류

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에 기록하거나 데이터 프레임을 출력하는 대체 방법으로 위의 결과를 산출 할 수 있도록 위의 내용을 data.frame으로 강제 변환하는 방법을 찾고있다.

어떤 도움도 크게 받으실 수 있습니다.

+1

제발'dput (cor1)'을 제공하십시오 –

답변

0

목록을 얻는 이유는 xcor(x)이 아닌 행렬이 될 것이고 스칼라는 아닙니다. 이 경우 6x6 매트릭스가됩니다. 결과는 각 요소 수준에 대해 하나씩 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 파일로 내보내는 것입니다.

+0

이것은 좋은 지적입니다, 그것은 행렬의리스트로서 가장 좋습니다. 문제는 이러한 행렬을 Excel로 가져 오려고하는 것입니다. 목록의 요소를 데이터 프레임으로 강요 할 수 있습니까? 그런 다음 세 가지 수준의 세 가지 데이터 프레임에 대해 세 가지 데이터 프레임을 사용하고 각각을 CSV에 쓸 수 있습니다. – Impossible9

+1

데이터 프레임에 강제 변환 할 필요가 없습니다. csv에 직접 행렬을 쓸 수 있습니다. 'write.csv (cors [[1]], "temp.csv")'와 같이. 'by '의 출력을 반복하면됩니다. – mrip

0

귀하의 질의는 적어도 저에게는 명확하지 않습니다. 올바르게 계산하면 상관 관계를 계산하기 전에 먼저 pairwise 행렬이 필요할 수 있습니다. SciencesPo에서 다음 기능을 사용해보십시오. 이 연구와 관련 P-값을 확인하는 것이 더 쉽습니다가되도록

는, 다음은 당신이 행렬 스택 것 (SciencesPo)

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

이 필요합니다.

rstack(m)

0

당신은에서 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)]})