Los ejemplos utilizan datos generados (datalines) para asegurar la autonomía y la reproducibilidad.
1 Bloque de código
DATA STEP Data
Explicación : Este ejemplo ilustra una imputación simple. Si las ventas de un año son faltantes, se imputan aumentando las ventas del año anterior en un 5%. La variable `last_ventes` se utiliza para conservar el último valor conocido, lo cual es esencial si la imputación basada en `LAG` también encuentra un valor faltante. La opción `single=yes` se especifica para garantizar un procesamiento secuencial en un solo nodo CAS, lo cual es necesario para la función `LAG` en un entorno distribuido.
¡Copiado!
libname mycas cas;
data mycas.ventes_annuelles;
input Annee Ventes;
datalines;
2020 1000
2021 1100
2022 .
2023 1300
2024 .
;
run;
data mycas.ventes_imputees (sessref="casauto" single=yes);
set mycas.ventes_annuelles;
retain last_ventes;
if Ventes = . then do;
lag_ventes = lag(Ventes);
if lag_ventes ne . then Ventes_imputees = lag_ventes * 1.05; /* Imputation avec +5% de l'année précédente */
else Ventes_imputees = last_ventes * 1.05; /* Utilise la dernière vente connue si LAG est aussi manquant */
end;
else do;
Ventes_imputees = Ventes;
last_ventes = Ventes;
end;
run;
proc print data=mycas.ventes_imputees;
title "Exemple 1: Imputation Basique des Ventes Manquantes";
run;
proc cas;
table.dropTable / caslib="mycas" name="ventes_annuelles";
table.dropTable / caslib="mycas" name="ventes_imputees";
run;
1
LIBNAME mycas cas;
2
3
DATA mycas.ventes_annuelles;
4
INPUT Annee Ventes;
5
DATALINES;
6
20201000
7
20211100
8
2022 .
9
20231300
10
2024 .
11
;
12
RUN;
13
14
DATA mycas.ventes_imputees (sessref="casauto" single=yes);
15
SET mycas.ventes_annuelles;
16
retain last_ventes;
17
IF Ventes = . THENDO;
18
lag_ventes = lag(Ventes);
19
IF lag_ventes ne . THEN Ventes_imputees = lag_ventes * 1.05; /* Imputation avec +5% de l'année précédente */
20
ELSE Ventes_imputees = last_ventes * 1.05; /* Utilise la dernière vente connue si LAG est aussi manquant */
21
END;
22
ELSEDO;
23
Ventes_imputees = Ventes;
24
last_ventes = Ventes;
25
END;
26
RUN;
27
28
PROC PRINTDATA=mycas.ventes_imputees;
29
title "Exemple 1: Imputation Basique des Ventes Manquantes";
Explicación : Este ejemplo avanzado utiliza tanto `LAG` como `LAG2` para gestionar valores faltantes consecutivos. Para cada producto (definido por `BY Produit`), si la cantidad está faltante, el script intenta primero imputarla con la cantidad del mes anterior (aumentada en un 2%). Si la cantidad del mes anterior también está faltante, utiliza la cantidad del penúltimo mes (aumentada en un 4%). Si no hay ningún valor anterior disponible, la cantidad se imputa a 0. La inicialización de las variables `lag_quantite` y `lag2_quantite` en cada nuevo grupo `Produit` es crucial para cálculos correctos.
¡Copiado!
libname mycas cas;
data mycas.stock_produit;
input Produit $ Mois Quantite;
datalines;
A 1 100
A 2 110
A 3 .
A 4 .
A 5 130
B 1 200
B 2 .
B 3 220
B 4 230
;
run;
data mycas.stock_impute (sessref="casauto" single=yes);
set mycas.stock_produit;
by Produit;
if first.Produit then do;
lag_quantite = .;
lag2_quantite = .;
end;
else do;
lag_quantite = lag(Quantite);
lag2_quantite = lag2(Quantite);
end;
if Quantite = . then do;
if lag_quantite ne . then Quantite_imputee = lag_quantite * 1.02; /* +2% de la valeur précédente */
else if lag2_quantite ne . then Quantite_imputee = lag2_quantite * 1.04; /* +4% de la valeur d'avant l'année précédente */
else Quantite_imputee = 0; /* Si aucune valeur précédente n'est disponible */
end;
else Quantite_imputee = Quantite;
run;
proc print data=mycas.stock_impute;
title "Exemple 2: Imputation de Quantités Manquantes avec LAG et LAG2";
run;
proc cas;
table.dropTable / caslib="mycas" name="stock_produit";
table.dropTable / caslib="mycas" name="stock_impute";
run;
1
LIBNAME mycas cas;
2
3
DATA mycas.stock_produit;
4
INPUT Produit $ Mois Quantite;
5
DATALINES;
6
A 1100
7
A 2110
8
A 3 .
9
A 4 .
10
A 5130
11
B 1200
12
B 2 .
13
B 3220
14
B 4230
15
;
16
RUN;
17
18
DATA mycas.stock_impute (sessref="casauto" single=yes);
19
SET mycas.stock_produit;
20
BY Produit;
21
IF first.Produit THENDO;
22
lag_quantite = .;
23
lag2_quantite = .;
24
END;
25
ELSEDO;
26
lag_quantite = lag(Quantite);
27
lag2_quantite = lag2(Quantite);
28
END;
29
30
IF Quantite = . THENDO;
31
IF lag_quantite ne . THEN Quantite_imputee = lag_quantite * 1.02; /* +2% de la valeur précédente */
32
ELSEIF lag2_quantite ne . THEN Quantite_imputee = lag2_quantite * 1.04; /* +4% de la valeur d'avant l'année précédente */
33
ELSE Quantite_imputee = 0; /* Si aucune valeur précédente n'est disponible */
34
END;
35
ELSE Quantite_imputee = Quantite;
36
RUN;
37
38
PROC PRINTDATA=mycas.stock_impute;
39
title "Exemple 2: Imputation de Quantités Manquantes avec LAG et LAG2";
Explicación : Este ejemplo implementa una imputación avanzada con procesamiento por grupo (`BY Departement Annee`). Para cada departamento y año, los valores faltantes de 'Reclamations' se imputan con el valor del mes anterior. Si el valor anterior también está faltante, se utiliza el último valor no faltante del mismo grupo. `RETAIN` y `FIRST.BYVAR` se usan para gestionar el estado a través de los grupos y reiniciar `LAG` al inicio de cada nuevo grupo. Esto es particularmente útil para datos de panel donde las secuencias deben respetarse por grupo.
¡Copiado!
libname mycas cas;
data mycas.reclamations_mensuelles;
input Departement $ Annee Mois Reclamations;
datalines;
IT 2022 1 10
IT 2022 2 12
IT 2022 3 .
IT 2022 4 15
IT 2023 1 .
IT 2023 2 18
HR 2022 1 20
HR 2022 2 .
HR 2022 3 25
HR 2023 1 22
HR 2023 2 .
HR 2023 3 .
HR 2023 4 30
;
run;
data mycas.reclamations_imputees (sessref="casauto" single=yes);
set mycas.reclamations_mensuelles;
by Departement Annee;
retain last_reclamations_in_group;
if first.Departement or first.Annee then do;
lag_reclamations = .;
last_reclamations_in_group = .;
end;
else lag_reclamations = lag(Reclamations);
if Reclamations = . then do;
if lag_reclamations ne . then Reclamations_imputees = lag_reclamations;
else if last_reclamations_in_group ne . then Reclamations_imputees = last_reclamations_in_group;
else Reclamations_imputees = 0; /* Imputation par 0 si aucune valeur précédente */
end;
else do;
Reclamations_imputees = Reclamations;
last_reclamations_in_group = Reclamations;
end;
run;
proc print data=mycas.reclamations_imputees;
title "Exemple 3: Imputation de Réclamations Manquantes par Département et Année";
run;
proc cas;
table.dropTable / caslib="mycas" name="reclamations_mensuelles";
table.dropTable / caslib="mycas" name="reclamations_imputees";
run;
1
LIBNAME mycas cas;
2
3
DATA mycas.reclamations_mensuelles;
4
INPUT Departement $ Annee Mois Reclamations;
5
DATALINES;
6
IT 2022110
7
IT 2022212
8
IT 20223 .
9
IT 2022415
10
IT 20231 .
11
IT 2023218
12
HR 2022120
13
HR 20222 .
14
HR 2022325
15
HR 2023122
16
HR 20232 .
17
HR 20233 .
18
HR 2023430
19
;
20
RUN;
21
22
DATA 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 THENDO;
28
lag_reclamations = .;
29
last_reclamations_in_group = .;
30
END;
31
ELSE lag_reclamations = lag(Reclamations);
32
33
IF Reclamations = . THENDO;
34
IF lag_reclamations ne . THEN Reclamations_imputees = lag_reclamations;
35
ELSEIF last_reclamations_in_group ne . THEN Reclamations_imputees = last_reclamations_in_group;
36
ELSE Reclamations_imputees = 0; /* Imputation par 0 si aucune valeur précédente */
37
END;
38
ELSEDO;
39
Reclamations_imputees = Reclamations;
40
last_reclamations_in_group = Reclamations;
41
END;
42
RUN;
43
44
PROC PRINTDATA=mycas.reclamations_imputees;
45
title "Exemple 3: Imputation de Réclamations Manquantes par Département et Année";
Explicación : Este ejemplo demuestra la integración en SAS Viya/CAS para la imputación de tiempos de respuesta. Utiliza `SESSREF="casauto" SINGLE=YES` para asegurar que las operaciones `LAG` se realicen correctamente en un solo hilo en el entorno distribuido de CAS. Los valores faltantes se imputan utilizando el último valor conocido dentro de cada `Service`. Si no hay ningún valor anterior disponible (por ejemplo, para la primera observación de un servicio con un valor faltante), se utiliza un valor predeterminado de 30. Este caso resalta la robustez de la lógica de imputación y la gestión de casos límite.
¡Copiado!
libname mycas cas;
data mycas.temps_reponse;
input Service $ Date : yymmdd. TempsReponse;
format Date yymmdd10.;
datalines;
Email 20230101 15
Email 20230102 20
Email 20230103 .
Email 20230104 .
Email 20230105 25
Chat 20230101 5
Chat 20230102 .
Chat 20230103 8
;
run;
data mycas.temps_reponse_impute (sessref="casauto" single=yes);
set mycas.temps_reponse;
by Service;
retain last_temps_reponse_service;
if first.Service then do;
lag_temps_reponse = .;
last_temps_reponse_service = .;
end;
else lag_temps_reponse = lag(TempsReponse);
if TempsReponse = . then do;
if lag_temps_reponse ne . then TempsReponse_impute = lag_temps_reponse;
else if last_temps_reponse_service ne . then TempsReponse_impute = last_temps_reponse_service;
else TempsReponse_impute = 30; /* Imputation par défaut à 30 si aucune valeur précédente */
end;
else do;
TempsReponse_impute = TempsReponse;
last_temps_reponse_service = TempsReponse;
end;
run;
proc print data=mycas.temps_reponse_impute;
title "Exemple 4: Imputation de Temps de Réponse Manquants dans CAS";
run;
proc cas;
table.dropTable / caslib="mycas" name="temps_reponse";
table.dropTable / caslib="mycas" name="temps_reponse_impute";
run;
1
LIBNAME mycas cas;
2
3
DATA mycas.temps_reponse;
4
INPUT Service $ Date : yymmdd. TempsReponse;
5
FORMAT Date yymmdd10.;
6
DATALINES;
7
Email 2023010115
8
Email 2023010220
9
Email 20230103 .
10
Email 20230104 .
11
Email 2023010525
12
Chat 202301015
13
Chat 20230102 .
14
Chat 202301038
15
;
16
RUN;
17
18
DATA 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 THENDO;
24
lag_temps_reponse = .;
25
last_temps_reponse_service = .;
26
END;
27
ELSE lag_temps_reponse = lag(TempsReponse);
28
29
IF TempsReponse = . THENDO;
30
IF lag_temps_reponse ne . THEN TempsReponse_impute = lag_temps_reponse;
31
ELSEIF last_temps_reponse_service ne . THEN TempsReponse_impute = last_temps_reponse_service;
32
ELSE TempsReponse_impute = 30; /* Imputation par défaut à 30 si aucune valeur précédente */
33
END;
34
ELSEDO;
35
TempsReponse_impute = TempsReponse;
36
last_temps_reponse_service = TempsReponse;
37
END;
38
RUN;
39
40
PROC PRINTDATA=mycas.temps_reponse_impute;
41
title "Exemple 4: Imputation de Temps de Réponse Manquants dans CAS";
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.