J'ai une énorme trame de données 5600 X 6592 et je veux supprimer toutes les variables qui sont corrélées les unes aux autres plus de 0,99 Je sais comment le faire à long terme, étape par étape, c'est-à-dire former une matrice de corrélation, arrondir les valeurs, supprimer des éléments similaires ceux et utiliser l'indexation pour obtenir à nouveau mes données "réduites".
cor(mydata)
mydata <- round(mydata,2)
mydata <- mydata[,!duplicated (mydata)]
## then do the indexing...
Je voudrais savoir si cela pourrait être fait en commande courte ou en fonction avancée. J'apprends à utiliser les outils puissants du langage R, ce qui évite de si longues commandes inutiles
Je pensais à quelque chose comme
mydata <- mydata[, which(apply(mydata, 2, function(x) !duplicated(round(cor(x),2))))]
Désolé, je sais que la commande ci-dessus ne fonctionne pas, mais j'espère que je serais en mesure de le faire.
une play-data qui s'applique à la question:
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))
Merci beaucoup
Je suis sûr qu'il existe de nombreuses façons de le faire et certainement mieux que cela, mais cela devrait fonctionner. J'ai simplement mis le triangle supérieur à zéro, puis je supprime toutes les lignes ayant des valeurs supérieures à 0,99.
> tmp <- cor(data)
> tmp[upper.tri(tmp)] <- 0
> diag(tmp) <- 0
# Above two commands can be replaced with
# tmp[!lower.tri(tmp)] <- 0
#
>
> data.new <- data[,!apply(tmp,2,function(x) any(x > 0.99))]
> head(data.new)
V2 V3 V5
1 2 10 4
2 2 20 10
3 5 10 31
4 4 20 2
5 366 10 2
6 65 20 5
Ceci est mon code R ce serait utile pour vous
library('caret')
df1 = read.csv("stack.csv")
print (df1)
GA PN PC MBP GR AP
1 0.033 6.652 6.681 0.194 0.874 3.177
2 0.034 9.039 6.224 0.194 1.137 3.400
3 0.035 10.936 10.304 1.015 0.911 4.900
4 0.022 10.110 9.603 1.374 0.848 4.566
5 0.035 2.963 17.156 0.599 0.823 9.406
6 0.033 10.872 10.244 1.015 0.574 4.871
7 0.035 21.694 22.389 1.015 0.859 9.259
8 0.035 10.936 10.304 1.015 0.911 4.500
df2 = cor(df1)
hc = findCorrelation(df2, cutoff=0.3) # putt any value as a "cutoff"
hc = sort(hc)
reduced_Data = df1[,-c(hc)]
print (reduced_Data)
GA PN GR AP
1 0.033 6.652 0.874 3.177
2 0.034 9.039 1.137 3.400
3 0.035 10.936 0.911 4.900
4 0.022 10.110 0.848 4.566
5 0.035 2.963 0.823 9.406
6 0.033 10.872 0.574 4.871
7 0.035 21.694 0.859 9.259
8 0.035 10.936 0.911 4.500
et pour écrire des données réduites dans un nouveau csv, utilisez simplement:
write.csv(reduced_Data, file = "outfile.csv", row.names = FALSE)
@David Un petit changement dans votre code le rend plus robuste à corrélation négative , en fournissant
abs(x) > 0.99
au lieu de seulement
x > 0.99
data.new <- data[,!apply(tmp,2,function(x) any(abs(x) > 0.99))]
à votre santé..!!!