Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops SAS:通过逻辑回归评分表循环,用截止值计算利润,输出截止值和利润一起放入单独的表中_Loops_Macros_Sas_Maximum Profit Problem - Fatal编程技术网

Loops SAS:通过逻辑回归评分表循环,用截止值计算利润,输出截止值和利润一起放入单独的表中

Loops SAS:通过逻辑回归评分表循环,用截止值计算利润,输出截止值和利润一起放入单独的表中,loops,macros,sas,maximum-profit-problem,Loops,Macros,Sas,Maximum Profit Problem,首先,我完成了一个二元逻辑回归模型,并输出了几个表。我有一个“评分”数据集,其中包含客户的实际默认值(GOODBAD),它是二进制的。然后我有一个从0到1的违约概率(p_1)。然后我必须确定一个截止值,生成一个新的变量,它是一个预测的默认值,现在是二进制的 我试图做的是循环通过潜在的截止值(比如说从.1到.5,一步一步一步),然后从这5个步骤中计算“利润”。然后,我希望在一个单独的数据集中同时使用截止值和“利润”值来生成这种关系的图表,这样我就可以找到我的最大利润 下面是我目前用于生成特定截止值

首先,我完成了一个二元逻辑回归模型,并输出了几个表。我有一个“评分”数据集,其中包含客户的实际默认值(GOODBAD),它是二进制的。然后我有一个从0到1的违约概率(p_1)。然后我必须确定一个截止值,生成一个新的变量,它是一个预测的默认值,现在是二进制的

我试图做的是循环通过潜在的截止值(比如说从.1到.5,一步一步一步),然后从这5个步骤中计算“利润”。然后,我希望在一个单独的数据集中同时使用截止值和“利润”值来生成这种关系的图表,这样我就可以找到我的最大利润

下面是我目前用于生成特定截止值及其相关利润的代码。(proc报告根本不应更改,因为这些是帐户/情况的预定义值)

我遇到的问题,我似乎无法解决,是我用I和pper100(或宏变量profitAT)的最新值过度写入了以前的值


我不知道如何强制将其视为观察值,如果我应该循环使用我的宏变量,如果,因为我将它们放在数据步骤中,我应该有一个单独的循环,检查N,然后随着N的增加写入观察值,或者更进一步,如果我还没有发现另一种选择。

让我们忽略生成数据集表的逻辑&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;

请在
数据
过程
步骤以及
%do
%macro
块中缩进以提高可读性。您能否更具体地说明“过度写入以前的值”的含义?您是说在循环结束时生成两个具有常量名称的数据集吗?或者您是指call symput语句正在生成的宏变量,该宏变量也没有动态生成的名称吗?是否还有原因导致您试图从PROC报告步骤中保存数据?生成报告的目的是什么?还是生成数据?如果是后者,为什么不使用data step或其他常规方法来生成PPER1000变量,而不是使用报告过程?报告正在生成我想要的输出,但我只能存储宏的最终迭代。为了澄清这一点,我在不使用宏的情况下运行了这段代码,我可以得到我想要的信息,但我想实现自动化。i、 e对于i=1,…,5,报告给出了利润($5400,$5600,$5700,$5900,$5600),但我在新数据集中的唯一输出是$5600。宏似乎覆盖了数据步骤中的值,因为它不是将值写入1,…5个观察值中的每一个,而是使用当前宏变量值重新写入数据集中的上一个值。
%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;