【问题标题】:Estimating the multiple input in PROC MIXED估计 PROC MIXED 中的多个输入
【发布时间】:2015-03-07 22:08:40
【问题描述】:

我正在寻找类似于 Proc 分数(来自 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)) 的问题在于它不会对帐户产生随机影响。(http://support.sas.com/documentation/cdl/en/statug/63347/HTML/default/viewer.htm#statug_plm_a0000000126.htm)

【问题讨论】:

标签: sas proc mixed-mode


【解决方案1】:

编辑:我没有正确阅读您关于plm 的问题的结尾。抱歉,请参阅下面的休息时间以获取替代方案。

这不是我做过的事情,但我相信你可以使用proc plm 实现你想要的,它可以使用proc mixedproc 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 symputdo 循环)并从%do 循环中调用行。

编辑:您可能想要探索的另一个选项。

在最近的版本中,proc mixedproc 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;

【讨论】:

    【解决方案2】:

    “宏变量的长度是有限的(65534 个字符)。如果您的变量有任何超过此长度的风险,您应该将其拆分(使用 call symput 和 do 循环)并从 %do 循环中调用行。 "

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2019-01-08
      • 2023-03-29
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多