%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并执行两次。第一次迭代,它给出了正确的结果,而第二次则是错误的。
对于第二个实现(每个具有两个aruguments的宏),n正在解析为3,扫描一次解析为这两个值(例如,迭代本身的i1为-0.45和0),如果我删除空间,然后它采取'。'作为分隔符并将其解析为(0,45,0 - 每次迭代一次)。我对这个案子没有任何结果。
如何让它以正确的方式运作?
感谢!!!
答案 0 :(得分:1)
%SCAN
和COUNTW
函数默认将标点符号和空格视为分隔符。由于您的参数包含小数点,因此您需要明确声明COUNTW
和%SCAN
的分隔符应为空。您为%SCAN
所做的工作,但COUNTW
没有。
所以代码的第二行应该是:
%let n = %sysfunc(countw(&i1,' '))
我不确定这是一个拼写错误还是只是格式化的东西,但在你的%SCAN函数中,第三个参数看起来像是两个引号''
,而不是引用空白引用' '
因为它应该是。