Publié le :
Macro CREATION_INTERNE

Macro de génération de vecteurs pour l'analyse de tables de contingence carrées

En attente de validation
Cette macro `%square` crée un jeu de données SAS© contenant des variables de conception (vecteurs) utilisées dans la modélisation statistique des tables carrées. Elle génère une grille de `size` x `size` et calcule pour chaque cellule (R, C) une série de variables : `S` pour la symétrie, `L` pour la mobilité verticale, `T` pour les triangles, `Q` pour la quasi-indépendance, et d'autres. Elle construit également des vecteurs `FF`, `SS`, `H`, `DD` pour les effets de ligne et de colonne, ainsi qu'une série de vecteurs `v` pour des partitions spécifiques de la table. Toutes les données sont générées en interne, sans nécessiter de source externe, bien qu'un jeu de données existant puisse être fusionné en option via le paramètre `data`.
Analyse des données

Type : CREATION_INTERNE


Le jeu de données principal est généré à partir de boucles `do` imbriquées qui parcourent les lignes et les colonnes d'une table carrée de taille `&size`. Les valeurs des variables sont calculées algorithmiquement. Un jeu de données externe peut être fusionné optionnellement via le paramètre `&data`.

1 Bloc de code
DATA STEP Data
Explication :
Ce bloc initialise la grille de la table carrée de taille `&size`*`&size`. Pour chaque cellule (R,C), il calcule une série de variables de base (S, L, T, Q, etc.) utilisées dans les modèles d'analyse de tables de mobilité. La logique de calcul diffère selon que la cellule est sur la diagonale, au-dessus ou en dessous.
Copié !
1options nonotes;
2DATA generate1;
3 DO R=1 to &size;
4 DO C=1 to &size;
5 IF R lt C THEN
6 DO;
7 k=abs(R-C);
8 S=k+1-(R+1)*((0.5*R)+1)+(&size+3)*(R+1)-3-2*&size;
9 L=1;
10 T=1;
11 Q=&size+1;
12 DA=abs(R-C);
13 D=abs(R-C);
14 F=abs(R-C)+1;
15 OS1=R;
16 OS2=2*&size-C;
17 END;
18 
19 ELSE IF R gt C THEN
20 DO;
21 k=abs(R-C);
22 S=(k+1)-(C+1)*(.5*C+1)+(&size+3)*(C+1)-3-2*&size;
23 L=1;
24 T=2;
25 Q=&size+1;
26 DA=abs(R-C);
27 D=abs(R-C)+(&size-1);
28 F=1;
29 OS1=(&size-1)+C;
30 OS2=(&size+1)-R;
31 END;
32 
33 ELSE /*if R eq C then */
34 DO;
35 S=1-(C+1)*(.5*C+1)+(&size+3)*(C+1)-3-2*&size;
36 L=2;
37 T=3;
38 Q=R;
39 DA=&size;
40 D=2*&size-1;
41 F=1;
42 OS1=2*&size-1;
43 OS2=2*&size-1;
44 END;
45 
46 U=R*C;
47 OUTPUT;
48 drop k;
49 END; END;
50 label
51 R = 'Row'
52 C = 'Col'
53 S = 'Symmetry'
54 T = 'Triangle Asymmetry'
55 Q = 'Quasi Independence'
56 DA = 'Diagonal Absolute'
57 D = 'Diagonals Asymmetry'
58 L = 'Uniform loyalty'
59 ;
60 RUN;
2 Bloc de code
DATA STEP Data
Explication :
À partir du jeu de données précédent, ce bloc ajoute un identifiant unique `ID`. Il crée et peuple ensuite des vecteurs indicateurs `FF` (pour les lignes) et `SS` (pour les colonnes), ainsi que leur somme `H` et leur différence `DD`, qui sont utiles pour modéliser les effets de marge.
Copié !
1DATA generate2;
2 SET generate1;
3 ID=_N_;
4 ARRAY FF(&size);
5 ARRAY SS(&size);
6 ARRAY H(&size);
7 ARRAY DD(&size);
8 DO i=1 TO &size;
9 IF R=i THEN FF(i)=1;
10 ELSE FF(i)=0;
11 IF C=i THEN SS(i)=1;
12 ELSE SS(i)=0;
13 H(i)=FF(i)+SS(i);
14 DD(i)=FF(i)-SS(i);
15 END;
16 drop i;
17 RUN;
3 Bloc de code
Macro %DO loop Data
Explication :
Cette boucle de macro génère dynamiquement `&size - 1` jeux de données (`vdata1`, `vdata2`, ...). Chaque jeu `vdata&h` contient un vecteur `v&h` qui partitionne la table en sous-carrés, une technique utilisée dans certains modèles de mobilité sociale.
Copié !
1%global h;
2%DO h=1 %to %eval(&size-1);
3 DATA vdata&h;
4 ID=0;
5 %DO i=1 %to &size;
6 %DO j=1 %to &size;
7 ID=ID+1;
8 %IF &i<=%eval(&h) and &j <=%eval(&h) %THEN %DO;
9 v&h=2; %END;
10 %ELSE %IF &i >=%eval(&h+1) and &j>=%eval(&h+1)
11 %THEN %DO; v&h=2; %END;
12 %ELSE %DO; v&h=1; %END;
13 OUTPUT;
14 %END;
15 %END;
16 PROC SORT DATA=vdata&h; BY ID;
17 %END;
18RUN;
4 Bloc de code
DATA STEP Data
Explication :
Ce bloc final assemble toutes les pièces. Il fusionne le jeu de données `generate2` avec tous les jeux `vdata&k` créés précédemment en utilisant l'identifiant `ID`. Si un jeu de données d'entrée `&data` est spécifié, il est également fusionné. Enfin, la macro nettoie tous les jeux de données intermédiaires avec `PROC DATASETS` pour ne conserver que le résultat final.
Copié !
1DATA &out(drop=ID);
2 MERGE generate2
3 %DO k=1 %to %eval(&size-1);
4 vdata&k
5 %END;
6 ;
7 BY ID;
8 RUN;
9 
10options notes;
11%IF %LENGTH(&DATA) %THEN %DO;
12DATA &out;
13 MERGE &DATA &out;
14 %END;
15 
16PROC DATASETS nolist nowarn;
17 delete generate1 generate2
18 %DO k=1 %to %eval(&size-1);
19 vdata&k
20 %END;
21 ;
22%mend;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Banner
Le Conseil de l'Expert
Expert
Simon
Expert SAS et fondateur.
« Le calcul manuel des indices de symétrie et de distance diagonale dans une table carrée est une source fréquente d'erreurs de programmation, particulièrement lorsque la taille de la table augmente.

La macro %square élimine ce risque en encapsulant la logique géométrique des cellules (R, C) directement dans le flux de données. Que vous analysiez des migrations, des tableaux de flux de main-d'œuvre ou des tests de concordance (Kappa), disposer de vecteurs pré-calculés comme la loyauté uniforme (L) ou l'asymétrie des diagonales (D) est un gain de productivité majeur. C’est le pont parfait entre la théorie statistique et l’implémentation logicie »