首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何循环逻辑回归n次?

如何循环逻辑回归n次?
EN

Stack Overflow用户
提问于 2018-04-23 08:43:33
回答 1查看 213关注 0票数 0

我在SAS上有一段代码可以预测消费者的行为。到目前为止,我做了50个样本和50个logistic回归,但我想自动化这个过程。步骤如下:

  • 创建一个具有值"1“的所有客户端的表
  • 创建一个具有值"0“的所有客户端的表
  • (下面的代码从这里开始)启动一个循环:
    • 从价值"1“的客户那里获得3000人的样本
    • 从价值为"0“的客户那里获得3000人的样本
    • 把这两张桌子连接起来
    • 作为输出的Logistic回归(ROC值和最大似然估计)

  • 在同一个文件MODELE_RESULTS中获取所有概率

你会发现下面的一段代码。你能告诉我如何循环这个逻辑回归50次吗?到目前为止我无法让它运转..。我是SQL的初学者

代码语言:javascript
复制
%macro RunReg (DSName, NumVars) ;
%do i=1 %to &NumVars

/* Create a 3000 people sample called TOP_1*/
PROC SURVEYSELECT DATA= TOP_1
    OUT= ALEA_1
    METHOD=SRS
    N=3000;
QUIT;


/* Create a 3000 people sample called TOP_0*/
PROC SURVEYSELECT DATA= TOP_0
    OUT= ALEA_0
    METHOD=SRS
    N=3000;
QUIT;


/*Append both tables */
PROC SQL;
    CREATE TABLE BOTH_SAMPLES As
    SELECT * FROM TOP_1
      OUTER UNION CORR
    SELECT * FROM TOP_0;
QUIT;


/* Logistic regression*/
DATA WORK.&DSName noprint
        Outset=PE(rename(x&i=Value));
    Model Y = x&I;
    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
;
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)=NONE
    ;
    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')=top_situ_particuliere top_chgt_csp_6M top_produit_monetaire_bloque top_CREDIT top_chgt_contrat_travail_6M top_credit_CONSO top_credit_HABITAT top_produit_monetaire_dispo top_VM_autres top_Sicav top_produit_epargne_logement top_Predica top_ferm_prod_6M top_ouv_prod_6M top_produit_Assurance top_produit_Cartes top_produit_Credit "moy_surface_financière_6M"n moy_surf_financiere_ecart_6M moy_encours_dav_6M moy_encours_dav_ecart_6M moy_monetaire_dispo_6M moy_monetaire_dispo_ecart_6M moy_emprunts_6M moy_emprunts_ecarts_6M moy_sicav_6M moy_sicav_ecart_6M moy_vm_autres_6M moy_vm_autres_ecart_6M moy_predica_6M moy_predica_ecart_6M moy_bgpi_6M moy_bgpi_ecart_6M moy_epargne_logement_6M moy_epargne_logement_ecart_6M "moy.an_mt_flux_cred_norme_B2"n "moy.an_mt_op_cred_ep_a_terme"n "moy.an_mt_op_debit_ep_a_terme"n "moy.an_mt_ope_credit_depot"n "moy.an_mt_ope_credit_ep_a_vue"n "moy.an_mt_ope_debit_depot"n "moy.an_mt_ope_debit_ep_a_vue"n "moy.an_mt_pmts_carte_etr"n "moy.an_mt_remise_chq"n "moy.an_mt_paie_carte"n "moy.an_mt_paie_chq"n "moy.an_nb_paie_carte"n "moy.an_nb_paie_chq"n "moy.an_mt_ret_carte_Aut_bq"n "moy.an_mt_ret_carte_CRCA"n "moy.an_mt_ret_carte_etr"n "moy.an_nb_flux_cred_normeB2"n "moy.an_nb_ope_credit_ep_a_terme"n "moy.an_nb_ope_debit_ep_a_terme"n "moy.an_nb_ope_credit_depot"n "moy.an_nb_ope_credit_ep_a_vue"n "moy.an_nb_ope_debit_depot"n "moy.an_nb_ope_debit_ep_a_vue"n "moy.an_nb_pmts_carte_etr"n "moy.an_nb_remise_chq"n "moy.an_nb_ret_carte_Aut_bq"n "moy.an_nb_ret_carte_CRCA"n "moy.an_nb_ret_carte_etr"n "moy.an_nb_ret_carte"n "moy.an_mt_factu_ttc"n "moy.an_mt_reduc_ttc"n "moy.an_mt_rist_ttc"n "moy.an_mt_mvt_domicilie_mktg"n "moy.an_nb_mvt_M_domicilie_mktg"n top_produit_Epargne top_ouverture_reclam age_classe Flag_bq_principale flag_univers_detenus csp_1 SGMT_FIDELITE situ_fam_1     /
        SELECTION=STEPWISE
        SLE=0.05
        SLS=0.05
        INCLUDE=0
        LINK=LOGIT
        OUTROC=_PROB_
        ALPHA=95
        EXPEST
        PARMLABEL
        CORRB
        NOPRINT
    ;

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

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

提前谢谢你

EN

回答 1

Stack Overflow用户

发布于 2018-04-23 17:13:12

如果你想做一个引导算法或者类似的东西,关于这个主题的开创性论文是David的别做LOOPy来自于2007年的SGF。在泛泛的笔画中,这描述了这样做的“旧”方法(涉及一个循环,您对一个新样本进行采样,然后执行50次分析;以及使用PROC SURVEYSELECTrep选项的新方法。

从论文中,例子:

代码语言:javascript
复制
proc surveyselect data=YourData out=outboot
 seed=30459584
 method=urs samprate=1 outhits
 rep=1000;
 run;

这将生成带有Replicate变量的数据集,然后在大多数分析中可以将其用作by变量。然后,对变量的每个值分别执行分析,这大概就是您想要的。您可以使用proc surveyselect上的各种选项来获取所需的样本(样本大小/速率、取样方法等)。

如果您只是试图将数据集分割成块,这样就可以进行更小的分析(因为运行大型数据集可能需要太长时间),或者执行测试和验证子样本,但不关心随机情况有多好,您可以在数据步骤中添加一个变量,如下所示:

代码语言:javascript
复制
data for_regression;
  set your_data;
  sample_group = mod(_n_,50);
run;

proc sort data=for_regression;
  by sample_group;
run;

然后你有50个组;你可以先按随机的东西排序,如果你更喜欢它们是“随机的”,并且不认为它们现在是随机的,但是PROC SURVEYSELECT通常对这类事情更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49976788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档