我在SAS上获得了一段预测消费者行为的代码。到目前为止,我手工完成了50个样本和50个逻辑回归,但我想自动完成这个过程。 步骤如下:
您将在下面找到一段代码。你能告诉我如何循环这个逻辑回归50次吗?到目前为止,我无法使其工作......我是SQL的初学者
%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 ;
提前谢谢
答案 0 :(得分:1)
如果您正在尝试使用自举算法或类似的算法,那么关于该主题的开创性论文就是来自2007 SGF的David Cassell的Don't be LOOPy。从广义上讲,这描述了" old"这样做的方法(涉及一个循环,你在那里采样一个新的样本,然后进行50次分析;以及新的方式,你使用PROC SURVEYSELECT
选项使用rep
。
从论文中,例子:
proc surveyselect data=YourData out=outboot
seed=30459584
method=urs samprate=1 outhits
rep=1000;
run;
这将生成一个带有Replicate
变量的数据集,您可以在大多数分析中将其用作by
变量。然后,它会针对变量的每个值单独执行分析,这可能是您想要的。您可以使用proc surveyselect
上的各种选项来获取所需的样本(样本大小/比率,采样方法等)
如果您只是想将数据集拆分成块,那么您可以进行较小的分析(可能需要花费很长时间才能运行大型分析)或者进行测试和验证子样本,但不要#39; t关心随机事物是多么好,你可以在datastep中添加一个变量,如下所示:
data for_regression;
set your_data;
sample_group = mod(_n_,50);
run;
proc sort data=for_regression;
by sample_group;
run;
然后你有50个小组;如果您愿意,可以随机排序,随机排序等等#34;并且不认为他们现在是这样,但PROC SURVEYSELECT
通常最终会更好。