0

所以首先,我已经完成了一个二元逻辑回归模型,并输出了几个表。我有一个“评分”数据集,其中包含客户的实际默认值(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的增加,或者如果我还没有发现另一种选择,则进一步增加。

4

1 回答 1

0

让我们忽略生成数据集 TABLE&i 和变量 PPER1000 的逻辑,并专注于循环方面。您可以使用 PROC APPEND 作为在循环中聚合值的方法。

%macro profit ;
%if %sysfunc(exist(new)) %then %do;
* Remove existing NEW dataset on first pass;
proc delete data=new;
run;
%end;

%do i=1 %to 5;
* ... generate TABLE&i ... ;

* Get value of PPER1000 from last observation of TABLE&i ;
data add;
  set table&i end=eof ;
  if eof;
  cutoff = .&i;
  profit = pper1000;
  keep cutoff profit;
run;
* Accumulate results in NEW dataset. ;
proc append base=new data=add force ;
run;

%end;
proc print data = new; run;
%mend profit ;
%profit;
于 2017-04-16T16:27:06.980 回答