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;
Какая версия SAS у вас есть? – Reeza
SAS Stat 13.1+ CODE Statement => http://support.sas.com/documentation/cdl/en/statug/67523/HTML/default/viewer.htm#statug_mixed_syntax04.htm – Reeza
Только что пробовал заявление CODE сегодня. Операция CODE имеет одинаковую проблему с proc plm. Это не влияет на случайный эффект. – devon