2016-04-21 176 views
0
%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); 

我有上面的宏這需要兩個上述模型的截距,然後計算概率與得分,然後分配一個值,以基於該概率與得分的片段。Logistic迴歸宏

上述宏的第一個問題是當我用一個參數執行宏時,每個宏都將宏變量'n'解析爲2並執行兩次。第一次迭代,它給出了正確的結果,而第二次是錯誤的。

對於第二個實現(每個宏有兩個aruuments)n解析爲3並且掃描一次解析爲兩個值(例如,迭代本身的i1是-0.45和0),如果I刪除空間,然後它採取'。'作爲分隔符並將其解決爲(0,45,0 - 每次迭代一次)。這個案件我沒有得到任何結果。

我該如何才能以正確的方式工作?

謝謝!

+0

我也會提供一個建議 - 將參數放入數據集並將它們作爲數據集傳遞。讓您的宏循環遍歷數據集的行而不是多個宏變量。 – Reeza

回答

1

%SCANCOUNTW默認功能是將標點符號和空格作爲分隔符。由於您的參數包含小數點,因此您需要明確指出COUNTW%SCAN這兩個分隔符應該是空白的。你已經完成了%SCAN,但沒有爲COUNTW。 因此,代碼的第二行應該是:

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

而且我不知道這是否是一個錯字或只是格式化的東西,但在你的%掃描功能的第三個參數看起來像兩個引號在一起'',不報價-blank-quote ' '它應該是。