spezielle Summen bilden und proc corr

Hallo Forum,

ich hab hier eine echte Herausforderung, die ich zur Zeit mit meinem Know-How in SAS, nicht bewältigen kann. Leider geht es hier auch noch um meine Diplomarbeit und brauche dringend eure Hilfe. Folgende SAS-Datei ist gegeben: es befinden sich 10 Variablen (leb1-leb10) in der Datei, wobei jede Variable 50 Beobachtungen besitzt, insgesamt haben wir eine 10 x 50 Datenmatrix. Ich habe dann eine neue Variable eingeführt, die SUMME heißt und die die Summe jeder einzelnen Zeile bildet. Aufgabe ist es mittels proc corr die Variable zu finden die am meisten zur gesamten Summe beiträgt. Wende ich die Prozedur proc corr an, so erhalte ich 10 Korrelationskoeffizienten, wobei einer maximal ist und die gesuchte Variable darstellt. Nachdem ich die erste Variable, beispielsweise Variable5, identifiziert habe, suche ich nach einer zweiten Variable die nun am meisten zur gesamten Summe beiträgt. Absolut FALSCH wäre es nun über den 9 verbliebenen Variablen eine weitere Korrelation zu berechen. Das ist nicht was mein Algorithmus machen soll, wär auch zu einfach! Es muss die zuerst identifizierte Variable separat mit den übriggebliebenen Variablen addiert werden. D.h.

Variable5+Variable1
Variable5+Variable2
.
.
.
Variable5+Variable10

Anschließend wird wiederum eine Korrelation zwischen den Summen (Variable5+Varianble1...Variable5+Variable10) und der Variablen SUMME berechnet. Nun habe ich 9 (da Variable5+Variable5 nicht benötigt wird) Ergebnisse und wiederum einen maximalen Wert und habe somit die zweite Variable identifiziert die zusammen mit der ersten Variablen (hier Variable5) am meisten zur gesamten Summe beiträgt. Hat SAS die zweite Variable gefunden geht das Spielchen von vorne los, d.h. welche Variable ergibt zusammen mit den nun ersten beiden Variablen den maximalen Koeffizienten? Das PROBLEM ist, wie greift SAS automatisch auf die erste berechnete Variable zu bzw. auf die erste und zweite usw. und berechnet dann die Summen mit den anderen übriggebliebenen Variablen? D.h doch, das SAS so etwas wie ein Gedächnis braucht um sich die berechneten Variablen zu merken um dann weitere Berechnungen.

Für euer Bemühen bedanke ich mich jetzt schon.

Daniel Czech

Erst einmal möchte dich

Erst einmal möchte dich euch beiden ein ganz großes DANKESCHÖN ausrichten, dass ihr euch die Mühe gemacht habt euch mit meinem Problem auseinanderzusetzen.

An Martin: Die Idee, das Problem mit einer Schleife zu lösen, kam mir auch in den Sinn. Auch zur Vorgehensweise habe ich mir Gedanken gemacht und stimme mit deiner Idee überein. Das Problem ist, dass ich mich zur Zeit in die Makro-Sprache einlese, aber das Gefühl habe, das es mich nicht wirklich weiterbringt.

An Andreas: Der Sinn des Algorithmus ist es, im ersten Schritt eine Anzahl von Variablen in die richtige Reihenfolge zu bringen! Das Kriterium für die richtige Anordnung der Variablen ist der Pearsonsche Korrelationskoeffizient „r“. Es ist richtig, das dieser nur für bivariate Statistik geeignet ist, d.h es gehen nur zwei Variablen in die Formel ein, einmal eine abhängige Variable (hier die Variable SUMME) und eine unabhängige (Variable leb1, leb2,...oder leb10). Die unabhängige Variable, die ich für die Berechnung von „r“ benötige, kann auch die Summe zweier unabhängigen Variablen sein (also z.B. leb1+leb7=neueVariable), daraus folgt das es bivariat bleibt!

Statistische Prozeduren, allen voran die schrittweise Regression, habe ich auch schon studiert und angewandt. Die Reihenfolge der Variablen stimmt aber nicht mit den Ergebnissen des ursprünglichen Programms überein. Hintergrund: Es gibt schon ein Algorithmus, der Variablen (in meiner Diplomarbeit handelt es sich um Lebensmittel) in eine richtige Reihenfolge bringt, dieser Algorithmus heißt max_r und wurde in Fortran geschrieben. Meine Aufgabe ist es mittels der Ergebnisse von max_r, diesen Algorithmus herauszufinden und nachzuprogrammieren (leider gibt es den source code in Fortran nicht mehr). Es ist auch möglich, dass ich falsche Parametereinstellungen verwendet habe, das glaub ich aber nicht, denn das Bestimmtheitsmaß bei der schrittweisen Regression ist R-Quadrat und nicht wie ich es benötige „r“!

Das es zum Schluss nur eine Variable gibt ist richtig. Das spannende ist doch, welche Variable die Erste, Zweite,..., Letzte ist. Somit und das ist richtig erkannt, interessiert mich die spezifische Anordnung der Variablen.

Zur Veranschaulichung, was max_r rechnet, hier ein Ausschnitt des Ergebnisses bei 26 Lebensmitteln bzw. Variablen:

Lebensmittel Pearson“r“
25 0.748
4 0.868
23 0.926
8 0.949
. .
. .

Wie man sieht ist das Lebensmittel 25 das Lebensmittel was am meisten zur gesamten SUMME beiträgt, r=0.748.
Frage: wie kommt man nun auf das Lebensmittel 4 und r=0.868? Das zweite Lebensmittel hätte ja auch 3 oder 17 sein können.
Indem ich nun zum Lebensmittel 25, separat jedes einzelne Lebensmittel addiere (siehe oben erster Beitrag von mir bzw. leb25+leb1, leb25+leb2, leb25+leb3...leb25+leb26) und anschließend über die 9 neuen Summen die Prozedur proc corr laufen lasse!!! Somit habe ich das maximale „r“ von zwei Lebensmitteln gefunden. Achtung: 0.868 ist nicht der Koeffizient vom Lebensmittel 4 allein, sonder leb25+leb4!

Okay, genug geschrieben. Ich hoffe ich konnte euch weiterhelfen, falls nicht, werde ich nicht müde auch weitere Informationen bzw. den Sachverhalten zu erklären.

Schöne Grüße
Daniel

Hmmm...

Da ich Informatiker bin und kein Statistiker kann ich jetzt nichts dazu sagen, inwieweit dein Algorithmus mathematisch gesehen Sinn macht. Ich gehe einfach mal davon aus, dass er stimmt.

Mit PROC CORR und einer Macroschleife lässt sich die Sache so auf jeden Fall umsetzen. Einfacher fährst du natürlich, wenn es schon eine SAS-Prozedur für diesen Fall gibt (vielleicht hat der Andreas da ja noch eine Idee? :) ). Ansonsten gibt es in SAS noch die Matrix-Programmiersprache IML, mit der man solche Matrixoperationen normalerweise auch sehr schön programmieren kann - allerdings gibt es in IML keine vordefinierte Funktion für Pearson's R, diese Berechnung müsste man für dein Beispiel erst einmal nachprogrammieren.

Wo genau hängst du denn bei der Macroprogrammierung fest? Ich helfe gerne weiter...

- MH -

P.S. Macht es wirklich einen Unterschied, ob du r oder r-Quadrat als Kriterium verwendest? Da die Quadrat-Funktion für r >= 0 stetig monoton steigend ist, gilt doch: Wenn r maximal, dann ist auch r-Quadrat maximal. Daher sollte die Reihenfolge der Variablen in deinem Ergebnis eigentlich unabhängig davon sein, ob r oder r-Quadrat gewählt wurde (... falls ich da nicht gerade einen Denkfehler mache...)

z.B. mit einer Macroschleife

Hallo Daniel,

ich kenne leider nicht alle Statistikprozeduren von SAS auswendig, daher kann ich auch nicht sagen, ob es darunter eine gibt, die dein Problem ohne zusätzlichen Programmieraufwand lösten würde ...

... aber selbst wenn nicht sollte sich dein Problem auf jeden Fall über ein Macro lösen lassen, das in einer Schleife folgendes macht:

  • PROC CORR aufrufen
  • Aus der Ausgabe von PROC CORR ermitteln, welcher Faktor am meisten beiträgt
  • Aus der Ausgangstabelle eine neue Tabelle generieren die die gewünschten Summen beinhaltet, wie von dir beschrieben
  • Im nächsten Schleifendurchlauf dann PROC CORR auf die neue Tabelle loslassen usw.

Die Schleife dann so oft wie gewünscht durchlaufen...

Kennst du dich mit Macros aus bzw. ist die Umsetzung von so einem Algorithmus in Macrocode ein Problem für dich? Falls du Hilfe benötigst, sag einfach Bescheid.

Schöne Grüße
- MH -

Hintergrund?

Das Programm ließe sich als Makro schreiben. Zuerst aber möchte ich den Sinn der Aufgabe besser verstehen, weil ich den Eindruck habe, dass es in SAS vielleicht statistische Prozeduren gibt, die das, was Sie da tun möchten, schon können.
Wenn man das Problem zu Ende denkt, kommt man ja zum Schluss auf eine einzige Variable, die die Summe aller 10 Variablen darstellt, oder? Ist es das, was Sie wollen? Interessiert Sie die spezifische Reihenfolge der Summation der Variablen? Fehlt vielleicht noch ein Abbruchkriterium? Das ganze erinnert etwas an eine Hauptkomponentenanalyse oder auch eine schrittweise Regression, siehe die entsprechenden Kapitel in der SAS/STAT-Dokumentation.

Ergänzende Info (von Daniel Czech)

Hallo,

da Daniel Czech Probleme beim Eintragen eines neuen Kommentars hatte, hat er mir die folgende Frage per PN geschickt. Ich kopiere sie einfach mal hier rein, ich hoffe das ist ok. Alles ab hier ist Zitat.
- MH -

----------------------------------------------------------------------------------------------------
die Idee, das Problem mit in IML zu lösen, hatte ich gestern kurz vorm einschlafen auch und hab fleßig in die Tasten gehauen. Mein Problem ist jetzt, das eine von mir berechnete Matrix negative Werte aufweist und ich somit nicht sqrt anwenden kann. Das Dilemma ist, mit proc corr klappt es. Ich habe zwei Vektoren x=(1,2,3,4,5) und y(=1,5,9,23,36). Wenn ich diese in einem SAS-Datensatz abspeicher und

proc corr data = xy pearson out=r_xy noprint;
run;

schreibe, dann erhalte ich den Koeffizienten "r".

Wenn ich dieselben zwei Vektoren in iml definiere und versuche das "r" zu berechnen, dann gibt es Fehlermeldungen, weil die Einträge in der Matrix negativ ist. Aber wieseo kann proc corr den Koeffizienten berechnen und iml nicht? Ich habe in iml die Formel für den Pearsonschen Korrelationskoeffizienten Schritt für Schritt nachprogrammiert, d.h. (bezieht sich jetzt auf den Zähler) erst die mittelwerte gebildet, dann die Werte von den Mittelwerten subtrahiert und durch 1/n geteilt usw... Bis ich im Zähler die Varianz-Kovarianz-Matrix berechnet hab.

Im Nenner hab ich auch die Formel Schritt für Schritt auseinandergenommen. Leider gibt es im Nenner Probleme und ich schaff es nicht die Standartabweichung von x bzw. y zu berechnen! Die Wurzel lässt sich nicht ziehen, da dort unter anderem negative Werte gibt.

So gehts in IML...

Hallo Daniel,

An welcher Stelle musst du bei der r-Berechnung die Wurzel aus einem negativen Wert ziehen?

Zur Berechnung von Pearson's r: Eintrag "Correlation" in der Wikipedia", siehe Abschnitt "The Sample Correlation".
Zur Berechnung der Standardabweichung: Eintrag "Standard Deviation" in der Wikipedia, siehe "Estimating population standard deviation from sample standard deviation". Was hier unter der Wurzel steht kann nicht negativ werden!

Ich habe mal schnell versucht den Algorithmus in IML nachzuprogrammieren:

/* Beispieldaten anlegen */
DATA WORK.Test;
   
INFILE DATALINES;
   
INPUT X Y;
   
DATALINES;
1 1
2 5
3 9
4 23
5 36
RUN;

/* Pearson's r mit IML berechnen */
PROC IML;
   
use WORK.Test;
   
read all var {x y};
   n_x    = nrow(x);
   n_y    = nrow(y);
   sum_x  = x[+];
   sum_y  = y[+];
   mean_x = sum_x / n_x;
   mean_y = sum_y / n_y;
   std_x  = sqrt( ssq(x-mean_x)/(n_x-
1) );
   std_y  = sqrt( ssq(y-mean_y)/(n_y-
1) );
   r_xy = ((x-mean_x)#(y-mean_y))[+] / ((n_x-
1)#std_x#std_y);
   
print n_x n_y;
   
print sum_x sum_y;
   
print mean_x mean_y;
   
print std_x std_y;
   
print r_xy;
QUIT;

/* Pearson's r mit PROC CORR berechnen */
PROC CORR DATA=WORK.Test;
   
VAR x y;
RUN;

IML und PROC CORR bringen bei mir exakt das gleiche Ergebnis für r (0.96199). Mit negativen Zahlen funktioniert es auch!

Schöne Grüße
- MH -