SAS-将变量定义为列总和和自举

时间:2018-12-07 19:48:08

标签: sas bootstrapping

我有一个大块来引导数据集。

%let iter = 2;
%let seed = 777;

data work.seg;
    input segment $3. prem loss;
    datalines;
AAA 5000 0
AAA 3000 12584
AAA 200 245
AAA 500 678
;

data work.test;
    do i=1 to &iter;
        sumprem=0;

        do _n_=1 to 1000000 until (sumprem>=8700);
            row_i=int(ranuni(&seed)*n)+1;
            set work.seg point=row_i nobs=n;
            sumprem + prem;
            output;
        end;
    end;

    stop;
run;

可以,但是我有几个问题。

  1. 如何动态设置400号...我希望(sumprem >= 8700)成为(sumprem >= &threshold),其中&thresholdprem列的总和。
  2. 我通过&seed的方式是否正确?还是应该用(&seed)之类的东西来代替(&seed + _n_)
  3. 如何使最后一个数据步进入宏...如下所示,但是我什么都没做。

    %macro boot(data, iter, seed);
    
        %do i=1 %to &iter;
    
        sumprem=0;
    
        %do _n_=1 %to 1000000 %until (sumprem>=8700);
            row_i=int(ranuni(&seed)*n)+1;
            set work.seg point=row_i nobs=n;
            sumprem + prem;
            output;
        %end;
    %end;
    
    %mend;
    

1 个答案:

答案 0 :(得分:0)

我假设您想从work.seq中计算prem之和?

proc sql noprint ;
  select sum(prem) format=best32. into :threshold trimmed from seg ;
quit;

您的宏代码是令人困惑的宏逻辑,可用于生成代码,而数据步逻辑是对实际数据进行操作的逻辑。要使其成为宏,只需对宏的参数名称使用相同的宏变量名称,并保留相同的代码即可。

%macro boot(in,out, iter, seed);
data &out;
  do until (eof);
    set &in end=eof;
    threshold + prem ;
  end;
  do i=1 to &iter;
    sumprem=0;
    do _n_=1 to 1000000 until (sumprem>=threshold);
      row_i=int(ranuni(&seed)*n)+1;
      set &in point=row_i nobs=n;
      sumprem + prem;
      output;
    end;
  end;
  stop;
run;
%mend boot;