在SAS中循环群组

时间:2015-02-07 03:50:07

标签: loops sas

我有55周的特定商品的销售数据。我从原始数据创建了两个SAS数据集。第一个数据集包含日期和每个日期的销售数量总和。因此,我有385个观测值(55 x 7)。第二个表有详细的交易数据。具体来说,对于每个日期,我有交易之间的时间,这是一个客户到达下一个购买该项目的客户之间的时间(我将其称为到达间隔时间)。我接下来需要做的是:

  1. 对于第一张表(每日销售),我需要获取销售数据 每周,适合一些分布来查找参数 每一个,并将这些参数记录在一个单独的表中。注意 每周都有7次观察
  2. 对于第二个表(interarrival times)我还需要适合一个 找到每个参数的分布数,和 在上面的同一个表中记录这些参数,但在这里,我没有 每周都有准确的观察数
  3. 注意:我已经在两个数据集的每个数据集中标记了观察的周数,并且我编写了适合数据分布的代码。我正在努力的唯一领域是如何告诉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。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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最初会起作用,但我想知道是否有更有效的方法可以做到这一点。