-
Notifications
You must be signed in to change notification settings - Fork 0
/
Macro_Tau_Argus.sas
2736 lines (2419 loc) · 95.9 KB
/
Macro_Tau_Argus.sas
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* Macro %Tau_Argus */
/********************************************************************************************************************/
/* Cette macro permet de lancer Tau-Argus sans sortir de l'environnement SAS. */
/* Deux formats d'entrées sont possibles : microdonnées (une table sas), ou des données tabulées, au format fichiers*/
/* plats correspondant aux besoins du logiciel (données tabulées : .tab, métadonnées correspondantes : .rda). */
/* Les sorties disponibles sont des tables sas, d'un format similaire à une proc summary (chaque ligne représente */
/* une case de la tabulation), avec une variable "FLAG" dont les modalités signifient : */
/* A = case sous secret primaire de fréquence */
/* B = case sous secret primaire de dominance */
/* F = case sous secret primaire liés au P% */
/* D = case sous secret secondaire */
/* V = case diffusable */
/* Les fichiers générés lors de l'appel de la macro sont placés dans deux répertoires, créés dans la racine du */
/* répertoire de travail (paramètre '&library') : */
/* RESULTS : on y trouvera les masques de secret sous format excel et sas */
/* TEMPORARY FILES MACRO : on y trouvera les fichiers plats et les sorties utilisés par Tau-Argus. */
/********************************************************************************************************************/
/* Auteurs : Julien LEMASSON, Maxime BEAUTE */
/********************************************************************************************************************/
/* Version : cf. CHANGELOG.md */
/********************************************************************************************************************/
/* Paramètres de la macro */
/********************************************************************************************************************/
/*library = Répertoire de travail. S'y trouve la table sas en entrée, les éventuels fichiers plats */
/* décrivant les hiérarchies des variables hiérarchiques (.hrc), et les éventuels fichiers */
/* d'a priori (.hst). Doit être renseigné. */
/* (vide) : par défaut */
/*tabsas = Nom de la table sas de microdonnées. Doit être renseigné si '&input'='microdata'. */
/* (vide) : par défaut */
/*batch_name = Nom du fichier batch généré lors de l'appel de la macro. */
/* batch_sas.arb : par défaut */
/*input = Spécifie le type de données en entrée. */
/* microdata : (par défaut) nécessite une table sas en entrée */
/* tabledata : nécessite des données tabulées au format adéquat (.tab et .rda). Ces */
/* tabulations peuvent être générées en utilisant la macro, et en */
/* spécifiant les paramètres et les valeurs suivants : '&OutputType'='5', */
/* '&ext'='tab' */
/*weight_var = Nom de la variable de poids le cas échéant. Il ne peut n'y en avoir qu'une par appel de */
/* macro. */
/* (vide) : par défaut */
/*holding_var = Nom de la variable de holding le cas échéant. Il s'agit d'un numéro identifiant type */
/* SIREN. Il ne peut n'y en avoir qu'une par appel de macro. */
/* (vide) : par défaut */
/*hierarchical_var = Liste des variables hiérarchiques, séparées par un espace. À chaque variable doit être */
/* associée un fichier plat (.hrc) décrivant la hiérarchie de la variable. IL est possible */
/* de générer des fichiers de hiérarchie en utilisant le paramètre '&hierarchy_x'. */
/* (vide) : par défaut */
/*tabulation_1 = Liste des variables (séparées d'un espace) décrivant la première tabulation. On placera */
/* les variables de ventilation (caractère) en premier, pour finir par la variable de */
/* réponse (numérique). Si la tabulation est un tableau de comptage, la variable de réponse*/
/* devra être "FREQ", la macro n'appliquera alors pas la règle de dominance. */
/* (vide) : par défaut */
/*tabulation_10 = Idem, pour la deuxième... jusqu'à la 10ème tabulation. */
/* (vide) : par défaut */
/*output_name_1 = Nom des tables en sortie (sas et excel) correspondants aux tabulations. Par défaut, */
/* prend le nom de la tabulation correspondante. Utile notamment quand la tabulation fait */
/* plus de 32 caractères. */
/* (vide) : par défaut */
/* ...output_name_10 = Idem, pour la deuxième... jusqu'à la 10ème tabulation. */
/* (vide) : par défaut */
/*hierarchy_1 = Permet de générer le fichier plat .hrc correspondant à l'une des variables hiérarchiques*/
/* à partir des variables correspondant aux différents niveaux agrégés (par exemple, pour */
/* la commune, il faut disposer des variables DEP et REG). Un fichier d'extension .hrc sera*/
/* généré dans le répertoire de travail et prendra le nom de la variable fine (ici COM). */
/* ATTENTION, si un fichier de même nom existait, il sera écrasé. Cette option permet de */
/* générer des hiérarchies simples, complètes et symétriques. Il est également impératif */
/* que toutes les modalités d'une même variable impliquée soient de même longueur (éviter */
/* les dep=01,02,...,971,972... ; préférez dep=001,002...971,972. */
/* (vide) : par défaut */
/* liste des variables espacées, de la plus agrégée, à la plus détaillée (qui devra */
/* correspondre à la variable de réponse d'une des tabulations (exemple : REG DEP COM)*/
/*...hierarchy_10 Idem pour les 9 variables suivantes. */
/* (vide) : par défaut */
/*primary_secret_rules = Spécifie les règles de secret primaire. Si la variable de réponse de la tabulation */
/* est "FREQ", alors seule la règle de fréquence sera appliquée. Les règles de secret */
/* primaire peuvent être également affectées par les paramètres '&weight_var' et */
/* '&holding_var'. Ce paramètre est complété par d'autres paramètres ('&dom_k' '&dom_n' */
/* '&dom_khold' '&dom_nhold' '&p_q' '&p_n' '&p_p' '&p_qhold' '&p_nhold' '&p_phold' */
/* '&frequency' '&frequencyrange' '&frequencyhold' '&frequencyrangehold') qui spécifient */
/* les valeurs des réglages des différentes règles. */
/* DOM : règle de dominance uniquement */
/* DOM P : règle de dominance et du P% */
/* DOM FREQ : règle de dominance et de fréquence (par défaut) */
/* DOM P FREQ : règle de dominance, du P% et de fréquence */
/* P FREQ : règle du P% et de fréquence */
/* P : règle du P% uniquement */
/* FREQ : règle de fréquence uniquement */
/* NORULES : pas de règle de secret primaire (utile lorsque l'on importe le secret */
/* primaire via un fichier d'a priori (.hst) ). Lorsque ce paramètre est */
/* utilisé avec un fichier de données tabulées en entrée */
/* ("input = tabledata"), cela signifie que Tau-Argus utilisera l'option */
/* "use given status" à la place. */
/*primary_secret_rules_1= Idem, mais spécifiquement pour la tabulation_1. */
/* (vide) : par défaut prend la valeur de '&primary_secret_rules' */
/*...primary_secret_rules_10=Idem, pour la deuxième... jusqu'à la 10ème tabulation. */
/* (vide) : par défaut prend la valeur de '&primary_secret_rules' */
/*dom_k = Seuil pour la règle de dominance. Les n (paramètre '&dom_n') premiers contributeurs */
/* d'une case de la tabulation ne doivent pas excéder k% de la case. */
/* 85 : (par défaut) */
/*dom_n = Nombre de contributeurs pris en compte pour la règle de dominance. */
/* 1 : (par défaut) */
/*dom_khold = Idem '&dom_k', avec prise en compte de l'option "holding". */
/* 85 : (par défaut) */
/*dom_nhold = Idem '&dom_n', avec prise en compte de l'option "holding". */
/* 1 : (par défaut) */
/*p_p = Seuil pour la règle du P%. Les n (paramètre '&p_n') contributeurs suivant le premier */
/* d'une case de la tabulation ne doivent pas pouvoir estimer à moins de p% la valeur du */
/* premier contributeur. */
/* 10 : (par défaut) */
/*p_n = Nombre de contributeurs pris en compte pour la règle du P%. */
/* 1 : (par défaut) */
/*p_phold = Idem P_P, avec prise en compte de l'option "holding". */
/* 10 : (par défaut) */
/*p_nhold = Idem P_N, avec prise en compte de l'option "holding". */
/* 1 : (par défaut) */
/*frequency = Seuil pour la règle de fréquence. Une case doit contenir au moins x individus. */
/* 3 : (par défaut) */
/*frequencyrange = Valeur à partir de laquelle sera définie l'intervalle de sécurité pour la règle de */
/* fréquence minimale. Il s'agit habituellement d'une petite valeur positive et est */
/* nécessaire pour permettre le calcul du secret secondaire. */
/* 10 : (par défaut) */
/*frequencyhold Idem frequency, avec prise en compte de l'option "holding". */
/* 3 : (par défaut) */
/*frequencyrangehold Idem frequencyrrange, avec prise en compte de l'option "holding". */
/* 10 : (par défaut) */
/*zero_unsafe = Détermine la règle concernant le secret appliqué aux cases dont la valeur est nulle. */
/* Cette option ne modifie pas le secret en cas de secret de fréquence. */
/* (vide) : (par défaut) Une case nulle n'est pas cachée */
/* (une valeur entre 0 et 100) : l'option "zero_unsafe" est appliquée, la valeur */
/* correspondant à l'intervalle de sécurité pour les cases concernées. */
/*manual_safety_range = Lorsque le statut d'une cellule est défini manuellement comme unsafe (avec par exemple */
/* un fichier d'a priori), Tau-Argus ne peut pas calculer lui-même les intervalles de */
/* protection. Par conséquent, l'utilisateur doit fournir un pourcentage de protection */
/* à la main, qui sera appliqué lors de la suppression secondaire. */
/* 10 : (par défaut) */
/*shadow_var = Variable à partir de laquelle le secret primaire sera effectivement défini. Par défaut */
/* il s'agit de la variable de réponse. S'applique par défaut à toutes les tabulations. */
/* (vide) : par défaut */
/*shadow_var_1 = Idem, mais spécifiquement pour la tabulation_1. */
/* (vide) : par défaut prend la valeur de '&shadow_var' */
/*...shadow_var_10 = Idem, pour la deuxième... jusqu'à la 10ème tabulation. */
/* (vide) : par défaut prend la valeur de '&shadow_var' */
/*cost_var = Variable qui sera utilisée comme variable de coût pour le secret secondaire. Par défaut */
/* il s'agit de la variable de réponse. S'applique par défaut à toutes les tabulations */
/* (vide) : par défaut */
/*cost_var_1 = Idem, mais spécifiquement pour la tabulation_1. */
/* (vide) : par défaut prend la valeur de '&cost_var' */
/*...cost_var_10 = Idem, pour la deuxième... jusqu'à la 10ème tabulation. */
/* (vide) : par défaut prend la valeur de '&cost_var' */
/*bounds = Valeur correspondant à l'option "External a priori bounds on the cell value" lors de */
/* l'utilisation de la méthode hypercube. */
/* 100 : (par défaut) */
/*modelsize = Valeur correspondant à l'option "Model size" lors de l'utilisation de la méthode */
/* hypercube. */
/* 0 : normal (par défaut) */
/* 1 : indicates the large model. */
/*lp_solver = Spécifie le solveur à utiliser pour traiter le secret secondaire. */
/* free : solveur gratuit (par défaut) */
/* xpress : nécessite la licence XPress de FICO. */
/* cplex : nécessite la licence CPlex d'IBM. */
/* (vide) : solveur non-spécifié. */
/*method = Spécifie la méthode utilisée pour traiter le secret secondaire. */
/* hypercube : (par défaut) */
/* modular */
/* optimal : ne fonctionne pas pour des tableaux liés. */
/*method_1 = Idem, mais spécifiquement pour la tabulation_1. */
/* (vide) : par défaut prend la valeur de '&method' */
/*...method_10 = Idem, pour la deuxième... jusqu'à la 10ème tabulation. */
/* (vide) : par défaut prend la valeur de '&method' */
/*solver = Ancien paramètre désormais appelé method. */
/* Pour des raisons de clarté, il n'est plus possible d'utiliser ce paramètre. */
/*solver_1 = Ancien paramètre désormais appelé method_1. */
/* Pour des raisons de clarté, il n'est plus possible d'utiliser ce paramètre. */
/*...solver_10 = Ancien paramètre désormais appelé method_10. */
/* Pour des raisons de clarté, il n'est plus possible d'utiliser ce paramètre. */
/*MaxTimePerSubtable = Valeur correspondant à l'option MaxTimePerSubtable lors de l'utilisation de la méthode */
/* optimal. Il s'agit du nombre de minute qu'on accorde au logiciel pour trouver une */
/* solution optimale. */
/* (vide) : par défaut */
/*linked_tables = Spécifie si les différentes tabulations décrites dans l'appel de la macro doivent être */
/* traitées conjointement ou indépendamment en ce qui concerne le secret secondaire. */
/* yes : (par défaut) */
/* no */
/*outputtype = Spécifie le type de sortie en aval du traitement Tau-Argus. */
/* 1 : CVS-file */
/* 2 : CSV file for pivot table */
/* 3 : Code, value file */
/* 4 : SBS-output format (par défaut) */
/* 5 : Intermediate file (correspond à la sortie sous forme de tabulation (.tab) et du */
/* fichier plat de metadonnée correspondant). Format pouvant être utilisé en */
/* entrée de la macro (paramètre '&input' = tabledata) */
/*parameter = Valeur correspondant aux options secondaires lors de la récupération des données en aval*/
/* de Tau-Argus. Elle dépend de l'outputtype choisi : */
/* outputtype=1 Not used */
/* outputtype=2 1 : AddStatus */
/* 0 = not */
/* outputtype=3 1 : AddStatus */
/* 2 : suppress empty cells */
/* 3 : both options */
/* outputtype=4 0 : none (par défaut) */
/* outputtype=5 0 = Status only */
/* 1 = also Top-n scores */
/*TauArgus_exe = (OBLIGATOIRE) Répertoire et nom de l'application Tau-Argus. */
/* Ce paramètre spécifie donc indirectement la version de Tau-Argus utilisée. */
/* Par exemple : Y:\Logiciels\TauArgus\TauArgus4.2.0b5\TauArgus.exe */
/*TauArgus_version = A spécifier lorsque l'on utilise les versions de Tau-Argus antérieures ou égales à 3.5. */
/* opensource : (par défaut) */
/* (vide) : pour les versions 3.5 ou moins */
/*synthesis = Permet de générer un fichier excel résumant le nombre de case selon le statut de chaque */
/* masque sous format excel du répertoire RESULTS. */
/* yes */
/* no : (par défaut) */
/*displayed_value = Permet que les valeurs (et le nombre d'individu participant à la case des cases sous */
/* secret soient affichées dans les masques. */
/* yes : (par défaut) */
/* no */
/*work = Permet de vider la bibliothèque Work de SAS en fin de programme. */
/* empty : (par défaut) */
/*apriori_1 = Spécifie si à la tabulation_1 on associe un fichier d'a priori (.hst), qui devra porter */
/* le nom de la tabulation_1 avec l'extension .hst, et se trouver dans le répertoire de */
/* travail. */
/* yes */
/* (vide) : par défaut */
/*...apriori_10 = Idem, pour la deuxième... jusqu'à la 10ème tabulation. */
/* yes */
/* (vide) : par défaut */
/*apriori_creation = Permet de créer un fichier d'a priori (format .hst) à partir de chaque tabulation. Il */
/* s'agit d'un fichier qui devra être chargé par Tau-Argus en aval de la spécification des */
/* tableaux et des règles du secret primaire et en amont d'appliquer le secret secondaire. */
/* Cela nécessite que le paramètre '&outputtype' soit égal à "4" (sortie au format .sbs). */
/* yes : pour appliquer cette option */
/* (vide) : (par défaut) */
/********************************************************************************************************************/
/********************************************* AJOUT le 12/12/2017***************************************************/
/********************************************************************************************************************/
/*compute_missing_totals= Permet d'utiliser l'option du même nom lorsque l'on a en entrée une ou des tabulations. */
/* Cela signifie que l'on autorise Tau-Argus à recalculer les marges à partir des cases */
/* internes de la tabulation. */
/* yes : pour appliquer cette option */
/* (vide) : (par défaut) */
/********************************************************************************************************************/
/*
------------------------------------------------------------------------------------
CONSEILS EN AMONT DE L'UTILISATION DE LA MACRO
------------------------------------------------------------------------------------
- Faire en sorte qu'il n'y ait pas de valeur manquante (par exemple, effectif = .) pour les variables de réponse (numériques). Ces unités ne
participant pas aux cases de la tabulation ne doivent pas être comptabilisées, elles sont hors champ.
- Si pour certaines unités on dispose d'autorisations spéciales de diffusion (comme pour La Poste, largement dominant dans son secteur d'activité,
pour les diffusions ESANE par exemple), il conviendra de préparer un fichier d'a priori (.hst) pour chaque tabulation, avec le statut que l'on désire
appliquer aux cases concernées par la présence des unités en question.
- La table sas correspondant au paramètre '&tabsas' ne doit comporter que les unités participant aux tabulations demandées. Elle pourra néanmoins
comporter des variables ne servant pas à la pose du secret, mais plus elle sera volumineuse, plus le traitement sera long.
- Préférer les noms de variable courts, pour éviter d'avoir des TABULATIONS dépassant les 32 caractères.
- Si on doit secrétiser un nombre important de tabulations, a fortiori si les données individuelles sont volumineuses, il peut être intéressant
de tester le secret primaire en amont (via une proc means par exemple), pour n'utiliser la présente macro que pour les tabulations concernées par
du secret primaire.
- Il est possible d'utiliser les sous-macro contenues dans la macro principale, notamment :
%ASC_RDA = génère les fichiers plats de micronnées (.asc) et de métadonnées (.rda) au format compatible avec Tau-Argus, à partir de
la TABSAS.
%HRC = génère un fichier de hiérarchie (.hrc), à partir de la TABSAS. Celle-ci devra comporter toutes les variables correspondant
aux différents niveaux agrégés souhaités dans sa hiérarchie.
%TAUARGUSEXE = permet de lancer un fichier batch Tau-Argus (.arb) à partir de sas.
%FORMATING = génère des tables sas et des fichiers excel à partir des sorties Tau-Argus au format SBS (.sbs). La présentation des masques
de secret ressemble à un output d'un proc summary (une ligne = une case de la tabulation).
%SYNTHESIS = génère un fichier excel comptabilisant le nombre de cases selon leur statut, pour chaque tabulation et pour l'ensemble des
tabulations.
- Lorsque l'on travaille à partir de tableaux en entrée, plutôt qu'à partir de microdonnées (&input = tabledata), il peut être préférable d'arrondir
ses variables de réponse à l'unité, avant de tabuler. Tau-Argus est très sensible à la non additivité des marges (même s'il existe, en manuel, des
options pour ne pas tenir compte de ce problème).
------------------------------------------------------------------------------------
LES IMPERATIFS ET LIMITES
------------------------------------------------------------------------------------
- Faire en sorte que les variables hiérarchiques aient des modalités fines de même longueurs.
- Dans le cas de variable hiérarchique non symétrique et complexe (par exemple, si on désire diffuser au niveau communal dans une région, mais
uniquement au niveau départemental dans les autres régions), il faut préparer le fichier de hiérarchie en amont de l'utilisation de la macro.
- On ne peut gérer le secret que sur 10 tabulations par session Tau-Argus.
- Modular ne peut gérer que 4 variables de ventilations maximum (en comptant toutes les variables des tableaux liés).
- Hypercube ne peut gérer que 6 variables de ventilations maximum (en comptant toutes les variables des tableaux liés).
- Hypercube ne fonctionne pas avec des hiérarchies avec plus de 7 niveaux (au moins dans la version 3.5 de Tau-Argus).
------------------------------------------------------------------------------------
REMARQUES GENERALES
------------------------------------------------------------------------------------
- Dans certains cas, il n'est pas nécessaire de gérer la confidentialité en déterminant le secret primaire et en appliquant une couche de secret
secondaire.
Certaines variables de réponse peuvent être tellement corrélées à d'autres variables de réponses (effectif ETP et effectif au 3112 par exemple) qu'il
est préférable de simplement appliquer le même masque de secret au deux variables, alors défini sur l'une des deux. La variable sur laquelle est
déterminée le masque est appelée variable proxy.
- Certaines vérifications sont parfois nécessaires en plus de l'application de la macro ou de la gestion "à la main" du secret secondaire via
Tau-Argus.
Par exemple, deux variables de ventilations peuvent avoir des modalités équivalentes sans pour autant que Tau-Argus ne soit capable de le savoir. Par
exemple, la division 17 de la NAF correspond à la modalité E35 de la Nomenclature d'activités économiques 2008 (NCE 2008). Il conviendra en aval de
l'exécution de la macro, de vérifier que les cases équivalentes ont bien le même statut (notamment au niveau du secret secondaire). Si ce n'est pas
le cas, on pourra alors générer un fichier d'a priori (.hst) pour spécifier le statut que doit prendre les cases concernées.
- Dans le cas des variables hiérarchiques, il est préférable d'éviter d'avoir des modalités identiques correspondant à des niveaux d'agrégations
différents : par exemple le niveau A38 "FZ" ne correspond pas pour Tau-Argus au niveau A10 "FZ". Préférez un recodage en amont de l'appel de la
macro (par exemple : "A38_FZ" et "A10_FZ"), pour que Tau-Argus distingue bien les deux lignes du tableau.
- Dans le cas de tableaux trop volumineux (trop de cases), ou avec des valeurs très grandes (en millions/milliard) et avec beaucoup de décimales, il
peut être envisageable de faire tourner la macro sur une version modifiée de la variable de réponse. Parfois le fait d'arrondir les données peut
suffire à ce que le secret secondaire se fasse. Si cela ne suffit pas, on pourra essayer de diviser la variable par 10 par exemple.
*/
/********************************************************************************************************************/
/********************************************************************************************************************/
/* Code de la macro */
/********************************************************************************************************************/
/********************************************************************************************************************/
/********************************************************************************************************************/
/********************************************************************************************************************/
/* Creation fichiers ASC + RDA */
/********************************************************************************************************************/
/* %ASC_RDA = génère les fichiers plats de micronnées (.asc) et de métadonnées (.rda) au format compatible */
/* avec Tau-Argus, à partir de la TABSAS. */
/********************************************************************************************************************/
/********************************************************************************************************************/
%macro asc_rda (
asc = microdata.asc,
rda = metadata.rda,
library_asc_rda = ,
tabsas = ,
tabulation_1 = ,
tabulation_2 = ,
tabulation_3 = ,
tabulation_4 = ,
tabulation_5 = ,
tabulation_6 = ,
tabulation_7 = ,
tabulation_8 = ,
tabulation_9 = ,
tabulation_10 = ,
weight_var = ,
holding_var = ,
hierarchical_var = ) ;
X mkdir "&library_asc_rda.\TEMPORARY FILES MACRO" ;
%do a1 = 1 % to 10 ;
data _null_ ;
call symput ("tabulation_&a1",tranwrd("&&tabulation_&a1"," ","*")) ;
run ;
%end ;
/* On commence par la création du fichier de microdonnées (.asc)
On crée les paramètres '&response_var' et '&explanatory_var' à partir des informations des différentes tabulations. On agrège les
variables de ventilation et on élimine les doublons, idem pour les variables de comptage, en se servant de la
macro %unique qui suit la macro %asc_rda.*/
data variables ;
run ;
%do a2 = 1 % to 10 ;
data _null_ ;
call symput ("response_var_&a2",lowcase(compress(scan("&&tabulation_&a2",-1,"*")))) ;
run ;
data null ;
call symput("length_resp",length("*&&response_var_&a2"));
run;
data _null_ ;
call symput ("explanatory_var_&a2",reverse(substr(reverse ("&&tabulation_&a2"),&length_resp)));
run;
data variables ;
set variables ;
response_var_&a2 = "&&response_var_&a2" ;
explanatory_var_&a2 = "&&explanatory_var_&a2" ;
run ;
%end ;
data
response_var (keep = response_var_1 response_var_2 response_var_3 response_var_4 response_var_5 response_var_6 response_var_7 response_var_8 response_var_9 response_var_10)
explanatory_var (keep = explanatory_var_1 explanatory_var_2 explanatory_var_3 explanatory_var_4 explanatory_var_5 explanatory_var_6 explanatory_var_7 explanatory_var_8 explanatory_var_9 explanatory_var_10) ;
set variables ;
run ;
%unique (
typ_var = response_var,
sep = *) ;
%unique (
typ_var = explanatory_var,
sep = *) ;
data _null_ ;
set response_var ;
call symput ("response_var",strip(response_var)) ;
run ;
data _null_ ;
set explanatory_var ;
call symput ("explanatory_var",strip(explanatory_var)) ;
run ;
data _null_ ;
call symput ("explanatoryy_var",tranwrd("&explanatory_var","*"," ")) ;
run;
data _null_;
call symput ("test_explanatory_var",count ("&explanatoryy_var"," ")+1);
run ;
%if &test_explanatory_var > 4 %then
%do ;
data _null_ ;
put "WARNING: le nombre de variable de ventilation est de &test_explanatory_var.. La limite de variables de ventilation est de 4 maximum pour la méthode modular et de 6 maximum pour la méthode hypercube." ;
run ;
%end ;
data _null_ ;
call symput ("responsee_var",tranwrd("&response_var","*"," ")) ;
run ;
data _null_ ;
call symput ("list_varr",compbl(lowcase("&responsee_var. &explanatoryy_var. &holding_var. &weight_var"))) ;
run ;
libname tabsas "&library_asc_rda" ;
data temp01 ;
retain &list_varr ;
set tabsas.&tabsas ;
freq = 1 ;
keep &list_varr ;
run ;
%if &syserr ne 0 %then
%do ;
data _null_ ;
put "ERROR: une erreur est survenue lors de la création de la table contenant les variables de travail" ;
put "WARNING: vérifiez que les variables des tabulations, de poids et de holding sont bien identiques à celles qu'on trouve dans la table originale ('&tabsas')" ;
run ;
%abort ;
%end;
data _null_ ;
call symput ("nb_responsee_var",count("&responsee_var"," ")+1) ;
run ;
data _null_ ;
call symput ("nb_vent_var",count("&explanatoryy_var"," ")+1) ;
run ;
%do a3 = 1 %to &nb_vent_var;
data _null_;
call symput ("vent&a3",scan("&explanatoryy_var",&a3," ")) ;
data vent_length;
set temp01 (keep=&&vent&a3);
vent_length = length(&&vent&a3);
run;
proc sort data = vent_length ;
by descending vent_length ;
run;
data vent_length ;
set vent_length ;
if _n_=1;
run;
data _null_ ;
set vent_length ;
call symput ("vent_length",vent_length) ;
run;
data temp01 ;
length &&vent&a3 $&vent_length. ;
set temp01 (rename=(&&vent&a3=vent));
&&vent&a3=left(vent);
drop vent;
run;
%end;
/* On crée une table temporaire pour avec les variables de réponse pondérées, pour récupérer le bon nombre de décimal.
Modular ne gère pas les tableaux liés lorsque que la variable de réponse ne prend pas en compte les décimales après la
pondération.*/
%if "&weight_var" ne "" %then
%do ;
data decimal;
set temp01 ;
run;
%do a4 = 1 %to &nb_responsee_var ;
data _null_ ;
call symput ("responsee_var_&a4", scan("&responsee_var",&a4," ")) ;
run ;
data decimal testtt;
set decimal (rename = (&&responsee_var_&a4 = var_weighted)) ;
&&responsee_var_&a4 = var_weighted * &weight_var ;
drop var_weighted ;
run ;
proc contents data = decimal (keep = &&responsee_var_&a4)
out = content_decimal_resp (keep = type)
noprint;
run;
data _null_ ;
set content_decimal_resp;
call symput ("response_car",type);
run;
%if &response_car=1 %then
%do;
data decimal ;
set decimal (rename = (&&responsee_var_&a4 = varnum )) ;
&&responsee_var_&a4 = put(varnum,best.) ;
drop varnum ;
run ;
%end;
%end ;
proc contents data = decimal (keep = &weight_var)
out = content_decimal_wgt (keep = type)
noprint;
run;
data _null_ ;
set content_decimal_wgt ;
call symput ("weight_car",type);
run;
%if &weight_car=1 %then
%do;
data decimal ;
set decimal (rename = (&weight_var = weight_num)) ;
&weight_var = left (put(weight_num,best.)) ;
drop weight_num;
run ;
%end;
%end;
/* On vérifie qu'il ne manque pas de valeur sur les variables de réponse*/
%do a5 = 1 %to &nb_responsee_var ;
data _null_ ;
call symput ("responsee_var_&a5", scan("&responsee_var",&a5," ")) ;
run ;
data test_value ;
set temp01 ;
if &&responsee_var_&a5 = . ;
run;
data _null_;
call symput ("missing_value",0);
run;
data _null_;
set test_value END=eof;
test_value = _n_;
if eof then
do ;
call symput ("missing_value",test_value);
end;
run;
%if &missing_value > 0 %then
%do ;
data _null_ ;
put "ERROR: il manque des valeurs pour la variable de réponse &&responsee_var_&a5";
data _null_ ;
put "WARNING: Tau-Argus a besoin que tous les individus d'une tabulation aient une valeur. Veillez à supprimer les individus concernés ou à remplacer leur valeur par un 0 (ils seront alors pris en compte pour la règle de secret primaire de fréquence)." ;
run ;
%ABORT ;
%end ;
%end ;
/* Mise en forme des variables conservées : on transforme les variables numériques (&response_var et &weight) en
variables caractères. Lors de l'export en fichier plat .asc, Tau-Argus a notamment besoin que les variables avec
des décimales aient le séparateur aligné.*/
%if "&weight_var" ne "" %then
%do ;
proc contents data = temp01 (keep = &weight_var)
out = content_temp01_wgt (keep = type)
noprint;
run;
data _null_ ;
set content_temp01_wgt;
call symput ("weight_car",type);
run;
%if &weight_car=1 %then
%do;
data temp01 ;
set temp01 (rename = (&weight_var = weight_num)) ;
&weight_var = left(put(weight_num,best.)) ;
run ;
%end;
%end ;
%do a6 = 1 %to &nb_responsee_var ;
data _null_ ;
call symput ("responsee_var_&a6", scan("&responsee_var",&a6," ")) ;
run ;
%do ;
proc contents data = temp01 (keep = &&responsee_var_&a6)
out = content_temp01_resp (keep = type)
noprint;
run;
data _null_ ;
set content_temp01_resp;
call symput ("response_car",type);
run;
%if &response_car=1 %then
%do;
data temp01 ;
set temp01 (rename = (&&responsee_var_&a6 = varnum)) ;
&&responsee_var_&a6 = put(varnum,best.) ;
drop varnum ;
run ;
%end;
%end ;
%end ;
data temp01 ;
retain &explanatoryy_var &responsee_var &holding_var &weight_var ;
set temp01 ;
keep &explanatoryy_var &responsee_var &holding_var &weight_var ;
run ;
/* Gestion de l'ordre des variables.*/
data _null_ ;
call symput ("order_explanatoryy_var",tranwrd("&explanatory_var","*",",")) ;
run ;
data _null_ ;
call symput ("order_responsee_var",tranwrd(",&response_var","*",",")) ;
run ;
%if "&holding_var" ne "" %then
%do ;
data _null_ ;
call symput ("order_holding_var",",&holding_var") ;
run ;
%end ;
%else %if "&holding_var" = "" %then
%do ;
data _null_ ;
call symput ("order_holding_var","") ;
run ;
%end ;
%if "&weight_var" ne "" %then
%do ;
data _null_ ;
call symput ("order_weight_var",",&weight_var") ;
run ;
%end ;
%else %if "&weight_var" = "" %then
%do ;
data _null_ ;
call symput ("order_weight_var","") ;
run ;
%end ;
proc sql ;
create table asci as
select &order_explanatoryy_var &order_responsee_var &order_weight_var &order_holding_var from temp01 ;
quit ;
/* On récupère les infos sur les longueurs de variables.*/
proc contents noprint data = asci
out = contenti ;
run ;
proc sort data = contenti
out = contenti (keep = name length varnum) ;
by varnum ;
run ;
/* Cette data permet de récupérer l'info de la longueur de la ligne d'au-dessus, ce qui permet de calculer la
position et la longueur que prendra la variable dans le fichier plat, on a besoin ici de la position de départ et
celle d'arrivée ex. SIREN 1-9 APE 11-15 etc.*/
data _null_ ;
set contenti ;
call symput("N",_N_) ;
run ;
data list_var ;
set contenti ;
length1 = 1 ;
length2 = length ;
if varnum = 1 then list_var = compress(name||"*"||length1||"-"||length2) ;
%do a7 = 2 %to &N ;
length1 = sum(lag1(length2),2) ;
length2 = sum(length1,length,-1) ;
if varnum = &a7 then list_var = compress(name||"*"||length1||"-"||length2) ;
%end ;
list_var = tranwrd(list_var,"*"," ") ;
keep name varnum list_var ;
run ;
/* Macro variables qui permettent d'afficher la liste des variables leur position et leur longueur.*/
proc transpose data = list_var
out = temp02(drop = _name_) ;
var name ;
id varnum ;
run ;
data _null_ ;
set temp02 ;
length list_var $2000 ;
%do a8 = 1 %to &N ;
list_var = compress(list_var||"*"||_&a8) ;
%end ;
list_var = tranwrd(list_var,"*","||") ;
call symput("list_var",substr(list_var,3)) ;
run ;
proc transpose data = list_var
out = temp03 (drop = _name_) ;
var list_var ;
id name ;
run ;
data _null_ ;
set temp03 ;
list_var = &list_var ;
call symput("list_var",list_var) ;
run ;
filename asc "&library_asc_rda.\TEMPORARY FILES MACRO\&asc" ;
data _null_ ;
set asci ;
file asc ;
put &list_var ;
run ;
/* On passe à la création du fichier de métadonnée (.rda)
On récupère pour chaque variable que l'on a exportée dans le .asc les infos de la position et de longueur de la
variable (et non les positions de départ/arrivée).Ex :
SIREN 1 9
APE 11 5
etc.
On remplace les variables décrites dans le paramètre '&hierarchical_var' par les noms génériques correspondant.*/
data _null_ ;
call symput ("explanatoryy_var_entre_cote", upcase(tranwrd("&explanatory_var","*",'" "'))) ;
call symput ("responsee_var_entre_cote", upcase(tranwrd("&response_var","*",'" "'))) ;
call symput ("hierarchical_var_entre_cote", upcase(tranwrd("&hierarchical_var"," ",'" "'))) ;
run ;
proc sort data = list_var ;
by varnum ;
run ;
proc sort data = contenti ;
by varnum ;
run ;
data rda ;
length HIERCODELIST $1000 ;
merge
list_var
contenti (keep = varnum length) ;
by varnum ;
list_var = tranwrd(list_var," ","*") ;
list_var = tranwrd(compbl(scan(list_var,-2,"-")||" "||length),"*"," ") ;
if upcase(compress(name)) in ("&explanatoryy_var_entre_cote") then type_var = "<RECODEABLE>" ;
if upcase(compress(name)) in ("&hierarchical_var_entre_cote")then
do ; HIERARCHICAL = "<HIERARCHICAL>" ;
HIERLEADSTRING = '<HIERLEADSTRING> "@"' ;
HIERCODELIST = "<HIERCODELIST> "||'"'||"&library_asc_rda.\"||compress(name||".hrc"||'"') ;
end ;
HIERLEVELS = "" ;
if upcase(compress(name)) in ("&responsee_var_entre_cote") then type_var = "<NUMERIC>" ;
if upcase(compress(name)) = upcase("&weight_var") then type_var = "<WEIGHT>" ;
if upcase(compress(name)) = upcase("&holding_var") then type_var = "<HOLDING>" ;
run ;
proc sort data = rda ;
by name ;
run ;
%let varr = &responsee_var &weight_var ;
/* S'il n'y a pas de variable de poids, on se sert de la variable de réponse de base pour déterminer le nombre de décimales*/
%if &weight_var = %then
%do;
data decimal ;
set asci;
run;
%end;
/* La macro %decimal permet de récupérer l'info du nombre de décimale pour les variables de comptage et de poids.*/
%macro decimal (decimal=) ;
%do loop = 1 %to %sysfunc(countw(&varr.)) ;
%let WORD = %scan(&decimal.,&loop.) ;
/* %put boucle &loop. : &WORD. ; */
data temp05 ;
set decimal ;
max_varr = 0 ;
%do a9 = 0 % to 9 ;
max_varr = max_varr+count(scan(&word,2,"."),"&a9") ;
%end ;
run ;
proc means data = temp05 noprint max ;
var max_varr ;
output out = temp05
max = decimal ;
run ;
data temp05 ;
set temp05 ;
name = "&word" ;
run ;
data rda ;
merge
rda
temp05 (keep = name decimal) ;
by name ;
if decimal = 0 then decimal = . ;
run ;
%end ;
%mend ;
%decimal (decimal = &varr) ;
proc sort data = rda ;
by varnum ;
run ;
/* On ordonne les variables pour que le fichier de métadonnée (.rda) soit lisible par Tau-Argus.*/
data rda ;
set rda (rename = (decimal = decimalll)) ;
decimall = left(put(decimalll,best.)) ;
if decimalll ne . then decimal = "<DECIMALS>"||" "||decimall ;
drop decimalll decimall ;
num_listvar = 1+7*(_n_-1) ;
num_type_var = num_listvar+1 ;
num_decimal = num_listvar+2 ;
num_HIERARCHICAL = num_listvar+3 ;
num_HIERLEADSTRING = num_listvar+4 ;
num_HIERCODELIST = num_listvar+5 ;
num_HIERLEVELS = num_listvar+6 ;
run ;
data rda ;
length instruction$1000 ;
merge
rda (keep = list_var num_listvar rename = (list_var = instruction num_listvar = num))
rda (keep = type_var num_type_var rename = (type_var = instruction num_type_var = num))
rda (keep = decimal num_decimal rename = (decimal = instruction num_decimal = num))
rda (keep = HIERARCHICAL num_HIERARCHICAL rename = (HIERARCHICAL = instruction num_HIERARCHICAL = num))
rda (keep = HIERLEADSTRING num_HIERLEADSTRING rename = (HIERLEADSTRING = instruction num_HIERLEADSTRING = num))
rda (keep = HIERCODELIST num_HIERCODELIST rename = (HIERCODELIST = instruction num_HIERCODELIST = num))
rda (keep = HIERLEVELS num_HIERLEVELS rename = (HIERLEVELS = instruction num_HIERLEVELS = num)) ;
by num ;
drop num ;
if instruction ne "" ;
run ;
filename rda "&library_asc_rda.\TEMPORARY FILES MACRO\&rda" ;
data _null_ ;
set rda ;
file rda ;
put instruction ;
run ;
%mend ;
/********************************************************************************************************************/
/********************************************************************************************************************/
/* suppression des doublons dans une liste de variable */
/********************************************************************************************************************/
/* %unique = supprime les doublons dans une liste de variable */
/********************************************************************************************************************/
/********************************************************************************************************************/
%macro unique (
typ_var = ,
sep = ) ;
proc transpose data = &typ_var
out = &typ_var (drop = _name_) ;
var _all_ ;
run ;
data max ;
set &typ_var ;
max = count(col1,"&sep")+1 ;
run ;
proc sort data = max ;
by descending max ;
run ;
data max ;
set max ;
if _n_ = 1 ;
keep max ;
run ;
data _null_ ;
set max ;
call symput ("n_var",max) ;
run ;
data &typ_var ;
set &typ_var ;
tabulation = col1 ;
%do b1 = 1 %to &n_var ;
col&b1 = scan(tabulation,&b1,"&sep") ;
%end ;
test = &n_var ;
run ;
%MACRO tables_set ;
%do b2 = 2 %to &n_var ;
&typ_var (keep = col&b2 rename = (col&b2 = col1))
%end ;
%mend ;
data &typ_var ;
set
&typ_var (keep = col1)
%tables_set ;
n = _n_ ;
run ;
proc sort data = &typ_var (where = (col1 ne ""))nodupkey ;
by col1 ;
run ;
proc sort data = &typ_var ;
by n ;
run ;
proc transpose data = &typ_var (drop = n)
out = &typ_var (drop = _name_) ;
var col1 ;
run ;
data &typ_var ;
length &typ_var $200 ;
set &typ_var ;
&typ_var = "" ;
array y _all_ ;
do over y ;
&typ_var = compbl(&typ_var||" "||y) ;
end ;
&typ_var = substr(tranwrd(compbl(tranwrd(tranwrd(&typ_var," ","&sep"),"&sep&sep",""))||" ","&sep ",""),2) ;
keep &typ_var ;
run ;
%mend ;
/********************************************************************************************************************/
/********************************************************************************************************************/
/* Création de fichier de hiérarchie (.hrc) */
/********************************************************************************************************************/
/* %hrc = génère un fichier de hiérarchie (.hrc), à partir de la TABSAS. Celle-ci devra comporter toutes les */
/* variables correspondant aux différents niveaux agrégés souhaités dans sa hiérarchie. */
/* Cette macro ne peut générer que des hiérarchies "symétriques", ou "complètes" */
/* Les longueurs des modalités de la &detailled_var doivent être égales. */
/* Les paramètres de la macro : */
/* tab = nom de la table sas (doivent s'y trouver : les variables correspondant à */
/* chaque niveau agrégé ("commune","dep", "reg" par exemple) */
/* detailed_var= nom de la variable fine ("commune" par exemple) */
/* agreg = noms des variables séparés par un espace qui font partie de l'arbre dans */
/* l'ordre du plus agrégé au plus fin ("reg dep commune") */