2015-01-14 4 views
0

data.frame에는 몇 가지 상관 관계가 높은 열이 있습니다. 상관 행렬에 대한 행렬 조작과 같은 효율적인 방법으로 배제하는 방법을 궁금해했습니다. 다음 샘플 코드이다상관 관계가 높은 열을 제외하는 방법은 무엇입니까?

a=c(1,2,3,4,5) 
df=data.frame(a=a,b=a*2,c=c(2,1,1,2,9),d=a*3) 
round(cor(df,df),6) 

출력 :

 a  b  c  d 
a 1.000000 1.000000 0.699379 1.000000 
b 1.000000 1.000000 0.699379 1.000000 
c 0.699379 0.699379 1.000000 0.699379 
d 1.000000 1.000000 0.699379 1.000000 

이상적 B와 상관 관계가 1이기 때문에 C는 제외한다.

+1

'b'와 'd'를 제외해야합니까? 또한 어떻게 높은 상관 관계를 정의합니까? 그들 모두는 높은 상관 관계를 가지고 있습니다. 또한 'a'를 제외하지 않는 이유는 무엇입니까? 제외 할 열을 어떻게 결정합니까? –

+0

@YYY 내 질문에 대한 답변을 드릴 수 있습니까? 그것이 당신을 도왔거나 그것을 받아 들일 수 있다면. –

답변

0
discretize = function(adj.m) { 
drops = c() 
valence = apply(adj.m,1,sum) + apply(adj.m,2,sum) 
max.valence = max(valence) 
while(max.valence > 0) { 
    drop.vertex = which(valence == max.valence)[1] 

    drops = append(drops, drop.vertex) 
    adj.m[drop.vertex,] = 0 
    adj.m[,drop.vertex] = 0 

    valence = apply(adj.m,1,sum) + apply(adj.m, 2, sum) 
    max.valence = max(valence) 
} 
drops 
} 

m <- as.data.frame(df) 
cor.threshold = ???? # Set this yourself 
nvi <- as.double(rep(0,ncol(m))) 
names(nvi) <- names(m) 

# preform pairwise correlation dropping 
corm=abs(cor(m)) 
corm[lower.tri(corm,diag=T)]=0 
cor.indices = which(corm > cor.threshold, arr.ind = T) 
adjm = matrix(0, nrow=nrow(corm), ncol=ncol(corm)) 
adjm[cor.indices] = 1 
drop = discretize(adjm) 
nvi[drop] = 1 
m <- m[, !colnames(m) %in% names(which(nvi == 1))]