逻辑回归宏

Logistic regression Macro

    %macro intercept(i1= ,i2= );
      %let n = %sysfunc(countw(&i1));

       %do i = 1 %to &n;
          %let val_i1 = %scan(&i1,&i,'');
          %let val_i2 = %scan(&i2,&i,'');
          data scores;
            set repeat_score2;
            /* Segment 1 probablity score  */
            p1 = 0;
            z1 =   &val_i1      +
                    a         *      0.03            +
                    r         *    -0.0047841        +
                    p         *   -0.000916081      ;

            p1 = 1/(1+2.71828**-z1);

            /* Segment 2 probablity score  */
           p2 = 0;
           z2 =   &val_i2           +
                   r           *       0.09           +
                   m           *     0.012786245      +
                   c           *    -0.00179618        +
           p2 = 1/(1+2.71828**-z2);

           logit_score = 0;
           if max(p1,p2) =      p1 then logit_score = 1;
           else if max(p1,p2) = p2 then logit_score = 2;
         run;

         proc freq data = scores;
            table logit_score * clu_ /nocol norow nopercent;
         run;
    %end;
  %mend;
%intercept (i1=-0.456491042, i2=-3.207379842, i3=-1.380627318 , i4=0.035684096, i5=-0.855283373);
%intercept (i1=-0.456491042 0, i2=-3.207379842 -3.207379842, i3=-1.380627318 -1.380627318, i4=0.035684096 0.035684096,
            i5=-0.855283373 -0.855283373);

我有上面的宏,它对上述两个模型进行截距,然后计算概率分数,然后根据该概率分数为段分配一个值。

上述宏的第一个问题是,当我用一个参数执行宏时,它会将宏变量 'n' 解析为 2 并执行两次。第一次迭代,它给出了正确的结果,而第二次它是错误的。

对于第二个实现(每个宏都有两个参数)n 解析为 3 并且 scan 一次解析为这两个值(例如迭代本身的 i1 为 -0.45 和 0),如果我删除了 space,然后它取了 '.'作为分隔符并将其解析为( 0,45,0 - 每次迭代一个)。对于这种情况,我没有得到任何结果。

如何让它以正确的方式工作?

谢谢!!!

%SCANCOUNTW 函数默认将标点符号和空格视为分隔符。由于您的参数包含小数点,因此您需要明确声明 COUNTW%SCAN 的定界符都应为空白。您已为 %SCAN 完成,但未为 COUNTW 完成。 所以代码的第二行应该是:

 %let n = %sysfunc(countw(&i1,' '))

而且我不确定这是拼写错误还是只是格式问题,但在您的 %SCAN 函数中,第三个参数看起来像是两个引号 '',而不是引号-空白-引号 ' '应该如此。