Bonjour,
Ton code semble plutôt approximatif (notamment, tu utilises la variable UC qui n'est définie nulle part : je supporse que UC = Revenu1 ?)
Ton code revu (simplifié) et corrigé pourrait être le suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
data c;input id $ UC ponderation ;cards;
A 100 0.5
A 200 0.3
A 150 1
A 40 0.8
B 10 0.5
B 20 0.3
B 15 1
B 4 0.8
C 1000 0.5
C 2000 0.3
C 1500 1
C 400 0.8
;
run;
Proc sort data = c ;By id;Run;
data e;Set c;By id;
retain UCmenag . ;
UCmenag + UC;
if last.id then output;
Run;
proc print data = e;run; |
... sauf que ce code ne répond pas à la question posée : ce code te donne le TOTAL des revenus par ménage.
Pour obtenir la moyenne et la médiane, il faudrait que tu précises la définition de la variable "pondération" : cette variable doit-elle être prise en compte dans ces calculs ?
Je vais ici supposer que oui : on va donc calculer une moyenne PONDEREE et une médiane qui tienne compte également de cette pondération.
Pour cela, on a besoin tout d'abord de calculer la somme des pondérations pour chaque ménage :
proc summary data = c;var ponderation;output out = Spond sum=Totpond;by id;run;
On obtient une table à joindre à la table initiale :
data d;merge c Spond(drop=_:);by id;run;
(ici, la somme des pondérations est la même pour les 3 individus).
C'est là que ça se complique :
Pour calculer le revenu médian de chaque ménage, on aura besoin de repérer (une fois les revenus triés dans l'ordre croissant) à partir de quel revenu la pondération cumulée atteint ou dépasse la moitié du total de la pondération : on va donc calculer cette pondération cumulée pour chaque individu (nouvelle variable CumPond). Et pour calculer la moyenne pondérée, on aura besoin des produits pondération*Revenu (nouvelle variable RevPond)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| proc sort data =d;by id uc;run;
data E;set d;By id;
retain CumPond ;
CumPond + ponderation;
if first.id then CumPond = ponderation;
RevPond = ponderation * UC;
run;
proc print;run;
data Moyennes;set E;by id;
If last.id then do;
moyenne = RevPond/CumPond ;
output;
end;
run;
data Medianes;
set E;by id;
If CumPond = TotPond/2 then do;
mediane = UC ;
output;
end;
run; |
ATTENTION ! Le calcul précédent de la médiane ne fonctionnera que si la médiane est une valeur réellement prise (au moins) une fois par le ménage
Partager