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?
- Anmelden oder Registrieren um Kommentare zu schreiben

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:
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:
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.
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