Bonjour,
Je suis actuellement entrain d'analyser un jeu de données avec le package vmstools (qui utilise FactoMineR).
Dans vmstools, j'utilise la fonction getTableAfterPCA , où est réalisée une ACP sur le jeu de données datSpecies :
log.pca = PCA(datSpecies, graph = FALSE, ncp = ncol(datSpecies))
Plus tard dans la fonction, les plots sur les premiers axes sont demandés (1&2, 2&3, 1&3, 1&4, 2&4), dont celui-ci (axes 1 et 4) :
plot(log.pca, choix = "var", axes = c(1, 4), new.plot = FALSE, lim.cos2.var = 0.3)
ce qui me renvoie l'erreur suivante :
Erreur dans coord.var[v, 1] : indice hors limites
(je n'ai pas d'erreur pour les 4 autres plots)
Elle vient de la fonction plot.PCA de FactoMineR, au début de cette boucle for :
for (v in 1:nrow(coord.var))
nrow(coord.var) vaut 0, donc forcément ça plante.
J'essaie donc de savoir pourquoi coord.var n'a pas de ligne.
J'ai rajouté 2 lignes dans le script pour sauvegarder des fichiers contenant la table coord.var :
-au moment de sa création (à la première occurence de coord.var dans le script de plot.PCA, coord.var_fichier.csv) : elle contient des lignes, avec des coordonnées pour plusieurs variables, jusque là tout va bien.
-au moment où elle est modifiée en coord.var<-coord.var[which(apply(res.pca$var$cos2[, axes, drop = FALSE], 1, sum, na.rm = TRUE) >= lim.cos2.var),] (coord.var_fichier_avant_boucle_for.csv) : la table est alors vide . Un str(coord.var) me renvoie :
num[0 , 1:2]
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "Dim.1" "Dim.4"
Normalement, vu ce que je lis dans le script de plot.PCA, coord.var n'aurait pas du être modifiée. Ce que je ne comprends pas, c'est que ce changement sur coord.var n'a lieu que si !is.null(coord.var[which(apply(res.pca$var$cos2[, axes, drop = FALSE], 1, sum, na.rm = TRUE) >= lim.cos2.var),]). Vu le contenu de ma table (des NULL et des noms de colonnes), je pensais que cette condition n'est pas vérifiée...mais pourtant, en demandant un print de cette condition, j'obtiens TRUE. Or cette condition n'est-elle pas une sécurité pour éviter de faire un plot à partir d'une table vide? Etant donné que R considère la condition comme vraie, il essaie ensuite de faire la boucle for sur ma table vide, et logiquement ça coince.
Du coup qu'est-ce qui ne va pas? Mes données à analyser, ou bien l'écriture de la condition ci-dessus (!is.null [.....])?
Bien cordialement,
Audric Vigier