所以首先,我已经完成了一个二元逻辑回归模型,并输出了几个表。我有一个“评分”数据集,其中包含客户的实际默认值(GOODBAD),它是二进制的。然后我有一个预测的违约概率 (p_1),范围从 0 到 1。然后我必须确定一个截止值,生成一个新变量,它是现在是二元的预测违约。
我正在尝试做的是遍历潜在的截止值(假设从 0.1 到 0.5,步长为 0.1),然后从这 5 个步骤中的每一个计算“利润”。然后,我希望将截止值和“利润”值都放在一个单独的数据集中,以生成这种关系的图表,以便找到我的最大利润。
下面是我目前用于生成特定截止值及其相关利润的代码。(proc 报告根本不应该改变,因为这些是帐户/情况的预定值)
%MACRO PROFIT;
%DO I=1 %TO 5;
DATA TEST&i;
SET TRANS.SCORE;
IF P_1 >= .&i THEN preds = 1;
ELSE preds = 0;
RUN;
Data probs&i;
format outcometype $6.;
Set TEST&i (keep=preds goodbad crelim);
crelim2 = crelim/2;
if (preds=1 and goodbad=0) then do;
outcometype="error2";
profit =0;
end;
else if (preds=0 and goodbad=1) then do;
outcometype ="error1";
profit =-crelim2;
end;
else if (preds=1 and goodbad=1) then do;
outcometype="valid1";
profit=0;
end;
else do;
outcometype="valid2";
profit=250;
end;
run;
PROC REPORT DATA= probs&i nowd out=table&i;
COLUMN outcometype pct n profit pper1000;
DEFINE outcometype /group width = 8 ;
DEFINE profit /format=dollar15.2;
define pper1000 / computed format=dollar15.2;
/*get the overall number of obs*/
compute before;
overall=n;
endcomp;
compute pper1000;
pper1000 = (profit.sum/n)*1000;
endcomp;
compute before outcometype;
totaln=n;
endcomp;
compute pct;
pct = (totaln/overall);
if _break_ = '_RBREAK_' then pct= (overall/overall);
endcomp;
rbreak after/summarize dol;
RUN;
quit;
Data out;
set table&i;
CALL symput('profitAT', PUT(pper1000));
run;
Data new;
CutOFF = .&i;
profit = &profitAT;
run;
%END;
*proc print data = new; Run;
%MEND PROFIT;
%PROFIT;
我遇到的并且似乎无法解决的问题是,我用 i 和 pper100 的最新值(或宏变量 ProfitAT)覆盖了先前的值。
我不知道如何强迫这被视为观察,如果我应该循环遍历我的宏变量,如果因为我将它们放在数据步骤中,我应该有一个单独的循环来检查N然后写观察随着N的增加,或者如果我还没有发现另一种选择,则进一步增加。