ETL CAS

Fehlende Werte mit der LAG-Funktion imputieren

Dieser Code ist auch verfügbar auf: English Español
Schwierigkeitsgrad
Anfänger
Veröffentlicht am :
Die LAG-Funktion ist entscheidend für sequentielle Verarbeitungen in einem DATA Step, insbesondere für die Datenimputation. In einer SAS© Viya-Umgebung ist es bei der Verarbeitung von Daten im verteilten Speicher (CAS) zwingend erforderlich, die Option SESSREF='casauto' SINGLE=YES in der DATA-Anweisung zu verwenden. Diese Option stellt sicher, dass die Verarbeitung auf einem einzigen Thread auf einem einzigen CAS-Knoten erfolgt, wodurch unvorhersehbare Ergebnisse aufgrund der Datenverteilung vermieden werden, die die LAG-Funktion daran hindern würde, die vorherige Beobachtung zuverlässig zu sehen. Das Beispiel zeigt eine bedingte Imputation, bei der, wenn der aktuelle Wert fehlt, dieser aus dem Wert des Vorjahres (um 10% erhöht) geschätzt wird. Fehlt auch der vorherige Wert, basiert die Imputation auf dem Wert des vorletzten Jahres (um 20% erhöht).
Datenanalyse

Type : CREATION_INTERNE


Die Beispiele verwenden generierte Daten (datalines), um Autonomie und Reproduzierbarkeit zu gewährleisten.

1 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel illustriert eine einfache Imputation. Wenn die Umsätze eines Jahres fehlen, werden sie imputiert, indem die Umsätze des Vorjahres um 5% erhöht werden. Die Variable `last_ventes` wird verwendet, um den letzten bekannten Wert zu speichern, was unerlässlich ist, wenn die LAG-basierte Imputation auch auf einen fehlenden Wert trifft. Die Option `single=yes` wird angegeben, um eine sequentielle Verarbeitung auf einem einzigen CAS-Knoten zu gewährleisten, was für die LAG-Funktion in einer verteilten Umgebung notwendig ist.
Kopiert!
1LIBNAME mycas cas;
2 
3DATA mycas.ventes_annuelles;
4 INPUT Annee Ventes;
5 DATALINES;
6 2020 1000
7 2021 1100
8 2022 .
9 2023 1300
10 2024 .
11 ;
12RUN;
13 
14DATA mycas.ventes_imputees (sessref="casauto" single=yes);
15 SET mycas.ventes_annuelles;
16 retain last_ventes;
17 IF Ventes = . THEN DO;
18 lag_ventes = lag(Ventes);
19 IF lag_ventes ne . THEN Ventes_imputees = lag_ventes * 1.05; /* Imputation mit +5% vom Vorjahr */
20 ELSE Ventes_imputees = last_ventes * 1.05; /* Verwendet den letzten bekannten Umsatz, falls LAG auch fehlt */
21 END;
22 ELSE DO;
23 Ventes_imputees = Ventes;
24 last_ventes = Ventes;
25 END;
26RUN;
27 
28PROC PRINT DATA=mycas.ventes_imputees;
29 title "Exemple 1: Imputation Basique des Ventes Manquantes";
30RUN;
31 
32PROC CAS;
33 TABLE.dropTable / caslib="mycas" name="ventes_annuelles";
34 TABLE.dropTable / caslib="mycas" name="ventes_imputees";
35RUN;
36 
2 Codeblock
DATA STEP Data
Erklärung :
Dieses fortgeschrittene Beispiel verwendet sowohl `LAG` als auch `LAG2`, um aufeinanderfolgende fehlende Werte zu behandeln. Für jedes Produkt (definiert durch `BY Produit`), wenn die Menge fehlt, versucht das Skript zuerst, diese mit der Menge des Vormonats zu imputieren (um 2% erhöht). Wenn die Menge des Vormonats ebenfalls fehlt, wird die Menge des vorletzten Monats verwendet (um 4% erhöht). Wenn kein vorheriger Wert verfügbar ist, wird die Menge mit 0 imputiert. Die Initialisierung der Variablen `lag_quantite` und `lag2_quantite` bei jeder neuen `Produit`-Gruppe ist entscheidend für korrekte Berechnungen.
Kopiert!
1LIBNAME mycas cas;
2 
3DATA mycas.stock_produit;
4 INPUT Produit $ Mois Quantite;
5 DATALINES;
6 A 1 100
7 A 2 110
8 A 3 .
9 A 4 .
10 A 5 130
11 B 1 200
12 B 2 .
13 B 3 220
14 B 4 230
15 ;
16RUN;
17 
18DATA mycas.stock_impute (sessref="casauto" single=yes);
19 SET mycas.stock_produit;
20 BY Produit;
21 IF first.Produit THEN DO;
22 lag_quantite = .;
23 lag2_quantite = .;
24 END;
25 ELSE DO;
26 lag_quantite = lag(Quantite);
27 lag2_quantite = lag2(Quantite);
28 END;
29 
30 IF Quantite = . THEN DO;
31 IF lag_quantite ne . THEN Quantite_imputee = lag_quantite * 1.02; /* +2% vom vorherigen Wert */
32 ELSE IF lag2_quantite ne . THEN Quantite_imputee = lag2_quantite * 1.04; /* +4% vom Wert vor dem Vorjahr */
33 ELSE Quantite_imputee = 0; /* Wenn kein vorheriger Wert verfügbar ist */
34 END;
35 ELSE Quantite_imputee = Quantite;
36RUN;
37 
38PROC PRINT DATA=mycas.stock_impute;
39 title "Exemple 2: Imputation de Quantités Manquantes avec LAG et LAG2";
40RUN;
41 
42PROC CAS;
43 TABLE.dropTable / caslib="mycas" name="stock_produit";
44 TABLE.dropTable / caslib="mycas" name="stock_impute";
45RUN;
46 
3 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel implementiert eine erweiterte Imputation mit Gruppenverarbeitung (`BY Departement Annee`). Für jede Abteilung und jedes Jahr werden fehlende 'Reclamations'-Werte mit dem Wert des Vormonats imputiert. Wenn der vorherige Wert ebenfalls fehlt, wird der letzte nicht fehlende Wert derselben Gruppe verwendet. `RETAIN` und `FIRST.BYVAR` werden verwendet, um den Zustand über die Gruppen hinweg zu verwalten und `LAG` am Anfang jeder neuen Gruppe zurückzusetzen. Dies ist besonders nützlich für Paneldaten, bei denen die Sequenzen pro Gruppe beachtet werden müssen.
Kopiert!
1LIBNAME mycas cas;
2 
3DATA mycas.reclamations_mensuelles;
4 INPUT Departement $ Annee Mois Reclamations;
5 DATALINES;
6 IT 2022 1 10
7 IT 2022 2 12
8 IT 2022 3 .
9 IT 2022 4 15
10 IT 2023 1 .
11 IT 2023 2 18
12 HR 2022 1 20
13 HR 2022 2 .
14 HR 2022 3 25
15 HR 2023 1 22
16 HR 2023 2 .
17 HR 2023 3 .
18 HR 2023 4 30
19 ;
20RUN;
21 
22DATA mycas.reclamations_imputees (sessref="casauto" single=yes);
23 SET mycas.reclamations_mensuelles;
24 BY Departement Annee;
25 retain last_reclamations_in_group;
26 
27 IF first.Departement or first.Annee THEN DO;
28 lag_reclamations = .;
29 last_reclamations_in_group = .;
30 END;
31 ELSE lag_reclamations = lag(Reclamations);
32 
33 IF Reclamations = . THEN DO;
34 IF lag_reclamations ne . THEN Reclamations_imputees = lag_reclamations;
35 ELSE IF last_reclamations_in_group ne . THEN Reclamations_imputees = last_reclamations_in_group;
36 ELSE Reclamations_imputees = 0; /* Imputation mit 0, wenn kein vorheriger Wert */
37 END;
38 ELSE DO;
39 Reclamations_imputees = Reclamations;
40 last_reclamations_in_group = Reclamations;
41 END;
42RUN;
43 
44PROC PRINT DATA=mycas.reclamations_imputees;
45 title "Exemple 3: Imputation de Réclamations Manquantes par Département et Année";
46RUN;
47 
48PROC CAS;
49 TABLE.dropTable / caslib="mycas" name="reclamations_mensuelles";
50 TABLE.dropTable / caslib="mycas" name="reclamations_imputees";
51RUN;
52 
4 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel demonstriert die Integration in SAS Viya/CAS für die Imputation von Reaktionszeiten. Es verwendet `SESSREF="casauto" SINGLE=YES`, um sicherzustellen, dass die `LAG`-Operationen korrekt auf einem einzigen Thread in der verteilten CAS-Umgebung ausgeführt werden. Fehlende Werte werden unter Verwendung des letzten bekannten Wertes innerhalb jedes `Service` imputiert. Wenn kein vorheriger Wert verfügbar ist (z.B. für die erste Beobachtung eines Dienstes mit einem fehlenden Wert), wird ein Standardwert von 30 verwendet. Dieser Fall hebt die Robustheit der Imputationslogik und die Behandlung von Grenzbereichen hervor.
Kopiert!
1LIBNAME mycas cas;
2 
3DATA mycas.temps_reponse;
4 INPUT Service $ Date : yymmdd. TempsReponse;
5 FORMAT Date yymmdd10.;
6 DATALINES;
7 Email 20230101 15
8 Email 20230102 20
9 Email 20230103 .
10 Email 20230104 .
11 Email 20230105 25
12 Chat 20230101 5
13 Chat 20230102 .
14 Chat 20230103 8
15 ;
16RUN;
17 
18DATA mycas.temps_reponse_impute (sessref="casauto" single=yes);
19 SET mycas.temps_reponse;
20 BY Service;
21 retain last_temps_reponse_service;
22 
23 IF first.Service THEN DO;
24 lag_temps_reponse = .;
25 last_temps_reponse_service = .;
26 END;
27 ELSE lag_temps_reponse = lag(TempsReponse);
28 
29 IF TempsReponse = . THEN DO;
30 IF lag_temps_reponse ne . THEN TempsReponse_impute = lag_temps_reponse;
31 ELSE IF last_temps_reponse_service ne . THEN TempsReponse_impute = last_temps_reponse_service;
32 ELSE TempsReponse_impute = 30; /* Standardimputation mit 30, wenn kein vorheriger Wert */
33 END;
34 ELSE DO;
35 TempsReponse_impute = TempsReponse;
36 last_temps_reponse_service = TempsReponse;
37 END;
38RUN;
39 
40PROC PRINT DATA=mycas.temps_reponse_impute;
41 title "Exemple 4: Imputation de Temps de Réponse Manquants dans CAS";
42RUN;
43 
44PROC CAS;
45 TABLE.dropTable / caslib="mycas" name="temps_reponse";
46 TABLE.dropTable / caslib="mycas" name="temps_reponse_impute";
47RUN;
48 
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Copyright © SAS Institute Inc. All Rights Reserved.


Zugehörige Dokumentation

Aucune documentation spécifique pour cette catégorie.