Ho un enorme dataframe 5600 X 6592 e voglio rimuovere tutte le variabili che sono correlate tra loro più di 0.99 So come fare questo lungo, passo dopo passo, cioè formando una matrice di correlazione arrotondando i valori, rimuovendo quelli simili e utilizzando l'indicizzazione per ottenere nuovamente i miei dati "ridotti".Rimuovere le variabili altamente correlate
cor(mydata)
mydata <- round(mydata,2)
mydata <- mydata[,!duplicated (mydata)]
## then do the indexing...
Vorrei sapere se questo può essere fatto in breve comando o in qualche funzione avanzata. Sto imparando a fare uso degli strumenti potenti nella lingua R, che evita così lunghi comandi inutili
Stavo pensando a qualcosa di simile
mydata <- mydata[, which(apply(mydata, 2, function(x) !duplicated(round(cor(x),2))))]
dispiace So che il comando precedente non funziona , ma spero di poterlo fare.
un play-dati che si applica alla domanda:
mydata <- structure(list(V1 = c(1L, 2L, 5L, 4L, 366L, 65L, 43L, 456L, 876L,
78L, 687L, 378L, 378L, 34L, 53L, 43L), V2 = c(2L, 2L, 5L, 4L,
366L, 65L, 43L, 456L, 876L, 78L, 687L, 378L, 378L, 34L, 53L,
41L), V3 = c(10L, 20L, 10L, 20L, 10L, 20L, 1L, 0L, 1L, 2010L,
20L, 10L, 10L, 10L, 10L, 10L), V4 = c(2L, 10L, 31L, 2L, 2L, 5L,
2L, 5L, 1L, 52L, 1L, 2L, 52L, 6L, 2L, 1L), V5 = c(4L, 10L, 31L,
2L, 2L, 5L, 2L, 5L, 1L, 52L, 1L, 2L, 52L, 6L, 2L, 3L)), .Names = c("V1",
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA,
-16L))
Molte grazie
Grazie David, fa il lavoro, anche se non so quale sia il triangolo superiore! Ho trovato la pagina di aiuto R ma non riesco a capire veramente cosa fa! :) – Error404
@ Error404 'upper.tri' riempie semplicemente quella parte di una matrice con" TRUE "(e il resto è zero, ovvero FALSE), quindi' tmp [upper.tri (tmp)] 'seleziona solo la parte superiore del triangolo di 'tmp'. –
Potrebbe essere più chiaro se si esegue 'data [, applica (tmp, 2, function (x) all (x <= 0.99))]' Non utilizzare nessun doppio negativo :-) –