Работа с верхнетреугольным массивом в SAS (задание +2 балла)

Я хочу повысить эффективность своего кода, превратив его в массивы и циклы. Данные, с которыми я работаю, начинаются так:

ID    Mapping    Asset    Fixed    Performing    Payment 2017    Payment2018    Payment2019    Payment2020

1     Loan1      1        1        1              90             30             30             30
2     Loan1      1        1        0              80             20             40             20  
3     Loan1      1        0        1              60             40             10             10
4     Loan1      1        0        0              120            60             30             30
5     Loan2     ...       ...      ...            ...            ...            ...             ...

Итак, для каждого идентификатора (по сути, данных, отсортированных по сопоставлению, активу, фиксированному и затем исполняющемуся) я пытаюсь создать профиль для схемы оплаты.

Вектор платежа для первого идентификатора выглядит так:

PaymentVector1    PaymentVector2    PaymentVector3    PaymentVector4
1                 0.33              0.33              0.33

Он представлен формулой

PaymentVector(I)=Payment(I)/Payment(1)

Вышеприведенное можно создать в массиве, при желании можно привести пример кода.

Далее, в предположении, что каждый сделанный платеж заменяется, т. е. когда в 2018 году выплачивается 30, он должен быть заменен и так далее.

Я хочу сделать профиль, который показывает оттоки (и для иллюстрации, но не обязательно в коде, в скобках притоки) для движения платежей как таковых - для ID = 1:

    Payment2017    Payment2018    Payment2019    Payment2020

17         (+90)            -30            -30           -30

18           N/A          (+30)            -10           -10

19          N/A           N/A              (+40)         -13.3

20         N/A             N/A             N/A          (+53.3)

поэтому, если вы смотрите вперед, строки можно представить, какой сейчас год, а столбцы представляют, какие годы приближаются.

Следовательно, в 2019 году, глядя на то, что должно быть выплачено в 2017 и 2018 годах, нет данных, потому что эти платежи в прошлом / не могут быть выплачены сейчас.

Что касается 2018 года, то, глядя на то, что должно быть выплачено в 2019 году, вы должны заплатить одну треть денег, которые у вас есть сейчас, поэтому -10.

Я работал над тем, чтобы превратить этот набор данных построчно в массив, но наверняка должен быть более быстрый способ использования массива:

Код, который я использовал до сих пор, выглядит так:

Data Want;
Set Have;

Array Vintage(2017:2020) Vintage2017-Vintage2020;
Array PaymentSchedule(2017:2020) PaymentSchedule2017-PaymentSchedule2020;
Array PaymentVector(2017:2020) PaymentVector2017-PaymentVector2020;
Array PaymentVolume(2017:2020) PaymentVolume2017-PaymentVolume2020;

do i=1 to 4;

PaymentVector(i)=PaymentSchedule(i)/PaymentSchedule(1);

end;

Я добавлю код завтра... но код все равно не работает.


person 78282219    schedule 07.03.2018    source источник
comment
Чтобы кто-то мог вам помочь, не могли бы вы задать вопрос в конце? Также может быть полезно отметить, где происходит ошибка, какую ошибку вы получаете,   -  person blamb    schedule 07.03.2018
comment
Привет, извините, мой вопрос заключается в том, что я хочу создать массив, представляющий входящие и исходящие платежи на основе второй большей таблицы с целым числом и (+ целое число). ошибка, которую я получаю, заключается в том, что она выходит за пределы массива независимо от установки верхней и нижней границ   -  person 78282219    schedule 08.03.2018


Ответы (2)


Вы проиндексировали свои массивы с 2017:2020, но затем попробуйте использовать их, используя индекс от 1 до 4. Это не сработает, вы должны быть последовательны.

Array PaymentSchedule(2017:2020) PaymentSchedule2017-PaymentSchedule2020;
Array PaymentVector(2017:2020) PaymentVector2017-PaymentVector2020;


do i=2017 to 2020;

PaymentVector(i)=PaymentSchedule(i)/PaymentSchedule(2017);

end;
person Reeza    schedule 07.03.2018

person    schedule
comment
Кажется, у меня возникла эта неотъемлемая проблема с моим SAS, когда я никогда не могу создать массив из-за размеров... - person 78282219; 08.03.2018
comment
74 вызов отсутствует (из исходящих (*)); 75 76 вых(1) = р(1); 77 сделать это = от 1 до 4; 78 p(iter) = out(iter); ОШИБКА: нижний индекс массива вне допустимого диапазона в строке 78, столбце 5. - person 78282219; 08.03.2018
comment
У меня это работает, это была просто ошибка имени столбца. - person 78282219; 08.03.2018
comment
Это прекрасный кусок кода, спасибо. Я ценю аннотацию, я попытаюсь использовать ее, чтобы научиться адаптировать последующие массивы к тому, что я пытаюсь сделать. - person 78282219; 08.03.2018