Analyses multivariées

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Romain Lecachey
Messages : 33
Enregistré le : 10 Avr 2007, 08:57

Analyses multivariées

Messagepar Romain Lecachey » 30 Mai 2007, 10:47

Bonjour à tous,

Je dois réaliser des ACP sur un jeu de donnees de valeurs numériques.
Voici mon code :

Code : Tout sélectionner

methodeACP <- function(fichierImg1,fichierImg2,fichierText,fichierText1,fichierText2,type_image,donnees) {
   library(ade4)
   donnees -> tab
     # charge les donnees dans la variable tab
   princomp(tab,cor=TRUE) -> pcavc
     # calcule la matrice des distances par rapport aux différentes corrélations
   summary(pcavc)
     # tableau des eigenvalues (valeurs propres)
   bitmap(fichierImg1,type_image,width=5,height=5,res=72,pointsize=12)
     # graph des valeurs propres, représente summary
        biplot(pcavc,choice=1:2)
   dev.off()
   
   load=loadings(pcavc)
   write.csv2(load,fichierText,row.names=TRUE)
     # coordonnées des variables
   bitmap(fichierImg2,type_image,width=5,height=5,res=72,pointsize=12)
   plot(pcavc)
    # graph des variables et des espèces
   dev.off()
   dudi.pca(tab,scannf = FALSE,nf = 3) -> contr   
   # recherche des contributions
      ir=inertia.dudi(contr,row.inertia = TRUE)
      write.csv2(ir,fichierText1,row.names=TRUE)
      # -> cf erreur
      ic=inertia.dudi(contr,col.inertia = TRUE)
      write.csv2(ic,fichierText2,row.names=TRUE)
      # -> cf erreur
}


Cette fonction me génère bien le premier ce que je veux mais elle me renvoie une erreur pour les deux dernier "write.csv2" du type :

Code : Tout sélectionner

Erreur dans data.frame(TOT = list(inertia = c(2.67508596662808, 1.05359328027567,  :
        les arguments impliquent des nombres de lignes différents : 5, 20


Quelqu'un aurait il une idée d'où vient l'erreur et si il y a moyen de la corriger ?
Merci d'avance !

Autre question :
Je dois aussi réaliser une ACP sur des variables non numériques, je sais que l'ACP ne peut pas traiter de telles données et elles doivent être transformées en données
numériques (0-1). Mais je bloque pour savoir comment repérer les colonnes non numériques autrement qu'en les visionnant ! est-ce possible ?
Merci de votre aide !

Romain

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 30 Mai 2007, 11:09

Je dois aussi réaliser une ACP sur des variables non numériques, je sais que l'ACP ne peut pas traiter de telles données et elles doivent être transformées en données
numériques (0-1). Mais je bloque pour savoir comment repérer les colonnes non numériques autrement qu'en les visionnant ! est-ce possible ?


éventuellement avec ça :

apply(tab,2,class)

tu sauras alors quelles sont les colonnes assimilables à des facteurs.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 30 Mai 2007, 11:21

Bonjour,


J'ai l'impression que les questions se suivent sans pour autant que tu en tires un autre intérêt que de finaliser ta fonction. Dans les posts :
http://forums.cirad.fr/logiciel-R/viewtopic.php?t=467
http://forums.cirad.fr/logiciel-R/viewtopic.php?t=441

Tu as déjà été confronté à ton problème. La première chose a regarder c'est le type de sortie des fonctions et les arguments des fonctions.

Code : Tout sélectionner

class(inertia.dudi(pca,row.inertia = TRUE))
[1] "list"
Et si tu regardes les arguments de la fonction write.csv :

Code : Tout sélectionner

?write.csv2

Il est dit ceci :
L'aide de la fonction write.csv2 a écrit :x the object to be written, preferably a matrix or data frame. If not, it is attempted to coerce x to a data frame.


Donc tu vois déjà ici que tu essaies d'utiliser une fonction qui prend pour argument x une matrice ou un tableau et si ce n'est pas le cas il essaie de transformer x en tableau.

Si tu regardes le nombre de lignes dans chaque tableau de la liste générée par inertia.dudi tu vois que les 4 tableaux n'ont pas le même nombre de lignes ton erreur vient donc de la. Il te faut savoir ce que tu cherches a exporter dans ton fichier csv. Si c'est la totalité alors il va falloir réflechier à un autre moyen. Tout dépend de ce que tu comptes faire de ce fichier ou des informations que tu veux qu'il contienne.

En plus pourquoi utiliser deux types de fonction pour faire la même analyse ? Je pense qu'avec les fonctions de la librray ade4 tu as tout ce qui faut pour faire afficher les résultats que tu souhaites.

Maxime

Romain Lecachey
Messages : 33
Enregistré le : 10 Avr 2007, 08:57

Messagepar Romain Lecachey » 30 Mai 2007, 12:02

Merci à tous les deux,
j'ai en effet réglé mon problème de data.frame en ne récupérant que le ir$TOT, il me semble que c'est bien suffisant !
Maintenant, je désire récupérer ces données (summary entre autre ) sous le format .csv afin de les intégrer dans mon php_soap pour m'en servir via un WebService !
Le transfert est assez fastidieux, c'est pourquoi il me semble préférable d'utiliser ce type de format !
J'avance petit à petit...
En plus pourquoi utiliser deux types de fonction pour faire la même analyse ? Je pense qu'avec les fonctions de la librray ade4 tu as tout ce qui faut pour faire afficher les résultats que tu souhaites.

De quelles fonctions parles tu ? Elles ne retournent pas le même résultat !?

En tout cas, encore merci de votre aide

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Analyses multivariées

Messagepar Logez Maxime » 30 Mai 2007, 12:30

Re,

Pourquoi je dis que tu fais deux fois la même chose ? parce que princomp et dudi.pca calcule toutes les deux des acp ! Donc tu fais bien deux fois la même chose entre princomp(tab,cor=TRUE) -> pcavc et dudi.pca(tab,scannf = FALSE,nf = 3) -> contr !
De plus le summary de pcavc et le inertia.dudi(contr) sont très proche dans leur sortie ! Fait attention a ne pas mettre deux fois le même genre de sorties.

A titre personnel je préfère les sortie graphiques du package ade4. Equivalent biplot(pcavc) en ade4 : scatter(contr).

Maxime

Romain Lecachey
Messages : 33
Enregistré le : 10 Avr 2007, 08:57

Messagepar Romain Lecachey » 30 Mai 2007, 13:12

OK je vois merci bien !
Je prends note de la fonction scatter(), je ne la connaissais pas !
Je v la tester et je choisirais ensuite !
Merci encore de votre aide, grâce à vous j'apprends et je progresse beaucoup plus vite, c sûr !
@+

Romain


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité