Informatique > Logiciel > SAS

Un pot-pourri de programmes STATA
  1. Lire un fichier texte
  2. Coller deux fichiers
  3. Faire une boucle simple: forval
  4. Faire une boucle sur les modalités d'une variable discrète: foreach
  5. Les traitements à l'intérieur d'un groupe: by et bysort
  6. Compter le nombre de produits uniques par individu
  7. Former toutes les combinaisons possibles entre variables
  8. Supprimer les variables vides (sans observation) dans un fichier
  9. Les sommes, en lignes, en colonnes, cumulées, totales...
  10. Calculer une 'part d'achat' à partir d'un montant par produit
  11. Tester l'occurence d'un évènement parmis plusieurs variables: eqany
  12. Combien de temps prend mon programme?
  13. Créer une matrice à partir d'un tableau de fréquences

/* Lire un fichier texte */

insheet using toto.txt toto.txt doit être un fichier délimité par des tabulations ou des ','
insheet using toto.txt, delimiter (";")  si le délimiteur est autre chose (par exemple le ';')

Dans les deux cas insheet reconnait si la première ligne contient les noms des variables.


/* Coller deux fichiers */

1) Merger sur un identifiant (id)
use fich2
sort id
save fich2, replace
use fich1
sort id
merge id using fich2
tabulate _merge

Dans ce cas fich2 est mergé à fich1 selon la clé 'id', tabulate _merge donne le résultat

2) Ajoute fich2 à la fin de fich1 (les variables doivent être les mêmes)
append using fich2 


/* Faire une boucle simple: forval */

forval j=1/5 {
 gen P`j'=Q`j'/tot
 }


/* Faire une boucle sur les modalités d'une variable discrète: foreach */

vallist zemp, g(zemp)
forval j=1/5 {
foreach k in $zemp {
gen a`j'`k'=PGr`j' if zemp==`k'
egen b`j'`k'=max(a`j'`k')
format b`j'`k' %9.1f
drop a`j'`k'
}
}


/* Les traitements à l'intérieur d'un groupe: by et bysort */

La commande by permet de faire des traitements par groupe d'individu. Il vaut mieux utiliser bysort qui évite de trier le fichier avant.

bysort id : egen sum(achat) fait la somme des achats pour chaque id
bysort id type : egen sum(achat) fait la somme des achats pour chaque id par type de produit
bysort id (num): gen NbrTotalAchat=_N si num est le numéro d'ordre de l'achat, renvoie le dernier

Dans ce dernier cas Stata trie le fichier sur les deux variables spécifiées mais ne fait les traitements que par id.


/* Compter le nombre de produits uniques par individu */

bysort indiv: egen nbval=unique(produit)


/* Former toutes les combinaisons possibles entre variables */

selectvars cs trage sexe, min(2) max(2)

On peut ensuite récupérer la 'return list'

foreach v in `r(varlist)' {
regress mpg `v'
}

Ce qui produira l'exécution de 3 régressions à la suite


/* Supprimer les variables vides (sans observation) dans un fichier*/

foreach v of var _all {
sort `v'
if `v'[1]==`v'[_N] {
drop `v'
}
}

Voir aussi la commande - dropmiss -


/* Les sommes, en lignes, en colonnes, cumulées, totales... */

Soit id l'identifiant individuel, a le montant des achats de Mr id,
gen cum_a=sum(a) calcule cum_a la somme cumulée de a
egen tot_a=sum(a) calcule tot_a le montant total des achats
egen mean_a=mean(a) calcule mean_a le montant moyen des achats
bysort id: egen sumid_a=sum(a) calcule sumid_a le montant total des achants par individu
egen tot_abc=rsum(a b c) calcule tot_abc la somme en ligne de a b et c

  +----------------------------------------------------------------+
  | id    a   cum_a   tot_a   mean_a   sumid_a    b    c   tot_abc |
  |----------------------------------------------------------------|
  |  1    1       1      55      5.5         6    3    6        10 |
  |  1    2       3      55      5.5         6    5   10        17 |
  |  1    3       6      55      5.5         6    7   14        24 |
  |  2    4      10      55      5.5         9    9   18        31 |
  |  2    5      15      55      5.5         9   11   22        38 |
  |----------------------------------------------------------------|
  |  3    6      21      55      5.5        21   13   26        45 |
  |  3    7      28      55      5.5        21   15   30        52 |
  |  3    8      36      55      5.5        21   17   34        59 |
  |  4    9      45      55      5.5        19   19   38        66 |
  |  4   10      55      55      5.5        19   21   42        73 |
  +----------------------------------------------------------------+

/* Calculer une 'part d'achat' à partir d'un montant par produit */

Soit id l'identifiant individuel, b la nature de l'achat c le montant dépensé pour b,

     +----------------------+
     |id   b   c          d |
     |----------------------|
     | 1   2   3   33.33333 |
     | 1   5   6   66.66666 |
     | 2   4   5   38.46154 |
     | 2   6   8   61.53846 |
     | 3   2   5        100 |
     +----------------------+

la variable d représente (pour l'individu a) la part de la dépense pour chaque bien sur la dépense totale. Elle est donnée par:
bysort id : egen d=pc(c)

Autre exemple, si maintenant b est la quantité achetée de bien et c son prix, le montant dépensé par Mr 1 pour le premier bien est 6/36=16.67

     +----------------------+
     |id   b   c          d |
     |----------------------|
     | 1   2   3   16.66667 |
     | 1   5   6   83.33334 |
     | 2   4   5   29.41176 |
     | 2   6   8   70.58823 |
     | 3   2   5        100 |
     +----------------------+

la variable d est donnée par:
bysort id : egen d=pc(b*c)

/* Tester l'occurence d'un évènement parmis plusieurs variables: eqany */

Soit trois variables a b et c et on veut créer un indicateur z qui prend la valeur 1 si a b ou c prennent certaines valeurs (1 4 9 ou 12) et 0 sinon.
egen z = eqany(a b c) , values(1 4 9 12)

  +------------------+
  |  a    b    c   z |
  |------------------|
  |  1    3    5   1 |
  |  2    4    6   1 |
  |  3    5    7   0 |
  |  4    6    8   1 |
  |  5    7    9   1 |
  |------------------|
  |  6    8   10   0 |
  |  7    9   11   1 |
  |  8   10   12   1 |
  |  9   11   13   1 |
  | 10   12   14   1 |
  +------------------+

/* Combien de temps prend mon programme? */

Pour connaître le temps d'exécution d'un programme il suffit d'afficher en début et en fin de programme la date et l'heure du système:
di "Programme débuté le $S_DATE à $S_TIME"
... puis à la fin
di "Programme achevé le $S_DATE à $S_TIME"


/* Créer une matrice à partir d'un tableau de fréquences */

Soit trois variables v1 v2 et v3 telles que:

  +----------------+
  | v1    v2    v3 |
  |----------------|
  |  2   100   101 |
  |  2   100   102 |
  |  2   100   104 |
  |  3   100   105 |
  |  2   100   106 |
  |----------------|
  |  3   100   125 |
  |  2   100   131 |
  |  2   100   138 |
  |  2   101   105 |
  |  2   101   106 |
  |----------------|
  |  3   101   125 |
  |  2   101   131 |
  |  2   102   104 |
  |  2   102   105 |
  |  2   102   106 |
  +----------------+

On veut une matrice dont les cellules (intersections de v2 et v3 ) soient v1.
Il faut alors créer deux variables locales `v1' et `v2' qui contiennent les modalités distinctes de v1 et v2 :
levels v2, local(l2)
levels v3, local(l3)

Puis créer le tableau :
tabcount v2 v3 [w=v1], v1(`l2') v2(`l3') matrix (T)

Ceci crée la matrice T qui a la forme suivante :
matrix list T

T[3,8]
     101  102  104  105  106  125  131  138
100    2    2    2    3    2    3    2    2
101    0    0    0    2    2    3    2    0
102    0    0    2    2    2    0    0    0

Cette matrice peut être exportée en utilisant la commande svmat T