Les posteurs les plus actifs de la semaine
Eric Wajnberg
 
zezima
 
Nik
 
margotte185
 
c@ssoulet
 
Coco
 
Ayana
 


table pour importation sous gephi - comptage collaboration

Voir le sujet précédent Voir le sujet suivant Aller en bas

table pour importation sous gephi - comptage collaboration

Message par legican le Jeu 9 Juil 2015 - 8:59

Bonjour à tous,
je travaille actuellement sur des données issues de programme de collaboration de recherche. Je dois construire un table de liens pour pouvoir réaliser une analyse sous le logiciel gephi. Je dispose d'un fichier où j'ai, entre autres, le titre des projets (title), les identifiants des participants (ID) et le nom de ces particpants (ParticipantName).
Il faut que je construise une table avec trois colonnes :
- FROM (qui comprendra le n° identifiant d'un participant)
- TO (qui comprendra le n° identifiant d'un autre participant),
- STRENGTH (qui comprendra le nombre de projets associant les 2 participants).

Est-il possible de faire cela avec SAS, stata ou R? Sachant que je n'ai pas 15 lignes mais plus de 1000!

Merci.
Guillaume

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Jeu 9 Juil 2015 - 13:26

Bonjour,

oui je pense qu'il est possible de le faire sous SAS à l'aide de quelques jointures adéquates.

Niaboc
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Jeu 9 Juil 2015 - 13:54

Etant novice sur SAS, je ne peux toujours pas m'en sortir. Ma question serait donc plutôt "comment faire?".
Voici un exemple, ma base de données est construite de la même façon :
docs.google.com/spreadsheets/d/17viYMiVadQ30UbZwp0AV7TOVtOrXVwbchOwSF7iCHv0/edit?usp=sharing.

Mon objectif est de savoir combien de fois 1 a collaboré avec 3, avec 4...
Combien de fois 3 a collaboré avec 4, avec 5, ....

Merci.
Guillaume

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Jeu 9 Juil 2015 - 16:10

Alors voici ce que j'ai pu faire (cf code ci-dessous).

A partir de l'exemple de table que tu m'as donné, j'ai construit ce programme qui te renvoie 2 tables : final et final2.

final va te renvoyer le nombre de projet en commun pour tous les binômes possibles alors que final2 va te renvoyer le nombre de projet en commun seulement chez les binômes ayant au moins 1 projet en commun.

J'ai mis le nom de la table de données en paramètre car j'ai importé ta table pour mon exemple. Par contre si le nom des variables (title, id et ParticipantName) sont différents il faudra que tu les changes à la mano dans le programme.

Si as aussi un compte à rebours visible dans la log de SAS pour voir quand le programme finit de tourner (si tu as vraiment beaucoup beaucoup de participants ça peut être utile).

Et voilà le code :

Code:
data a;
   input title $ id ParticipantName $;
   cards;
   Projet1   1   A
   Projet1   3   B
   Projet1   4   C
   Projet1   5   D
   Projet1   6   E
   Projet1   7   F
   Projet1   8   G
   Projet2   1   A
   Projet2   4   C
   Projet2   6   E
   Projet2   8   G
   Projet2   10   I
   Projet2   11   J
   Projet2   12   K
   Projet2   13   L
   Projet2   14   M
   Projet2   9   H
   Projet3   1   A
   Projet3   4   C
   Projet3   5   D
;
run;



%macro binome(table);
option nonotes linesize=150;

   proc sort data=&table out=list_id (keep=id) nodupkey;
      by id;
   run;

   data _null_;
      set list_id;
      call symput("id_n"||trim(left(_N_)),trim(left(id)));
      call symput("nb_id",trim(left(_N_)));
   run;

   data &table;
      set &table;
      ind=1;
   run;

   proc transpose data=&table out=b;
      id id;
      var ind;
      by title;
   run;

   data &table;
      set &table;
      drop ind;
   run;

   data b;
      set b;
      array toto _numeric_;
      do over toto;
         if toto=. then toto=0;
      end;
   run;

   proc delete data=final;
   run;

   %let controle=%eval(&nb_id*(&nb_id-1)/2);
   %let k=0;

   %LET start=%SYSFUNC(TIME());

   %do i=1 %to %eval(&nb_id-1);
      %do j=%eval(&i+1) %to &nb_id;
         
         data temp;
            set b;
            nb_proj_com+_&&id_n&i*_&&id_n&j;
         run;

         data temp;
            set temp;
            call symput("nb_projet_com",nb_proj_com);
         run;

         data temp;
            id1=&&id_n&i;
            id2=&&id_n&j;
            nb_proj_com=&nb_projet_com;
         run;
         
         proc append data=temp base=final force;
         run;

         %let k=%eval(&k+1);

         %let temps=%sysevalf(%SYSFUNC(TIME())-&start);
         %put on est rendu au &k.ème binôme sur &controle binômes possible, soit %sysfunc(round(&k/&controle*100,0.01))% et il reste %sysfunc(int((&controle*&temps/&k-&temps)/60)) minutes et %eval(%sysfunc(int(&controle*&temps/&k-&temps))-%sysfunc(int((&controle*&temps/&k-&temps)/60))*60) secondes;

      %end;
   %end;

   %if &controle=&k %then %do;
      %put tous les cas ont bien été traités.;
   %end;

   proc sort data=&table out=list_id_name (keep=id ParticipantName) nodupkey;
      by id ParticipantName;
   run;

   proc sql undo_policy=none;
      create table final as
         select b.ParticipantName as ParticipantName1, c.ParticipantName as ParticipantName2, a.*
         from final as a
            inner join list_id_name as b
            on a.id1=b.id
            inner join list_id_name as c
            on a.id2=c.id;
   quit;

   data final2;
      set final;
      where nb_proj_com>0;
   run;

   proc delete data=b temp list_id list_id_name;
   run;

option notes;
%mend binome;

%binome(a);

Dis-moi si ça te va!

Niaboc


Dernière édition par niaboc le Ven 10 Juil 2015 - 9:06, édité 1 fois
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Ven 10 Juil 2015 - 8:35

Merci beaucoup, tu vas me faire gagner un temps fou. je vais maintenant appliquer ton code à ma base de données et à une autre base Wink En espérant que ca tourne bien

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Ven 10 Juil 2015 - 15:03

Je rencontre des problèmes lorsque je fais tourner ton code.
Avant de le lancer, j'importe mon fichier excel :
proc import datafile="F:\PCRDimportationSAS.xls"
out=a
dbms=xls
replace;
run;

Donc j'ai une table A enregistrée dans work, qui comporte trois colonnes
Title, charactèr, format et informat $216
Id, Numéric, format Best11 et informat 11
ParticipantName, character, format et informat $108

Ensuite je soumets à partir de %macro binome(table);
option nonotes linesize=150; jusqu'à la fin.
Vu que SAS fait beaucoup de traitements la fenêtre journal est pleine. Donc là je choisi la dernière option (ne pas sauvegarder).

Au final j'obtiens les deux tables final et final2 mais qui contiennent 0 observation et trois colonnes : nb_proj_com; _196 et _105.

Voici le lien vers un log (log avec un fichier comprenant moins d'observation, 39 : docs.google.com/document/d/17dciDitfwzOnYbMXrDK7fpe_zqIdNsb9mGGmGoAc-0I/edit. Pour comprendre le soucis.
Vu que je viens de m'inscrire je ne peux joindre aucun fichier (ce serait plus pratique que je t'envoie directement le fichier .log)

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Ven 10 Juil 2015 - 16:04

Dans l'exemple qut tu m'avais passé, la table était bien trié comme il fallait, je n'ai donc pas pensé à la trier avant de commencer.

J'ai donc rajouté 3 lignes de code pour trier la table comme il le faut. Le problème vient de là car j'ai pu reproduire la même erreur en changeant le ranking des lignes sur ma table de départ.

Dis-moi si c'est ok maintenant :

Code:
data a;
   input title $ id ParticipantName $;
   cards;
   Projet1   1   A
   Projet1   3   B
   Projet1   4   C
   Projet1   5   D
   Projet1   6   E
   Projet1   7   F
   Projet1   8   G
   Projet2   1   A
   Projet2   4   C
   Projet2   6   E
   Projet2   8   G
   Projet2   10   I
   Projet2   11   J
   Projet2   12   K
   Projet2   13   L
   Projet2   14   M
   Projet2   9   H
   Projet3   1   A
   Projet3   4   C
   Projet3   5   D
;
run;



%macro binome(table);
option nonotes linesize=150;

   proc sort data=&table out=list_id (keep=id) nodupkey;
      by id;
   run;

   data _null_;
      set list_id;
      call symput("id_n"||trim(left(_N_)),trim(left(id)));
      call symput("nb_id",trim(left(_N_)));
   run;

   data &table;
      set &table;
      ind=1;
   run;

   proc sort data=&table;
      by title;
   run;

   proc transpose data=&table out=b;
      id id;
      var ind;
      by title;
   run;

   data &table;
      set &table;
      drop ind;
   run;

   data b;
      set b;
      array toto _numeric_;
      do over toto;
         if toto=. then toto=0;
      end;
   run;

   proc delete data=final;
   run;

   %let controle=%eval(&nb_id*(&nb_id-1)/2);
   %let k=0;

   %LET start=%SYSFUNC(TIME());

   %do i=1 %to %eval(&nb_id-1);
      %do j=%eval(&i+1) %to &nb_id;
         
         data temp;
            set b;
            nb_proj_com+_&&id_n&i*_&&id_n&j;
         run;

         data temp;
            set temp;
            call symput("nb_projet_com",nb_proj_com);
         run;

         data temp;
            id1=&&id_n&i;
            id2=&&id_n&j;
            nb_proj_com=&nb_projet_com;
         run;
         
         proc append data=temp base=final force;
         run;

         %let k=%eval(&k+1);

         %let temps=%sysevalf(%SYSFUNC(TIME())-&start);
         %put on est rendu au &k.ème binôme sur &controle binômes possible, soit %sysfunc(round(&k/&controle*100,0.01))% et il reste %sysfunc(int((&controle*&temps/&k-&temps)/60)) minutes et %eval(%sysfunc(int(&controle*&temps/&k-&temps))-%sysfunc(int((&controle*&temps/&k-&temps)/60))*60) secondes;

      %end;
   %end;

   %if &controle=&k %then %do;
      %put tous les cas ont bien été traités.;
   %end;

   proc sort data=&table out=list_id_name (keep=id ParticipantName) nodupkey;
      by id ParticipantName;
   run;

   proc sql undo_policy=none;
      create table final as
         select b.ParticipantName as ParticipantName1, c.ParticipantName as ParticipantName2, a.*
         from final as a
            inner join list_id_name as b
            on a.id1=b.id
            inner join list_id_name as c
            on a.id2=c.id;
   quit;

   data final2;
      set final;
      where nb_proj_com>0;
   run;

   proc delete data=b temp list_id list_id_name;
   run;

option notes;
%mend binome;

%binome(a);
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Mer 15 Juil 2015 - 8:34

Oui, le code fonctionne parfaitement. Merci beaucoup pour ton aide! j'aurais jamais pu faire ça tout seul^^

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Mer 15 Juil 2015 - 12:52

dans les lignes de code que tu as supprimé, tu devais avoir 2 fois plus de binômes que dans mon code... j'imagine que tu peux remarquer que tous les binômes apparaissent deux fois!

Exemple : le 1 avec le 2  puis le 2 avec le 1.

Niaboc
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Mer 15 Juil 2015 - 12:53

Par contre, il suffit de changer une condition pour obtenir la même chose que moi (mais en plus rapide, je te l'accorde :-) )

Code:

proc sql;
     create table temp1 as
         select id, title
         from a;
quit;

proc sql;
     create table temp2 as
         select id, title
         from a;
quit;

proc sql;
   create table temp3 as
      select distinct a.id as id1, b.id as id2, a.title
        from temp1 as a, temp2 as b
       where a.id<b.id and a.title=b.title;
quit;

proc sql;
   create table compteur as
      select id1 as FROM, id2 as TO, count(title) as STRENGTH
      from temp3 group by id1, id2;
quit;


Dernière édition par niaboc le Mer 15 Juil 2015 - 13:08, édité 1 fois
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Mer 15 Juil 2015 - 13:00

Merci de ta réponse!
Je n'obtiens pas les mêmes résultats qu'avec ton précédent code --> je n'ai que 774 binômes contre 886 avec celui que tu m'avais proposé au début.
Je pense que vais garder le premier que tu m'as donné, il est certes plus long (il tourne pendant 8 minutes pour un fichier excel de seulement 215 lignes) mais il me paraît plus fiable Wink

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Mer 15 Juil 2015 - 13:04

legican a écrit:Merci de ta réponse!
Je n'obtiens pas les mêmes résultats qu'avec ton précédent code --> je n'ai que 774 binômes contre 886 avec celui que tu m'avais proposé au début.
Je pense que vais garder le premier que tu m'as donné, il est certes plus long (il tourne pendant 8 minutes pour un fichier excel de seulement 215 lignes) mais il me paraît plus fiable Wink

Ha... c'est tout de même bizarre de ne pas avoir deux résultats identiques.
Le deuxième code ne prend pas en compte les binômes qui n'ont jamais travaillé ensemble... c'est la table "final2" du premier code.
Es-tu certain qu'il y ait une différence entre le nombre de binôme sur ces 2 tables?

Si oui, pourrais-tu me passer le fichier Excel que je regarde ce qui ne va pas en testant les deux codes de mon côté?
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Jeu 16 Juil 2015 - 12:52

Bonjour,
j'aimerais maintenant savoir combien de fois l'individu A a collaboré avec les autres (tous les autres), combien de fois l'individu B a collaboré avec tous les autres...
Par exemple si A a collaboré 3 fois avec B et 2 fois avec C alors il aura(3+2)=5 collaborations avec tous les autres.

J'espère avoir été assez clair Wink
Merci.
Guillaume

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Jeu 16 Juil 2015 - 13:10

Rajoute cette proc sql, ça devrait être ok :

Code:
proc sql;
   create table compteur2 as
      select FROM, sum(STRENGTH) as nb_colab
      from compteur group by FROM;
quit;

Niaboc
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Jeu 16 Juil 2015 - 13:22

Merci!
mais vu qu'on n'a pas de doublon : par exemple le binome AB et pas le binome BA on risque d'oublier des individus en faisant comme ça non?

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Jeu 16 Juil 2015 - 13:24

Il suffit de changer la condition de la proc sql qui merge les deux première tables :

Code:
proc sql;
   create table temp3 as
      select distinct a.id as id1, b.id as id2, a.title
        from temp1 as a, temp2 as b
       where a.id ne b.id and a.title=b.title;
quit;

Tu auras donc ce qu'on ne voulait pas précédemment : toutes tes lignes en doublons. 1 a travaillé avec 2 & 2 a travaillé avec 1. Mais ici ça nous sert bien afin d'obtenir le nombre de colaborations pour chaque individu.

Et tu lances le code avec la dernière proc sql et le sum(STRENGTH).

Niaboc

avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Jeu 16 Juil 2015 - 13:48

Dis moi si c'est ok maintenant
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Jeu 16 Juil 2015 - 14:02

Code:
/*Importation du fichier excel, issu des traitements sous ACCESS*/
proc import datafile="f:\PCRDimportationSAS.xls"
out=a
dbms=xls
replace;
run;

/*Comptage des binômes*/
proc sql;
     create table a_temp1 as
         select id, title
         from a;
quit;

proc sql;
     create table a_temp2 as
         select id, title
         from a;
quit;

proc sql;
   create table a_temp3 as
      select distinct a.id as id1, b.id as id2, a.title
        from a_temp1 as a, a_temp2 as b
       where a.id ne b.id and a.title=b.title;
quit;

proc sql;
   create table a_compteur as
      select id1 as FROM, id2 as TO, count(title) as STRENGTH
      from a_temp3 group by id1, id2;
quit;

proc sql;
   create table a_compteur2 as
      select FROM, sum(STRENGTH) as nb_colab
      from a_compteur group by FROM;
quit;

voici le code que j'ai. Le problème c'est que je n'ai que que 159 individus dans a_compteur2 ce qui est moins que toute à l'heure...

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Jeu 16 Juil 2015 - 14:12

Non c'est bon je n'ai bien que 159 individus différents dans ma base de données Wink

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Ven 24 Juil 2015 - 13:12

j'ai encore quelques soucis sur ma base de données :
j'ai la variable ParticpantID qui prend des valeurs sur une dizaine de caractères et j'aimerais pouvoir la simplifier.
Voici un exemple du tableau que j'ai : https://docs.google.com/spreadsheets/d/1261bn4y8_eiNUFLk3nB0SNOvFz50BbKoJB6wteBY4q0/edit?usp=sharing
j'aimerais construire la variable ID de manière automatique (j'ai 5000 lignes à faire environ donc vérifier tout à la main ca risque d'être long). Je voudrais que la variable Id soit comme ça : à chaque fois que la variable ParticipantId change que la variable ID prenne la valeur 1 puis 2 puis 3 puis 4...

En espérant avoir été assez clair.
Merci.
Guillaume.

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par niaboc le Ven 24 Juil 2015 - 13:26

Tu peux faire ça :

Code:
proc sort data=a;
   by participantname;
run;

data a;
   set a (drop=id);
   retain id 0;
   if first.participantname then do;
      id=id+1;
   end;
   by participantname;
run;

en appelant "a" ta base de données.
Si tu n'as pas déjà de variable 'ID' dans ta base de données, il faut retirer le
Code:
(drop=id)
.


Niaboc
avatar
niaboc

Nombre de messages : 918
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Ven 24 Juil 2015 - 14:24

yes ca marche merci!
j'ai fait quelques modifssur le code et finalement c'est ça qu'il me fallait
Code:
/*Importation du fichier excel, issu des traitements sous ACCESS, dans une table a*/
proc import datafile="C:\Users\gael-libre\Desktop\classeur1.xls"
out=a
dbms=xls
replace;
run;

proc sort data=a;
  by participantID;
run;

data a;
  set a;
  retain id 0;
  if first.participantID then do;
      id=id+1;
  end;
  by participantID;
run;

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par legican le Lun 3 Aoû 2015 - 15:26

Bonjour,
j'ai encore quelques soucis^^
j'ai une variable projet, une variable ID et une variable countryname. https://docs.google.com/spreadsheets/d/151yAB1pjR9ZEKIFm0mtKkvuMgnl2FPApEY5kCICjPDc/edit?usp=sharing

j'aimerais savoir combien de pays différents j'ai au sein de chacun des projets (combien de pays différents pour chaque "title").
J'ai essayé en faisant
Code:
create table sp as
select *, count (distinct countryname) as nbcountry
from...
group by....

mais ça me sort pas ce que je veux...
Merci!

legican

Nombre de messages : 16
Date d'inscription : 09/07/2015

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: table pour importation sous gephi - comptage collaboration

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum