2016-06-20 13 views
0

Dies ist mein 1. Mal eine Frage in diesem Forum. Ich benutze SAS/Proc SQL seit ungefähr 4 Jahren, aber ich bin kein Code-Jedi, also bitte geben Sie detaillierte Antworten, und bin ziemlich neu bei Arrays, also verzeihen Sie, wenn meine Frage schlecht detailliert/erklärt ist. Ich bin 100% komfortabel mit einfachen Arrays im Allgemeinen. Aber ich habe eine sehr spezifische Herausforderung, die ich nicht herausfinden kann ... Schwer in Worte zu fassen, so kann dies lange umständlich werden, aber hier geht ...SAS-Array/Schleife Iterationsvariable

Für grundlegendes Verständnis von dem, was ich versuche zu erreichen, ist es etwas Ähnlich wie bei einer einfachen Darlehens-Amortisation, bei der der erste Betrag der ursprüngliche Kreditbetrag ist, sagen wir $ 10.000, Monat 2, ist der Saldo orig_ln_amt abzüglich einer neuen Kapital-/Zinszahlung abzüglich etwaiger zusätzlicher Zahlungen, die sich auf $ 9500, Monat 3 auf $ 9000 usw. belaufen .... Einfach für 1 Konto, aber ich baue ein Array, das in der Tat den prognostizierten verbleibenden Gesamtbetrag ergibt, wenn alle aktiven Konten für jeden Monat in die Zukunft zusammengerollt werden, also verwende ich ein Array, das sich in der Größe ändert jeden Monat basierend auf dem Alter der Konten.

Hier einige Beispiel-Code, den ich gehofft funktionieren würde:

DATA SAMPLE; 
    SET INPUT_DATA; 'HAS EACH OF THE 3 INPUT ARRAYS LAID OUT SIDE BY SIDE BY SIDE 
    ARRAY_ONE {193} ARRAY_ONE1-ARRAY_ONE193; 
    ARRAY_TWO {97} ARRAY_TWO1-ARRAY_TWO97; 
    ARRAY_THREE {97} ARRAY_THREE1-ARRAY_THREE97; 
    OUTPUT_ARRAY {193} OUTPUT_ARRAY1-OUTPUT_ARRAY193; 'PORTFOLIO BALANCE EACH FUTURE MONTH 
    DO I = 1 TO 193; 
    OUTPUT_ARRAY[I] = sum(of ARRAY_ONE[I]-ARRAY_ONE193) - sum(of ARRAY_TWO[I]-ARRAY_TWO97) - sum(of ARRAY_THREE[I]-ARRAY_THREE97); 
    END; 
RUN; 

Das Problem ist SAS nicht mag [I [Iteration Referenz innerhalb des Array-Berechnung. Ich habe auch versucht & Ich basiere auf einer Lösung, die ein anderer Online-Benutzer in, was ein ähnliches Problem schien. Die Logik macht Sinn und scheint, wie es in der Theorie funktionieren sollte, aber nicht ...

Also haben wir mussten manuell manipulieren und Code jedes der 193 Berechnungen:

OUTPUT_ARRAY1 = sum(of ARRAY_ONE1-ARRAY_ONE193) - sum(of ARRAY_TWO1-ARRAY_TWO97) - sum(of ARRAY_THREE1-ARRAY_THREE97); 
OUTPUT_ARRAY2 = sum(of ARRAY_ONE2-ARRAY_ONE193) - sum(of ARRAY_TWO2-ARRAY_TWO97) - sum(of ARRAY_THREE2-ARRAY_THREE97); 
    ... 
OUTPUT_ARRAY97 = sum(of ARRAY_ONE97-ARRAY_ONE193) - sum(of ARRAY_TWO97-ARRAY_TWO97) - sum(of ARRAY_THREE97-ARRAY_THREE97); 
OUTPUT_ARRAY98 = sum(of ARRAY_ONE98-ARRAY_ONE193); 
    ... 
OUTPUT_ARRAY193 = sum(of ARRAY_ONE193-ARRAY_ONE193); 

wie es scheint sollte eine einfache Lösung sein, aber wir können es nicht herausfinden. Vielen Dank im Voraus für jede Hilfe, die Sie alle geben können.

+1

Unabhängig von der Beantwortung Ihrer Frage: Ich würde Sie * dringend * dazu ermutigen, Ihre Datenstruktur neu zu formulieren. SAS (und jede andere Nicht-Matrix-Sprache) wird _Far_ besser machen, wenn Sie hier pro Zeile eine Zeile haben. – Joe

+0

Was ist in den Arrays enthalten? Salden? Interesse? Verschiedene Monate? Warum unterschiedliche Längen? Bitte posten Sie ein Datenschnipsel. Ich sehe eine aggregierte SQL-Abfrage-Lösung. – Parfait

+0

Gute Fragen ... Ein bisschen schwer zu beantworten, weil mein Beispiel von Darlehen amortisieren ist kein perfekter Vergleich und es wird ein wenig schlammig in den Details.Output = Resting Balance (geht 193 mos aus); Array1 = Bruttoverlust $ (193mos); Array2 = Auszahlungen (97mos); Array3 = Regelmäßige Zahlungen (97mos). Die Arrays sind unterschiedlich lang, weil es andere Ereignisse gibt, die während der gesamten Lebensdauer des Portfolios passieren ... – CraigD

Antwort

1

Variablenlisten wie VAR1-VAR20 werden berechnet, wenn der Datenschritt kompiliert wird. Ihr Versuch, ARRAY[I]-variable193 als eine variable Liste zu verwenden, wird nicht fliegen. Verwenden Sie einfach eine andere DO Schleife.

DO I = 1 TO dim(output_array); 
    output_array(i)=0; 
    DO J=I to dim(array_one); 
    output_array(i)= sum(output_array(i),array_one(j)); 
    END; 
    DO J=I to dim(array_two); 
    output_array(i)= sum(output_array(i),array_two(j)); 
    END; 
    DO J=I to dim(array_three); 
    output_array(i)= sum(output_array(i),array_three(j)); 
    END; 
END; 
+0

Oh, ich habe völlig falsch verstanden, was er dort macht. Guter Punkt. – Joe

+0

Sie können immer noch die Dims von Array zwei/drei überprüfen, da sie kürzer sind als Array eins. – Joe

+0

So trennen Sie Do-Schleifen für jedes Eingabearray. – Tom

2

Sie haben also drei Sätze von Variablen mit Anpassungen an das Prinzip. Sie haben einen Anfangssaldo und möchten die verschiedenen Zwischensalden durch Anwendung der Anpassungen berechnen.

Zuerst vereinfachen Sie Ihr Problem, indem Sie die Arrays die gleiche Größe. Die neuen Variablen werden fehlen. Wenn Sie diese Variablen tatsächlich haben, sie jedoch nicht in die Berechnungen aufnehmen möchten, löschen Sie sie aus dem Eingabe-Dataset. Beachten Sie, dass Sie mit den Variablen ONE1 bis ONE193 ein Array namens ONE erstellen können, das diese Variablen verwendet, indem Sie einfach die folgende Anweisung verwenden: array one(193);.

Zweitens vereinfachen Sie Ihre Arithmetik, um besser zu Ihrer Problembeschreibung zu passen. Es sieht für mich so aus, als ob der nächste Saldo auf dem vorherigen Saldo abzüglich aller Anpassungen basiert. Fügen Sie Null ein, um den Fall zu behandeln, wenn für alle Anpassungen Werte fehlen.

%let n=193; 
data want; 
    set have; 
    array one (&n); 
    array two (&n); 
    array three (&n); 
    array balance Initial_balance balance1-balance&n; 
    do i=1 to dim(balance)-1; 
    balance(i+1)=balance(i)-sum(0,one(i),two(i),three(i)); 
    end; 
run; 
+0

Danke Tom ist fast genau das, was mir eingefallen ist, und die Ergebnisse knüpfen an den alten Code an ... Schätzen Sie Ihre Hilfe sehr! – CraigD