Алгоритм соответствия в SAS - PullRequest
0 голосов
/ 30 апреля 2018

Итак, у меня есть этот код, который направлен на присоединение новой процентной ставки в зависимости от ее первоначального срока погашения. например, если первоначальный срок погашения составляет 0,25 года, я хочу, чтобы он добавил к процентной ставке ставку на 3 месяца.

Код выглядит как

data want;
set maturity;

retain tempMat tempRate;
i = 1;
do until(stop eq 1);
    set Maturity2 nobs = num point = i;
    diff = abs(sum(Maturity, -OriginalMaturity));
    if i eq 1 then
    do;
        tempMat = diff;
        tempRate = Base_Rate_New;
    end;
    else
    do;
        if i = num then
        do;
            stop = 1;
            Rate_ok = Base_Rate_New;
        end;
        else if diff gt tempMat then
        do;
            stop = 1;
            Rate_ok = tempRate;
        end;
        else
        do;
            tempMat = diff;
            tempRate = Base_Rate_New;
        end;
    end;
    i = i + 1;
end;

конец; бежать;

Две таблицы выглядят как

data maturity;
input ID maturity base_rate;
datalines
1 0.25 1
2 0.5 1
3 0.6 2
4 0.3 3
5 1.2 1.2
6 1.5 2
7 2 3
8 3 1
9 1 0.5
;

data maturity2;
input originalmaturity base_rate_new;
datalines
0.25 2
0.5 3
0.75 1
1 3
;
run;

набор данных, который я собираюсь создать, будет выглядеть (после удаления всех дополнительных переменных

data want;
input ID maturity base_rate base_rate_new;
datalines
1 0.25 1 2
2 0.5 1 3
3 0.6 2 3
4 0.3 3 2
5 1.2 1.2 3
6 1.5 2 3
7 2 3 3
8 3 1 3
9 1 0.5 3
;
run;

Проблема в том, что в настоящее время, если значение превышает более близкое число, оно все равно выбирает более высокое число. Например, если это 0,3, он выбрал бы 0,5 вместо 0,25

.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018
data want;
    set maturity;
    retain tempDiff Rate;
    do point=1 to n;
       set maturity2 nobs=n point=point;
       diff=abs(maturity-originalmaturity);
       if point=1 then do;
            tempDiff=diff;
            Rate=base_rate_new;
       end;
       else if diff<tempDiff then do;
           tempDiff=diff; 
           Rate=base_rate_new;
       end;
    end;
    drop diff tempDiff originalmaturity base_rate_new;
run;
0 голосов
/ 30 апреля 2018

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

/*This assumes maturity2 is sorted ascending by originalmaturity*/
data want(keep=ID maturity originalmaturity base_rate base_rate_new);
set maturity;
stop = 0;
i = 1;

do until(stop eq 1);
    set Maturity2 nobs = num point = i;
/*  put _all_;*/
    if originalmaturity = maturity then do;
        output;
        stop = 1;
    end;

    else if originalmaturity < maturity then do;
        ldist = abs(originalmaturity - maturity);
        lbrn = base_rate_new;
    end;
    else if originalmaturity > maturity then do;
        hdist = abs(originalmaturity - maturity);
        if hdist > ldist then
            base_rate_new = lbrn;
        output;
        stop = 1;
    end;

    if num = i then do;
        output;
        stop = 1;
    end;
    i = i + 1;
end;
run;
...