使用BY语句ERROR消息进行逻辑回归

时间:2018-04-25 11:46:18

标签: sas sas-macro

我目前正致力于为50个不同样本处理50个逻辑回归的SAS程序。我以前在这个帖子(How to loop a logistic regression n number of times?)上有过帮助,人们建议我使用BY语句来避免循环这个过程n次。工作得很好,但我得到了这个错误信息:

错误:由于响应,解释,频率或权重变量中缺少值,或者        非正频率或重量值。 注意:以上消息适用于以下BY组:       样本重复数=。

您可以在下方找到我的代码,如果您有任何人知道它的来源,我可以提前做任何事,谢谢您提前!

proc surveyselect data=TOP_1 NOPRINT out=ALEA_1
    seed=0
    method=urs 
    outhits 
    reps=5
    n=300;
run; 

proc surveyselect data=TOP_0 NOPRINT out=ALEA_0
    seed=0
    method=urs 
    outhits 
    reps=5
    n=300;
run; 


PROC SQL;
    CREATE TABLE APPEND_TABLE As
    SELECT * FROM ALEA_1
      OUTER UNION CORR
    SELECT * FROM ALEA_0;
QUIT;


/* Régression logistique*/
DATA WORK.TMP0TempTableAddtnlPredictData;
    SET WORK.APPEND_TABLE(IN=__ORIG) WORK.BASE_PREDICT_2;
    __FLAG=__ORIG;
    __DEP=TOP_CREDIT_HABITAT_2017;
    if not __FLAG then TOP_CREDIT_HABITAT_2017=.;
RUN;

PROC SQL;
    CREATE VIEW WORK.SORTTempTableSorted AS
        SELECT *
    FROM WORK.TMP0TempTableAddtnlPredictData
        ORDER BY REPLICATE;
QUIT;
TITLE;
TITLE1 "Résultats de la régression logistique";
FOOTNOTE;
FOOTNOTE1 "Généré par le Système SAS (&_SASSERVERNAME, &SYSSCPL) le %TRIM(%QSYSFUNC(DATE(), NLDATE20.)) à %TRIM(%SYSFUNC(TIME(), TIMEAMPM12.))";
PROC LOGISTIC DATA=WORK.SORTTempTableSorted
        PLOTS(ONLY)=ROC
    ;
    By Replicate;
    CLASS age_classe    (PARAM=EFFECT) Flag_bq_principale   (PARAM=EFFECT) flag_univers_detenus     (PARAM=EFFECT) csp_1    (PARAM=EFFECT) SGMT_FIDELITE    (PARAM=EFFECT) situ_fam_1   (PARAM=EFFECT);
    MODEL TOP_CREDIT_HABITAT_2017 (Event = '1') [...6## Heading ##] /
        SELECTION=STEPWISE
        SLE=0.1
        SLS=0.1
        INCLUDE=0
        LINK=LOGIT
    ;

    OUTPUT OUT=WORK.PREDLogRegPredictions(LABEL="Statistiques et prédictions de régression logistique pour WORK.APPEND_TABLE" WHERE=(NOT ws__FLAG))
        PREDPROBS=INDIVIDUAL;
RUN;
QUIT;

DATA WORK.PREDLogRegPredictions; 
    set WORK.PREDLogRegPredictions; 
    TOP_CREDIT_HABITAT_2017=__DEP; 
    _FROM_=__DEP;
    DROP __DEP; 
    DROP __FLAG;
RUN ;
QUIT ;


/* Création du fichier de sorti final*/
PROC SQL;
    CREATE TABLE MODELE_RESULTS As
    SELECT IDCLI_CALCULE, IP_1
    FROM PREDLogRegPredictions;
RUN;
QUIT;

ODS GRAPHICS OFF;

1 个答案:

答案 0 :(得分:0)

可能来自:

DATA WORK.TMP0TempTableAddtnlPredictData;
    SET WORK.APPEND_TABLE(IN=__ORIG) WORK.BASE_PREDICT_2;
    __FLAG=__ORIG;
    __DEP=TOP_CREDIT_HABITAT_2017;
    if not __FLAG then TOP_CREDIT_HABITAT_2017=.;
RUN;

您在此处附加没有复制编号的数据集。我不确定我是否遵循此数据集的内容 - 您是否打算将其添加到每个复制中?然后你可能会做这样的事情(未经测试):

DATA WORK.TMP0TempTableAddtnlPredictData;
    do _n_ = 1 by 1 until (eof);
     SET WORK.APPEND_TABLE(IN=__ORIG) end=eof;
     output;
    end;

    do replicate = 1 to 5;
     do n_predict = 1 to nobs_predict;
      set WORK.BASE_PREDICT_2 nobs=nobs_predict point=n_predict;
      __FLAG=__ORIG;
      __DEP=TOP_CREDIT_HABITAT_2017;
      if not __FLAG then TOP_CREDIT_HABITAT_2017=.;
      output;
     end;
    end;
  stop;
RUN;

这是获得5份副本的复杂方法,每次复制一份。但我不确定这实际上是你想要的 - 它是否拥有你需要的所有变量?你确定你不是指MERGE而不是SET吗?

另外,我不明白为什么使用SQL步骤追加两个样本。我要么在这里的相同数据步骤中执行此操作,要么使用PROC APPEND,两者都会比SQL联合更快,然后立即向数据集添加更多数据。