IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

[statnet/Network]Importer une matrice d'incidence valuée


Sujet :

R

  1. #1
    Membre chevronné Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Par défaut [statnet/Network]Importer une matrice d'incidence valuée
    Bonjour,
    j'arrive à importer une matrice d'incidence "normale" avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Chargement fichier ASCII dans un tableau (MyTable)
    MyTable<-read.delim(file="c:/FichierTexte.txt",sep="\t", header=FALSE);
     
    # Chargement d'un objet réseau (net.mat) avec le tableau
    net.mat<-as.network(as.matrix(MyTable),vertex.attr=NULL, vertex.attrnames=NULL, directed=TRUE,hyper=FALSE, loops=FALSE, multiple=FALSE, bipartite = FALSE,matrix.type="edgelist")
    A partir d'un fichier de données brutes sans en-têtes, à autant de lignes que de sommets du graphe et à 2 colonnes, une qui contient la liste des sommets de départ, l'autre les sommets d'arrivée.

    j'utilise enfin la fonction gplot pour afficher le graphe.
    Tout fonctionne très bien.



    Je souhaiterais maintenant pouvoir mettre les arêtes d'une certaine couleur (avec l'option edge.col) en fonction d'une valeur que je chargerais dans le graphe.

    J'ai donc un fichier maintenant à 3 colonnes, les deux premières sont les mêmes que précédemment et la troisième indiquerait la couleur.

    J'essaie de convertir la matrice en réseau avec la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    net.mat<-as.network(as.matrix(MyTable),names.eval="V1 V2",vertex.attr=NULL, vertex.attrnames=NULL, directed=TRUE,hyper=FALSE, loops=FALSE, multiple=FALSE, bipartite = FALSE,matrix.type="edgelist")
    mais j'obtiens l'erreur :

    Erreur dans round(n) : Argument non numérique pour une fonction mathématique
    Je n'arrive pas à trouver comment indiquer que les premières colonnes sont les noms des sommets qui composent l'arête et la troisième colonne un attribut supplémentaire des arêtes.

    Quelqu'un sait-il comment on pourrait faire ?

    Merci.


  2. #2
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    Si tu lances
    après ton erreur, ça retourne quoi ?

  3. #3
    Membre chevronné Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    Bonjour,

    Si tu lances
    après ton erreur, ça retourne quoi ?
    Ca produit ce message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    3: network.initialize(n, directed = directed, hyper = hyper, loops = loops, 
           multiple = multiple, bipartite = bipartite)
    2: as.network.matrix(as.matrix(MyTable), names.eval = "V1 V2", vertex.attr = NULL, 
           vertex.attrnames = NULL, directed = TRUE, hyper = FALSE, 
           loops = FALSE, multiple = FALSE, bipartite = FALSE, matrix.type = "edgelist")
    1: as.network(as.matrix(MyTable), names.eval = "V1 V2", vertex.attr = NULL, 
           vertex.attrnames = NULL, directed = TRUE, hyper = FALSE, 
           loops = FALSE, multiple = FALSE, bipartite = FALSE, matrix.type = "edgelist")

  4. #4
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    OK, maintenant il faudrait savoir ce que as.network.matrix passe comme argument n à la fonction network.initialize...
    Et donc afficher le code de la fonction en tapant dans la console R :
    (sans les parenthèses !)

    Si ça ne marche pas, essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getAnywhere("as.network.matrix")

  5. #5
    Membre chevronné Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Par défaut
    A priori la fonction network.initialize est appelée de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     network.initialize(n, directed = directed, hyper = hyper, 
            loops = loops, multiple = multiple, bipartite = bipartite)
    Voici le code renvoyé par la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    function (x, matrix.type = NULL, directed = TRUE, hyper = FALSE, 
        loops = FALSE, multiple = FALSE, bipartite = FALSE, ignore.eval = TRUE, 
        names.eval = NULL, na.rm = FALSE, edge.check = FALSE, ...) 
    {
        nattr <- attr(x, "n")
        battr <- attr(x, "bipartite")
        vattr <- attr(x, "vnames")
        if (is.logical(x)) {
            x <- 1 * x
        }
        if (is.null(matrix.type)) 
            matrix.type <- which.matrix.type(x)
        else matrix.type <- match.arg(matrix.type, c("adjacency", 
            "incidence", "edgelist", "bipartite"))
        if (is.logical(bipartite) && bipartite) 
            matrix.type <- "bipartite"
        if ((bipartite > 0) && (matrix.type == "adjacency") && (NROW(x) == 
            bipartite)) 
            matrix.type <- "bipartite"
        unames <- NULL
        if (matrix.type == "edgelist") {
            if (dim(x)[2] > 2) 
                vals <- x[, -(1:2)]
            else vals <- NULL
            if (is.character(x <- as.matrix(x[, 1:2, drop = FALSE]))) {
                unames <- sort(unique(as.vector(x)))
                x <- cbind(match(x[, 1], unames), match(x[, 2], unames))
            }
            if (!is.null(vals)) 
                x <- cbind(x, vals)
        }
        if (matrix.type == "adjacency" && !is.null(colnames(x))) {
            unames <- colnames(x)
        }
        if (matrix.type == "bipartite") {
            directed <- FALSE
            bipartite <- dim(x)[1]
            unames <- 1:sum(dim(x))
            if (!is.null(rownames(x))) {
                unames[1:(dim(x)[1])] <- rownames(x)
            }
            if (!is.null(colnames(x))) {
                unames[(dim(x)[1]) + (1:(dim(x)[2]))] <- colnames(x)
            }
        }
        if (!is.null(vattr)) 
            unames <- vattr
        n <- switch(matrix.type, adjacency = dim(x)[1], incidence = dim(x)[1], 
            bipartite = sum(dim(x)), edgelist = max(x[, 1:2]), )
        if (is.numeric(nattr)) 
            n <- nattr
        if (is.numeric(battr)) 
            bipartite <- battr
        g <- network.initialize(n, directed = directed, hyper = hyper, 
            loops = loops, multiple = multiple, bipartite = bipartite)
        g <- switch(matrix.type, adjacency = network.adjacency(x, 
            g, ignore.eval, names.eval, na.rm, edge.check), incidence = network.incidence(x, 
            g, ignore.eval, names.eval, na.rm, edge.check), bipartite = network.bipartite(x, 
            g, ignore.eval, names.eval, na.rm, edge.check), edgelist = network.edgelist(x, 
            g, ignore.eval, names.eval, na.rm, edge.check))
        if (!is.null(unames)) {
            g <- set.vertex.attribute(g, "vertex.names", unames)
        }
        g
    }
    <environment: namespace:network>

  6. #6
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Et que te renvoient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    attr(as.matrix(MyTable), "n")
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    attr(as.matrix(MyTable), "vnames")
    ?

    On avance

  7. #7
    Membre chevronné Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Par défaut
    Les deux commandes renvoient NULL

  8. #8
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    En fait, je pense que pour trouver d'où vient le problème, tu vas devoir exécuter le corps de la fonction (éventuellement pas à pas, en surveillant en particulier les changements dans les valeurs de matrix.type et n) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    ## Initialisation des variables (paramètres) :
    x <- as.matrix(MyTable)
     
    names.eval = "V1 V2"
    vertex.attr = NULL
    vertex.attrnames = NULL
    directed <- TRUE
    hyper <- FALSE
    loops <- FALSE
    multiple <- FALSE
    bipartite <- FALSE
    matrix.type <- "edgelist"
     
    ## Corps de la fonction :
        nattr <- attr(x, "n")
        battr <- attr(x, "bipartite")
        vattr <- attr(x, "vnames")
        if (is.logical(x)) {
            x <- 1 * x
        }
        if (is.null(matrix.type))
            matrix.type <- which.matrix.type(x)
        else matrix.type <- match.arg(matrix.type, c("adjacency",
            "incidence", "edgelist", "bipartite"))
        if (is.logical(bipartite) && bipartite)
            matrix.type <- "bipartite"
        if ((bipartite > 0) && (matrix.type == "adjacency") && (NROW(x) ==
            bipartite))
            matrix.type <- "bipartite"
        unames <- NULL
        if (matrix.type == "edgelist") {
            if (dim(x)[2] > 2)
                vals <- x[, -(1:2)]
            else vals <- NULL
            if (is.character(x <- as.matrix(x[, 1:2, drop = FALSE]))) {
                unames <- sort(unique(as.vector(x)))
                x <- cbind(match(x[, 1], unames), match(x[, 2], unames))
            }
            if (!is.null(vals))
                x <- cbind(x, vals)
        }
        if (matrix.type == "adjacency" && !is.null(colnames(x))) {
            unames <- colnames(x)
        }
        if (matrix.type == "bipartite") {
            directed <- FALSE
            bipartite <- dim(x)[1]
            unames <- 1:sum(dim(x))
            if (!is.null(rownames(x))) {
                unames[1:(dim(x)[1])] <- rownames(x)
            }
            if (!is.null(colnames(x))) {
                unames[(dim(x)[1]) + (1:(dim(x)[2]))] <- colnames(x)
            }
        }
        if (!is.null(vattr))
            unames <- vattr
        n <- switch(matrix.type, adjacency = dim(x)[1], incidence = dim(x)[1],
                    bipartite = sum(dim(x)), edgelist = max(x[, 1:2]), )
        if (is.numeric(nattr))
            n <- nattr
        if (is.numeric(battr))
            bipartite <- battr
     
    print(n)
     
    ## Pour vérif :
        g <- network.initialize(n, directed = directed, hyper = hyper,
                                loops = loops, multiple = multiple, bipartite = bipartite)
    Peut-être qu'un de tes paramètre n'est pas cohérent avec le reste...

  9. #9
    Membre chevronné Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Par défaut
    Merci pitipoisson,
    je débute en R, je vais essayer de trouver des exemples d’import de graphes valués sur le net. Je ne trouve pas les docs qu'on peut télécharger sur le site de R très compréhensibles par les débutants, il n'y a pas toujours la liste exhaustive des paramètres et peu d'exemples.

    Je posterai quand je trouverai une solution.



    P.S.

    Là j'ai trouvé un exemple sur ce site : http://stackoverflow.com/questions/1...work-data-in-r

    J'arrive bien à construire le réseau à partir des 2 premières colonnes de la matrice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MyTable<-read.delim(file="C:/FichiersTexte/Fichier.txt",sep="\t", header=FALSE);
     
    net = network(MyTable[,1:2])
    Mais la commande qui ajoute l'attribut de pondération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set.edge.attribute(net,"weight",MyTable[,3])
    Me renvoie le message :
    Erreur dans set.edge.attribute(net, "weight", MyTable[, 3]) :
    Not a graph object
    J'ai aussi essayé en utilisant le code suivant pour construire le réseau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    net<-as.network(as.matrix(MyTable[,1:2]))
    Là je dois bien avoir un objet réseau comme résultat. Cette ligne fonctionne bien mais j'ai toujours le même message au moment d'ajouter la propriété "weight".

  10. #10
    Membre chevronné Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Par défaut
    Grâce au lien suivant : http://www.r-bloggers.com/namespaces...ame-conflicts/ j'ai pensé qu'il y avait certainement un conflit de noms.

    J'ai fermé R, je l'ai réouvert, je n'ai pas chargé la bibliothèque igraph, uniquement statnet.

    En tâtonnant un peu j'ai finalement trouvé le code suivant qui fonctionne bien.

    Donc j'ai au départ une matrice d'incidence à 3 colonnes : 1 colonne pour le sommet de départ, une pour celui d'arrivée, une dernirèe colonne pour la valuation de l'arête.

    Je crée un réseau à partir des 2 première colonnes de la matrice et je me sers de la troisième pour définir un attribut "weight".

    Dans gplot, je récupère la valeur de cet attribut pour dimensionner l'épaisseur des arêtes en fonction de cet attribut weight.

    Voilà le code qui fonctionne bien pour ceux que ça intéresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # Chargement de la bibliothèque statnet
    library(statnet)
     
    # Effacement objets
    rm(list=ls(all=TRUE))
     
    # Chargement fichier ASCII dans un tableau (MyTable)
    MyTable<-read.delim(file="C:/FichiersTexte/listeIncidences.txt",sep="\t", header=FALSE);
     
    # Chargement dans un objet network des 2 premières colonnes du tableau MyTable en tant que matrice d'adjacence
    net = network(MyTable[,1:2])
     
    # Ajout d'un attribut "weight" à chaque arête du réseau
    # Les valeurs des poids sont à lire en 3ème colonne du tableau MyTable
    set.edge.attribute(net,"weight",MyTable[,3])
     
    # Cartographie du réseau
    gplot(net,
    	label=network.vertex.names(net),
    	gmode="digraph",
    	diag=TRUE,
    	thresh=0,
    	displayisolates=FALSE,
    	boxed.labels=FALSE,
    	label.col="blue",
    	label.pos=0,
    	label.cex=0.85,
    	vertex.cex=1,
    	edge.lwd=get.edge.value(net,"weight"),
    	main="Cartographie - Algorithme de Fruchterman et Reingold",
    	mode="fruchtermanreingold",
    	interactive=TRUE
    	)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/01/2015, 12h41
  2. [XL-2010] Importer une matrice creuse dans excel
    Par flo00154 dans le forum Excel
    Réponses: 2
    Dernier message: 23/12/2013, 20h21
  3. Importer une matrice Excel
    Par virus321 dans le forum Général Java
    Réponses: 1
    Dernier message: 24/11/2012, 22h57
  4. Réponses: 0
    Dernier message: 19/08/2011, 10h19
  5. Importation d'une matrice stockée dans un fichier texte
    Par Contractofoued dans le forum C++
    Réponses: 4
    Dernier message: 21/05/2008, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo