2015-02-07 54 views
-1

我有55周的特定項目的銷售數據。我從原始數據創建了兩個SAS數據集。第一個數據集包含日期和每個日期銷售數量的總和。因此,我有385個觀察結果(55×7)。第二張表具有詳細的交易數據。具體而言,對於每個日期,我都有兩次交易之間的時間,即一個客戶到達下一個客戶的時間(我稱之爲間隔時間)。我下一步需要做的是如下:在SAS組中循環使用

  1. 第一個表(每日銷售),我需要每星期採取銷售數據 ,適合多種分佈,找到每個 一個參數,並將這些參數記錄在單獨的表格中。需要注意的是 每星期都有eaxctly 7個觀察
  2. 對於第二個表(到達間隔時間),我還需要適應 數分佈的找到每一個參數,並 記錄在上述的同一個表的參數,但在這裏,我不 在每星期的觀察的一個確切的數字

注:我已經爲標記的觀察週數在每兩個數據集的和我寫了適合分佈的代碼數據。我在掙扎的唯一領域是如何告訴SAS將數據採集一週,進行計算,擬合分佈,然後移動到下一週(即將數據按周分組並對每組進行多次陳述)。

我嘗試了很多方法,其中沒有任何方法包括嵌套循環。我知道如何使用其他方法和程序(如PROC SQL)獲得每週銷售額,但我不確定我是否可以使用PROC SQL來分配分銷。

我正在使用proc nlp來使用最大似然法來估計每個分佈的參數。例如,如果我需要估計mu和sigma的正態分佈,我使用下面的代碼:

proc nlp data= temp vardef=n covariance=h outest=parms; 
    title "Normal"; 
    max loglik; 
    parms mu=0, sigma=1; 
    bounds sigma > 1e-12; 
    loglik=-log(sigma*(2*constant('PI'))**.5) - 0.5*((x-mu)/sigma)**2; 
run; 

這種方法會發現mu和sigma,最有可能產生的數據。

+0

你有演出就如何適應代碼分佈,最好是你嘗試過的。 SO不是代碼編寫服務。該解決方案在很大程度上取決於你如何適應分佈,無論是按組處理還是宏。 – Reeza 2015-02-07 05:19:44

+0

雖然這裏不是你的問題,但是將分佈擬合成7個數據點似乎有問題。 – Reeza 2015-02-07 05:20:27

+0

我不是要求某人爲我寫代碼。我正在尋求有關SAS邏輯的指導來循環使用組。我知道如何使用其他編程語言編寫類似的代碼,但SAS似乎有不同的做法。另外,我已經使用SAS完成了所有數據的分佈擬合,所以我不需要任何幫助。請注意,7個數據點只是大量研究的一小部分。 – OAM 2015-02-07 15:58:13

回答

0

下面是我用

%macro weekly; 
%do i=1 %to 55; 
    proc sql; 
    create table temp as 
    select location, UPC, date, x, week 
    from weeks 
    where week = &i; 
    quit; 
/* I have here the rest of the code where I do my calculations and I fit the distributions to the data of each week */ 
%end; 
%mend; 
%weekly; 

我知道PROC SQL將開始工作,但我不知道是否有可能做一個更有效的方式。

+0

無論您的下一步「步驟」是什麼,都可以在不創建臨時表的情況下完成此任務。即使用SET WEEK(WHERE =(week = &i)); – Reeza 2015-02-09 18:18:41

+0

)不需要應用where子句或者使用宏,只需在組中一次性應用所有的計算就可以實現更清潔,更易維護和更快的代碼。這種情況下,速度快55倍)。 – 2015-02-09 21:06:33

1

對於希望使用SAS的內部分組的nlm代碼別人會變成:

/* Ensure that the data is sorted to allow group processing */ 
proc sort data = temp; 
    by week; 
run; 
proc nlp data = temp vardef = n covariance = h outest = parms; 
    /* Produce separate output for each week */ 
    by week; 
    title "Normal"; 
    max loglik; 
    parms mu = 0, sigma = 1; 
    bounds sigma > 1e-12; 
    loglik = -log(sigma * (2 * constant('PI'))**.5) - 0.5 * ((x - mu)/sigma)**2; 
run; 

這裏使用proc univariate的方法:

/* Suppress printed output (remove to see all the details) */ 
ods select none; 
proc univariate data = temp; 
    /* Produce separate output for each week */ 
    by week; 
    histogram x/
     /* Request fitting to normal distribution */ 
     normal 
     /* You can select other distributions too */ 
     lognormal; 
    /* Put the fitted parameters in a dataset */ 
    ods output ParameterEstimates = parms; 
    /* Put the fit statistics in a dataset */ 
    ods output GoodnessOfFit = quality; 
run; 
/* Restore printing output */ 
ods select all;