2015-03-07 2 views
1

Я ищу что-то похожее на оценку Proc (результат proc reg) для оценки набора данных.Оценка множественного ввода в PROC MIXED

До сих пор у меня есть что-то вроде этого.

PROC MIXED data = maindata noclprint covtest; 
Class ID; 
Weight w1; 
Model TIME = Age Age*Age/Solution cl residual; 
Random Intercept Age Age*Age/sub=ID; 
Estimate 'ID1' Intercept 1 Age 10 Age*Age 100 | Intercept 1 Age 10 Age*Age 100/ cl Subject 1; 
Estimate 'ID2' Intercept 1 Age 12 Age*Age 144 | Intercept 1 Age 12 Age*Age 144/ cl Subject 0 1; 
Estimate 'ID3' Intercept 1 Age 11 Age*Age 121 | Intercept 1 Age 11 Age*Age 121/ cl Subject 0 0 1; 
Estimate 'ID4' Intercept 1 Age 15 Age*Age 225 | Intercept 1 Age 15 Age*Age 225/ cl Subject 0 0 0 1; 
(. . . You get the point) 
run; quit; 

Вот моя оценка набор данных:

ID Age AgeSq 
1 10 100 
2 12 144 
3 11 121 
4 15 225 
... 
50 9 81 

Мой вопрос есть ли другой способ, который больше эффективности, чем иметь 50 из них оценки заявления.

Я пробовал PROC PLM. Проблема с PROC PLM (SCORE (PREDICTED)) заключается в том, что она не принимает случайного влияния на счет. (http://support.sas.com/documentation/cdl/en/statug/63347/HTML/default/viewer.htm#statug_plm_a0000000126.htm)

+0

Какая версия SAS у вас есть? – Reeza

+0

SAS Stat 13.1+ CODE Statement => http://support.sas.com/documentation/cdl/en/statug/67523/HTML/default/viewer.htm#statug_mixed_syntax04.htm – Reeza

+0

Только что пробовал заявление CODE сегодня. Операция CODE имеет одинаковую проблему с proc plm. Это не влияет на случайный эффект. – devon

ответ

1

EDIT: Я не правильно прочитал конец вашего вопроса относительно plm. Мои извинения, пожалуйста, смотрите ниже перерыва для альтернативы.

Это не то, что я сделал, но я полагаю, вы можете добиться того, что вы хотите с proc plm, которые могут забить наборы данных (среди прочего) с использованием моделей, выпускаемых proc mixed, proc glm и другие.

Основной подход заключается в хранении бинарное представление вашей модели с помощью store statement:

proc mixed; 
    ... 
    store sasuser.myModel; 
run; 

Затем обрабатывать новые данные с помощью proc plm:

proc plm source = sasuser.mixed; 
    ... 
    score data = inData out = want; 
run; 

user guide должен помочь с finer points.


Существует еще некоторое обсуждение подобного вопроса с участием Rick Wicklin here.


Как быстро и грязной альтернативы вы можете использовать переменную макрос написать оценку statements:

proc sql; 
    select 
     "estimate 'ID" || put(ID, best.) || "' intercept 1 Age " || 
     put(Age, best.) || " Age*Age " || put(Age**2, best.) || 
     " | intercept 1 Age " || put(Age, best.) || " Age*Age " || 
     put(Age**2, best.) || "/cl subject" || repeat(" 0", (ID - 1)) || "1;" 
    into :estList separated by " " 
    from inEst 
    order by ID; 
quit; 
proc mixed data = maindata noclprint covtest; 
    class id; 
    weight w1; 
    model time = age age*age/solution cl residual; 
    random intercept age age*age/sub = id; 
    &estList.; 
    ods output estimates = want; 
quit; 

В основном вы создаете все estimate заявления в виде строк в запросе SQL и хранить их в макропеременная. Этот подход имеет свои недостатки:

  • Код становится запутанным; это не очевидно, что делается. Я бы так прокомментировал этот код, чтобы дать понять кому-нибудь плохого сопровождающего, почему вы это сделали и что он делает.
  • Макропеременные имеют конечную длину (65534 символов). Если есть риск превышения этой переменной, вы должны разделить ее (с помощью call symput и петли do) и вызывать линии из цикла %do.

Edit: Еще один вариант, вы можете исследовать.

В последних версиях proc mixed и proc plm поддержал code statement который can be used для вывода данных шага кода SAS, необходимый, чтобы выиграть новые наблюдения. При необходимости вы можете использовать сгенерированный код в качестве основы и изменить его для анализа, который вы хотите выполнить.


call symput скелет:.

data _NULL_; 
    set inEst nobs = obs; 
    length mVar $8.; 
    /* Store number of lines in a macro variable */ 
    if _N_ = 1 then call symput("nVars", obs); 

    mVar = "est_" || put(_N_, best.); 
    value = *** Code to make estimate statement ***; 

    /* Create a new macro variable for each line */ 
    call symput(mVar, value); 
run; 

%macro temp; 
    *** Code ***; 
    %do i = 1 %to &nVars.; 
     &&est_&i. 
    %end; 
    *** Code ***; 
%mend temp; 
%temp; 
0

«Макропеременные имеют имеют конечную длину (65534 символов) Если есть риск переменного, превышающее это вы должны разделить его (с symput вызова и цикл do) и вызывать линии из цикла% do. "

Другим вариантом является наличие вашего списка для оценок, заданных как отдельный файл кода, и использование% include. Это также полезно для массивных списков переменных или повторяющихся кодовых блоков, для которых не требуются параметры.

Смежные вопросы