Sas 估计混合过程中的多重输入

Sas 估计混合过程中的多重输入,sas,proc,mixed-mode,Sas,Proc,Mixed Mode,我正在寻找类似于Proc score(Proc reg的结果)的东西来估计数据集 到目前为止,我有类似的东西 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*Ag

我正在寻找类似于Proc score(Proc reg的结果)的东西来估计数据集

到目前为止,我有类似的东西

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))的问题是它没有考虑随机效应。(

编辑:我没有正确阅读您关于
PLM
的问题的结尾。我很抱歉,请看下面的休息,以备选择

这不是我做过的事情,但我相信您可以实现您想要的,使用
proc mixed
proc glm
和其他人生成的模型对数据集进行评分

基本方法是使用以下命令存储模型的二进制表示:

然后使用
proc plm
处理新数据:

proc plm source = sasuser.mixed;
    ...
    score data = inData out = want;
run;
这应该有助于解决问题


Rick Wicklin对类似问题进行了更多的讨论


作为一种快速而肮脏的替代方法,您可以使用宏变量来编写估算
语句

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;
基本上,您可以在sql查询中将所有
estimate
语句创建为字符串,并将它们存储在宏变量中。这种方法有其缺点:

  • 代码变得模糊;不清楚正在做什么。我会对这样的代码进行大量的注释,以便让任何一个糟糕的维护人员非常清楚您为什么这么做以及它在做什么
  • 宏变量具有有限长度(65534个字符)。如果变量的风险超过此值,则应将其拆分(使用
    call symput
    do
    循环),并调用
    %do
    循环中的行

编辑:您可能希望探索的另一个选项

在最近发布的
proc mixed
proc plm
中,支持输出新观察评分所需的SAS数据步骤代码。如有必要,您可以使用生成的代码作为基础,并根据您希望执行的分析对其进行修改


调用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;
“宏变量的长度有限(65534个字符)。如果变量有超过此长度的风险,则应将其拆分(使用call symput和do循环),并从%do循环调用行。”


另一种选择是将估算列表设置为单独的代码文件,并使用%include。这对于大量变量列表或不需要参数的重复代码块也很有用。

您有什么版本的SAS?SAS Stat 13.1+代码语句=>今天刚刚尝试过的代码语句。代码语句与proc plm有相同的问题。它没有考虑随机效应。
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;