Domanda

Ho un dataframe e vorrei calcolare il correlazione (con Spearman, i dati è categorico e classificato), ma solo per un sottoinsieme di colonne. Ho provato con tutti, ma R di cor () funzione accetta solo i dati numerici (x devono essere numerici, dice il messaggio di errore), anche se Spearman viene utilizzato.

Un approccio bruta è quello di eliminare le colonne non numerici dalla dataframe. Questo non è elegante, per la velocità io ancora non voglio calcolare le correlazioni tra tutti colonne.

spero che ci sia un modo per dire semplicemente "correlazioni calcolare per colonne x, y, z". riferimenti di colonna potrebbe in numero o per nome. Suppongo che il modo flessibile per fornire loro sarebbe attraverso un vettore.

Tutti i suggerimenti sono apprezzati.

È stato utile?

Soluzione

se hai un dataframe in cui alcune colonne sono numerici e alcuni sono altro (personaggio o fattore) e si desidera solo fare le correlazioni per le colonne numeriche, si potrebbe procedere come segue:

set.seed(10)

x = as.data.frame(matrix(rnorm(100), ncol = 10))
x$L1 = letters[1:10]
x$L2 = letters[11:20]

cor(x)

Error in cor(x) : 'x' must be numeric

ma

cor(x[sapply(x, is.numeric)])

             V1         V2          V3          V4          V5          V6          V7
V1   1.00000000  0.3025766 -0.22473884 -0.72468776  0.18890578  0.14466161  0.05325308
V2   0.30257657  1.0000000 -0.27871430 -0.29075170  0.16095258  0.10538468 -0.15008158
V3  -0.22473884 -0.2787143  1.00000000 -0.22644156  0.07276013 -0.35725182 -0.05859479
V4  -0.72468776 -0.2907517 -0.22644156  1.00000000 -0.19305921  0.16948333 -0.01025698
V5   0.18890578  0.1609526  0.07276013 -0.19305921  1.00000000  0.07339531 -0.31837954
V6   0.14466161  0.1053847 -0.35725182  0.16948333  0.07339531  1.00000000  0.02514081
V7   0.05325308 -0.1500816 -0.05859479 -0.01025698 -0.31837954  0.02514081  1.00000000
V8   0.44705527  0.1698571  0.39970105 -0.42461411  0.63951574  0.23065830 -0.28967977
V9   0.21006372 -0.4418132 -0.18623823 -0.25272860  0.15921890  0.36182579 -0.18437981
V10  0.02326108  0.4618036 -0.25205899 -0.05117037  0.02408278  0.47630138 -0.38592733
              V8           V9         V10
V1   0.447055266  0.210063724  0.02326108
V2   0.169857120 -0.441813231  0.46180357
V3   0.399701054 -0.186238233 -0.25205899
V4  -0.424614107 -0.252728595 -0.05117037
V5   0.639515737  0.159218895  0.02408278
V6   0.230658298  0.361825786  0.47630138
V7  -0.289679766 -0.184379813 -0.38592733
V8   1.000000000  0.001023392  0.11436143
V9   0.001023392  1.000000000  0.15301699
V10  0.114361431  0.153016985  1.00000000

Altri suggerimenti

Per i dati numerici si ha la soluzione. Ma si tratta di dati categorici, hai detto. Poi la vita diventa un po 'più complicato ...

Bene, in primo luogo: la quantità di associazione tra due variabili categoriali non si misura con una correlazione di Spearman, ma con un test chi-quadrato per esempio. Che è in realtà la logica. mezzi Ranking c'è qualche ordine nei dati. Ora mi dica che è più grande, giallo o rosso? Lo so, a volte R fa eseguire una correlazione di Spearman rango su dati categorici. Se il codice Ho giallo e rosso 1 2, R sarebbe il Red grandi di colore giallo.

Quindi, dimenticare Spearman per i dati categorici. Io dimostrare il chisq-test e come scegliere le colonne utilizzando combn (). Ma si potrebbe beneficiare di un po 'di tempo di più con il libro di Agresti: http://www.amazon.com/Categorical-Analysis-Wiley-Probability-Statistics/dp / 0471360937

set.seed(1234)
X <- rep(c("A","B"),20)
Y <- sample(c("C","D"),40,replace=T)

table(X,Y)
chisq.test(table(X,Y),correct=F)
# I don't use Yates continuity correction

#Let's make a matrix with tons of columns

Data <- as.data.frame(
          matrix(
            sample(letters[1:3],2000,replace=T),
            ncol=25
          )
        )

# You want to select which columns to use
columns <- c(3,7,11,24)
vars <- names(Data)[columns]

# say you need to know which ones are associated with each other.
out <-  apply( combn(columns,2),2,function(x){
          chisq.test(table(Data[,x[1]],Data[,x[2]]),correct=F)$p.value
        })

out <- cbind(as.data.frame(t(combn(vars,2))),out)

Poi si dovrebbe ottenere:

> out
   V1  V2       out
1  V3  V7 0.8116733
2  V3 V11 0.1096903
3  V3 V24 0.1653670
4  V7 V11 0.3629871
5  V7 V24 0.4947797
6 V11 V24 0.7259321

Dove V1 e V2 indicano tra cui le variabili va, e "out" fornisce il valore di p per associazione. Ecco tutte le variabili sono indipendenti. Che ci si aspetterebbe, come ho creato i dati in modo casuale.

Ho trovato un modo più semplice, cercando in script R generato da Rattle. Sembra che qui di seguito:

correlations <- cor(mydata[,c(1,3,5:87,89:90,94:98)], use="pairwise", method="spearman")

Un'altra opzione sarebbe quella di utilizzare solo l'ottimo pacchetto corrr https://github.com/drsimonj/corrr e fare

require(corrr)
require(dplyr)

myData %>% 
   select(x,y,z) %>%  # or do negative or range selections here
   correlate() %>%
   rearrange() %>%  # rearrange by correlations
   shave() # Shave off the upper triangle for a cleaner result

i punti 3 e 4 sono del tutto facoltativo e sono solo inclusi per dimostrare l'utilità del pacchetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top