Spalten aufsummieren?!

Hallo liebe SAS-Gemeinschaft :),

ich versuche gerade mit SAS 9.1 (EG 4.2) den Gini-Koeffizienten für mehrere Merkmale auszurechnen (max. 7 Merkmale). Nur habe ich jetzt ein Problem. Bisher habe ich immer nur zeilenweise gerechnet, heißt: Var1 + Var2 = Var3 o.ä. Wie muss ich vorgehen wenn ich ein Merkmal zuerst der Größe nach aufsteigend sortieren will und im Anschluss die kumulierte Summe ausgeben will?

Bsp (vereinfacht 5 Datensätze und 1 Variable):
Variable 1:
1
2
3
4
5

Kummulierte Summe:
1
3
6
10
15

Ich hoffe, dass ich mein Problem verständlich beschrieben habe :-)

Besten Dank
Swen

PS: Evtl. hat einer von euch ja sogar schon einen fertigen Code zur Berechnung des Gini-Koeffizienten?! Gibt es für sowas irgendwo eine Code-Bibliothek oder so?

SAS Code für den Gini

http://www.public.iastate.edu/~pdixon/sas/
http://www.unc.edu/~pnc/gini.sas

Und als weitere Alternative kann man laut http://www.sas-programming.com/2009/10/auc-calculation-using-wilcoxon-rank-sum.html auch einfach Somers'D aus der proc freq verwenden.

Hallo, Danke für Deinen

Hallo,

Danke für Deinen Tipp!

Die gini.sas hatte ich auch bereits gefunden. Nur bin ich mit dem Code nicht wirklich klar gekommen. Nach Rücksprache mit meinem Prof. ist die Berechnung des Ginis auf den 0,5%-Perzentil-Gruppenwerten mehr als ausreichend. Daher habe ich mir einfach die Perzentile berechnen lassen, Perzentil-Dummys erstellt und mittels proc means die Summen des Merkmals klassiert nach der Perzentil-Dummy ausgeben lassen. Alles etwas pragmatisch... :-) Vorteil dabei ist, dass ich ganz einfach auch Theil's T, den Hoover-Index sowie den Herfindahl-Index berechnen kann.

Vielen Dank
Swen

Data neu; set

Data neu;
set alt;
sum+var1;
run;

und in sum steht die kumulierte Summe.
Gruss MK

Hallo Muschik, besten Dank

Hallo Muschik,

besten Dank für Deine Antwort. Noch bin ich nicht dazu gekommen es zu testen...

Kannst Du mir vielleicht auch sagen wie ich folgendes "Problem" löse?

y(i) = x(i) + x(i-1)

i x y
1 1 1
2 2 3
3 3 5
4 4 7
5 5 9

Was muss ich machen damit ich y wie oben berechne?

Vielen Dank
Swen

LAG-Funktion

Hallo Swen,

das folgendermaßen mit der LAG-Funktion:

data test;
do x = 1 to 5;
output;
end;
run;

data test2(drop=x_lag);
set test;
x_lag=lag(x);
if _n_ = 1 then y = x;
else y = x + x_lag;
run;

Die LAG-Funktion funktioniert wie ein Stapel, es wird nur etwas auf den
Stapel draufgepackt, wenn die Funktion angewendet wird.
Die LAG-Funktion nur unter bestimmten Umständen führt oft nicht zum erwünschten
Ergebnis, wie folgendes Beispiel zeigt:

data test3;
set test;
if mod(x,2)=0 then y=lag(x);
run;

Das liefert nicht alle Ungeraden Zahlen, wie man meinen könnte, sondern
folgendes Ergebnis:

x  y
1  .  Hier ist die mod(x,2)=0 Bedingung nicht erfüllt
2  .  Hier ist sie erfüllt, aber auf dem Stapel befindet sich nichts, die 2 wird draufgepackt
3  .  Wie bei x=1
4  2  Wie bei x=2, nur das sich hier nun etwas auf dem Stapel befindet, nämlich die 2
5  .  Wie bei x=1

Näheres dazu findets Du in den Online-Doc.

Viele Grüße
Wolfgang

Rechnen mit der Summe einer Variable

Hallo,
vielen Dank für eure Hilfe!!! Soweit funktioniert alles.

Könnt ihr mir noch sagen wie ich mit der Summe einer Variable rechnen kann?
Also z.B. wenn ich eine Variable "income" habe und den Anteil am gesamten Income berechnen will?

i income income_anteil
1 10 0,1
2 50 0,5
3 40 0,4

--> income_anteil = income / ???;

Bei den relativ simplen Berechnungen die ich bisher durchgeführt habe, habe ich mich damit abgefunden als ersten Schritt über proc means die Summe der Variable zu berechnen und anschließend diese manuell in die Berechnungen einzutragen. Da gibt es aber mit Sicherheit eine einfachere Möglichkeit?!

Vielen Dank
Swen

*edit*
Hallo nochmal,
beim kumulieren der Variablen mit sum + var1; läuft bei mir rigendwas schief. Ich habe im Vorfeld den Datensatz mit proc sort nach der Variable x sortiert. Anschließend will ich die Variable y kumulieren.

Also:

* Datensatz in aufsteigender Reihenfolge von sde_eb sortieren;
proc sort
data = FAST2004.FAST2004_GINI
out = FAST2004.FAST2004_GINI_SORT;
by sde_eb;
run;

data FAST2004.FAST2004_GINI_SORT;
set FAST2004.FAST2004_GINI_SORT;

y_sum + y;

run;

In y_sum steht jetzt aber nicht die kumulierte Summe sondern Werte, die ich mir ad hoc nicht erklären kann. Was läuft da schief?

*und nochmal edit*
Ich habe die Systematik hinter den kuriosen Werten für die kumulierte Variable verstanden.

zu kumulierende Variable: y
kumulierte Werte: y_kum

Code: y_kum + y;

Ergebnis: Immer wenn y den Wert 0 aufweist wird wie gewollt kumuliert. Weißt y einen Wert ungleich 0 auf (bei mir immer >0) ist das Ergebnis : "bisher kumulierte Werte + 5*der neue Wert".

Damit das alles verständlicher wird hier ein Beispiel mit den Original-Daten:

i | y | y_kum
1 | 0 | 0
2 | 61395 | 306975 [-> 0 + 5*61395 = 306975]
3 | 0 | 61395
4 | 7545 | 99120 [-> 61395 + 5*7545 = 99120]
5 | 0 | 68940
(...)

Besten Dank
Swen

Proc Means verwenden und anschließend mergen oder Proc Sql

Hallo Swen,

das geht auf verschiedene Weise.

Data Income;
Input i income;
Cards;
1 10
2 50
3 40
Run;

/*Proc Means verwenden und anschließend mergen */

Proc Means Data = Income NoPrint;
Var Income;
Output Out = Temp (Keep = Income_Sum) Sum = / Autoname;
Run;

Data Income1;
Retain Gesamt;
Keep i Income Income_Anteil;
Merge Income Temp;
If _N_ = 1 Then Gesamt = Income_Sum;
Income_Anteil = Income / Gesamt;
Run;

Proc Delete Data = Temp; Run;

/* SQL Verwenden */
Proc Sql;
Create Table Income2 As
Select *
, Income / Sum(Income) As Income_Anteil
From Income
;
Quit;

Bei Deinem Beispiel ist Proc Sql wesentlich einfacher, es lassen sich aber nicht alle Statistiken berechnen, daher auch noch die allgemeinere Variante.

Zu Deinem Problem mit dem Kumulieren:

Du hast wahrscheinlich in einem Verarbeitungsschritt vorher die Werte deines Datensatzes verfünffacht. Das kann bei einer falschen Verknüpfung zwischen zwei oder mehr Dateien passiert sein. Der Code zum Kumulieren ist in Ordnung.

Schöne Grüße

Jan

Danke!

Hallo,

Dank eurer ausführlichen Anleitung konnte ich die SAS-Probleme lösen. Vielen Dank!!!

Beste Grüße
Swen