2015-02-07 3 views
-1

У меня есть 55 недель данных о продажах определенного товара. Я создал два набора данных SAS из исходных данных. Первый набор данных имеет дату и сумму количества, проданного в каждый день. Поэтому у меня есть 385 наблюдений (55 х 7). Вторая таблица содержит подробные данные транзакции. В частности, для каждой даты у меня есть время между транзакциями, которое представляет собой время между прибытием одного клиента и следующего, кто купил этот товар (я называю это временем прибытия). Что мне нужно делать дальше следующим образом:Looping over groups in SAS

  1. Для первой таблицы (ежедневные продажи) мне нужно взять данные о продажах каждую неделю, подходят ряд распределений, чтобы найти параметры каждого из них, и записывать эти параметры в отдельной таблице. Обратите внимание, что каждую неделю имеет eaxctly 7 наблюдений
  2. Для второй таблицы (interarrival раз) я также необходимо, чтобы соответствовать число распределений, чтобы найти параметры каждого из них, и записи этих параметров в одной таблице выше, но здесь, я не иметь точное количество наблюдений в каждой недели

Примечание: я уже назвал номер недели для наблюдений в каждом из двух наборов данных, и я написал код, который соответствует распределения в данные. Единственной областью, в которой я борюсь, является то, как сказать 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

+0

Хотя здесь нет вашего вопроса, установка дистрибутива на 7 точек данных кажется сомнительной. – Reeza

+0

Я не прошу кого-нибудь написать код для меня. Я прошу руководство по логике SAS перебирать группы. Я знаю, как писать аналогичный код с использованием других языков программирования, но кажется, что SAS делает все по-другому. Кроме того, я использовал дистрибутив для всех данных, используя SAS, поэтому мне не нужна помощь с этой частью.Обратите внимание, что 7 точек данных - это всего лишь крошечная часть огромных исследований. – OAM

ответ

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; 

Я знал, что прок SQL будет работать изначально, но мне было интересно, есть ли может быть более эффективный способ сделать это.

+0

Скорее всего, ваш следующий «шаг» может выполнить это, не создавая временную таблицу. т.е. использовать SET WEEK (WHERE = (week = &i)); – Reeza

+0

Нет необходимости применять предложение where или использовать макрос вообще. Просто примените все ваши вычисления на уровне группы за один проход. Чистый, более удобный и быстрый код (в этот случай, в 55 раз быстрее). –

1

Для других желающих использовать внутреннюю группировку nlm код для SAS станет:

/* 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;