Логистическая регрессия с сообщением BY ОШИБКА - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время я работаю над программой SAS, которая обрабатывает 50 логистических регрессий для 50 различных выборок.Ранее я имел помощь в этом потоке ( Как зациклить логистическую регрессию n раз? ), люди посоветовали мне использовать инструкцию 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 голосов
/ 25 апреля 2018

Вероятно из этого:

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, а затем сразу добавили бы больше в набор данных.

...