2011-07-21 6 views
13

Podczas uruchamiania cor() na szeregach czasowych z dużą ilością zmiennych, otrzymuję tabelę z powrotem, która ma wiersz i kolumnę dla każdej zmiennej, pokazując korelację między nimi.Wyświetl tabele korelacji jako lista malejąco

Jak mogę wyświetlić tę tabelę jako listę od najbardziej skorelowanych do najmniej skorelowanych (eliminując wszystkie wyniki NA i wyniki, które odwzorowują do siebie (tj. Korelację od A do A)). Chciałbym również policzyć wyniki odwrotne (ujemne) jako wartości bezwzględne, ale nadal pokazywać je jako ujemne.

więc sygnał wyjściowy będzie coś takiego:

A,B,0.98 
A,C,0.9 
C,R,-0.8 
T,Z,0.5 

Odpowiedz

13

Oto jeden z wielu sposobów, co myślę, aby to zrobić. Kiedyś pakiet zmienią bo składnia melt() było dla mnie łatwe do zapamiętania, ale komenda melt() może być dość łatwo zrobić za pomocą poleceń baza R:

require(reshape) 
## set up dummy data 
a <- rnorm(100) 
b <- a + (rnorm(100, 0, 2)) 
c <- a + b + (rnorm(100)/10) 
df <- data.frame(a, b, c) 
c <- cor(df) 
## c is the correlations matrix 

## keep only the lower triangle by 
## filling upper with NA 
c[upper.tri(c, diag=TRUE)] <- NA 

m <- melt(c) 

## sort by descending absolute correlation 
m <- m[order(- abs(m$value)), ] 

## omit the NA values 
dfOut <- na.omit(m) 

## if you really want a list and not a data.frame 
listOut <- split(dfOut, 1:nrow(dfOut)) 
10

zastosowaniem zasady R (gdzie cors jest macierzą korelacji):

up <- upper.tri(cors) 
out <- data.frame(which(up, arr.ind=TRUE), cor=cors[up]) 
out <- out[!is.na(out$cor),] 
out[order(abs(out$cor), decreasing=TRUE),] 
2

Zamień ... za pomocą połączenia korelacji.

library(reshape) 
x <- subset(melt(cor(...)), value != 1 | value != NA) 
x <- x[with(x, order(-abs(x$value))),] 

Jeśli otrzymujesz wiele NA w swoim korelacji, może spróbować wykorzystać use="complete.obs" argumentu w wywołaniu korelacji.