京公网安备 11010802034615号
经营许可证编号:京B2-20210330
SAS逻辑回归之二分类
数据集这里用的是australian,有14个自变量Xi,一个因变量Y,Y值只取0或1。
代码如下:
/*逻辑回归数据集australian(690个观测值,每个含14个属性,目标变量y(0、1))*/
/*导入数据集australian到逻辑库work中*/
proc import out=aus
datafile="\\vmware-host\Shared Folders\桌面\SAS\\data\australian.csv" /*文件路径*/
dbms=csv replace; /*文件类型指定*/
delimiter=',';
getnames=yes; /*是否将第一列作为列名*/
run;
/*查看数据集*/
proc print data=aus;
run;
/**************************** 使用交叉验证法选择最优模型 *****************************************/
/*利用10-折交叉验证法计算测试集上的预测准确率*/
%let k=10; /*定义宏变量-交叉验证的折数k*/
%let rate=%sysevalf((&k-1)/&k); /*给出交叉验证的样本抽样比率(因为宏变量k的本质是文本,不能直接参与运算,要将其视为数字计算要用%evalf or %sysevalf)*/
/*生成交叉验证的10个样例,保存在cv中*/
proc surveyselect data=aus
out=cv /*生成的样例全部放在数据集cv中*/
seed=158
samprate=&rate /*抽样比率设定,宏变量rate的调用要加&*/
outall /*输出全部数据*/
reps=10; /*指定样本重复的次数*/
run;
/*交叉验证的生成数据集中,selected列为1表示该行为训练集样本,0表示测试集样本,这里为new_y赋值,
若selected=1,则可获得Y的值,若为0,该行的new_y为空。接下来给出new_y为空行的预测值。*/
data cv;
set cv;
if selected then new_y=Y;
run;
/*逻辑回归主程序 - 10折交叉验证*/
ods output parameterestimates=paramest /*输出交叉验证的参数估计值*/
association=assoc; /*输出交叉验证的C统计量*/
proc logistic data=cv des; /*des控制以Y=1来建模*/
/* class new_y (param=ref ref='yes'); 若new_y是分类变量,则用class对其参数化处理,这里选择处理方式为ref,以“yes”作为参考水平,以便于后续odds的计算*/
model new_y=X1-X14 / SELECTION=STEPWISE SLE=0.1 SLS=0.1;
by replicate; /*以交叉验证的组别来分组建模*/
output out=out1(where=(new_y=.)) /*只给出测试集的预测结果(即new_y为空的样本)*/
p=y_hat;
run;
ods output close;
data out1;
set out1;
if y_hat>0.5 then pred=_LEVEL_ ; /* PHAT为logistic方程针对每个观察体计算的属于该组别的概率,若PHAT>0.5,则属于该组别(这里level为1),否则,属于另一组别 */
else pred=0; /* 本例为二分类,概率依照level(1)计算,因此另一类为0 */
run;
/*汇总交叉验证的结果*/
/*计算预测准确率(测试集中预测准确的样本占预测总样本的概率)*/
data out2;
set out1;
if Y=pred then d=1; /*d为真实值和预测值的误差,这里设无误差为1,有误差为0*/
else d=0;
run;
proc summary data=out2;
var d;
by replicate;
output out=out3 sum(d)=d1; /*预测正确的个数*/
run;
data out3;
set out3;
acc=d1/_freq_; /*预测准确率*/
keep replicate acc;
run;
/*结果中加入交叉验证的C统计量(度量观测值和预测值之间的一致性,越大越好)*/
data assoc;
set assoc;
where label2="c";
keep replicate cvalue2;
run;
/*合并交叉验证的统计结果*/
data cvresult;
merge assoc(in=ina) out3(in=inb);
keep replicate cvalue2 acc;
run;
proc print data=cvresult;
title'交叉验证组号、c统计量、预测准确率';
run;
title '交叉验证最优模型选择:组号、预测准确率';
ods output SQL_Results=cvparam; /*保存最优模型结果在cvparam数据集中*/
proc sql ;
select replicate,acc from cvresult having acc=max(acc);
quit;
ods output close;
/***************** 以交叉验证的最优结果组进行建模 *************************************/
/*以最优组合从cv的10个样例中拿出最优样例,作为训练集和测试集*/
/*取出最优组号对应的selected=1的行,作为训练集train,其余的作为测试集test*/
proc sql ;
create table train as
select * from cv where replicate in (select replicate from cvparam)
having selected=1;
create table test as
select * from cv where replicate in (select replicate from cvparam)
having selected=0;
run;
TITLE '--------Logistic Regression - 数据集Neur - 建模方法 STEPWISE ---------------------------';
/* 逻辑回归主程序 - 通过训练集建立logistic模型*/
proc logistic data=train DES /*根据分类值从大到小选择建模组别,此处为yes*/
covout outest=Nout_step /*输出建模参数估计值及变量间的协方差矩阵*/
outmodel=model /*输出建模结果(若想要通过已有的建模结果来预测新数据集,这里可以用inmodel实现)*/
simple; /*输出变量的简单统计量*/
/* class Y (param=ref ref='yes'); 若Y是分类变量,则用class对其参数化处理,这里选择处理方式为ref,以“yes”作为参考水平,以便于后续odds的计算*/
MODEL Y=X1-X14 /*logistic回归模型:反应变量=自变量1 2 3...*/
/ SELECTION=STEPWISE /*选择建模方式 - 逐步排除法*/
SLE=0.1 SLS=0.1 /*变量在模型中的显著程度,默认为0.05*/
details /*输出模型界定的过程,包括自变量的检定和相关系数的值*/
lackfit /*输出HL拟合优度*/
RSQ /*模型解释度R方*/
STB /*输出标准化模型后的参数*/
CL /*参数估计和置信区间*/
itprint /*输出分析每个步骤的统计量*/
corrb /*输出变量的相关矩阵*/
covb /*输出变量的协方差矩阵*/
ctable /*输出不同阈值下的二分类变量的分组情况,类似于ROC曲线上的每个点的值*/
influence /*输出观察体中每个变量统计量,便于找出对分析结果影响力较大的观察体*/
IPLOTS ; /*针对influence的结果画出图形,影响力过高的观察体在图形上都会显得特别突出*/
score data=train outroc=train_roc; /*通过score语句得到训练集上一系列的sensitivity和specificity,画出ROC曲线*/
score data=test
out=test_pred
outroc=test_roc; /*通过score来预测测试集,结果保存在test_pred中,画出ROC曲线*/
OUTPUT out=train_pred /*保存模型预测结果在该数据集中,数据集中包含的列由以下添加的统计量给出*/
P=PHAT lower=LCL upper=UCL /*输出文件中包含每个观察体属于logistic方程预测组别的概率,用PHAT作列名,LCL和UCL为置信上下限的值*/
RESCHI=RESCHI RESDEV=RESDEV /*Pearson残差和偏差残差,找出与模型不太符合的观察体*/
DIFCHISQ=DIFCHISQ DIFDEV=DIFDEV /*检测观察体对对皮尔森卡方适合度和对偏激统计量的影响程度,越大说明与模型越不符*/
/* 还可加入的统计量:C、CBAR、DFBETAS、H、XBETA、STDXBETA */
/ ALPHA=0.1; /*界定P值的信赖度,默认为0.05,对应信赖度为95%,这里为90%*/
run;
quit;
/*
逻辑回归主程序 - 根据logistic模型对测试集进行预测(有需要时可使用独立的logistic过程对新数据进行预测)
proc logistic inmodel=model;
SCORE data=test
outroc=predict_roc;
run;
*/
/* 训练集的预测结果中只给出了预测概率,接下来根据0.5分界将观察体归到具体的类中,加一列“pred”(预测组别)*/
data train_pred;
set train_pred;
if PHAT>0.5 then pred=_LEVEL_ ; /* PHAT为logistic方程针对每个观察体计算的属于该组别的概率,若PHAT>0.5,则属于该组别(这里level为1),否则,属于另一组别 */
else pred=0;
run;
/* 输出混淆矩阵 - 训练集*/
ods output CrossTabFreqs=ct_train; /*保存混淆矩阵表(训练集)*/
ods trace on;
proc freq data=train_pred;
tables Y*pred;
run;
ods trace off;
ods output close;
proc sql;
create table acc1 as
select sum(percent) from ct_train where (Y=pred and Y ^=.);
proc print data=acc1;
title '训练集上的预测准确率';
run;
/* 输出混淆矩阵及准确率等指标 - 测试集*/
ods output CrossTabFreqs=ct_test; /*保存混淆矩阵表(测试集)*/
proc freq data=test_pred;
tables F_Y*I_Y ;
run;
ods output close;
proc sql;
create table acc2 as
select sum(percent) from ct_test where (F_Y=I_Y and F_Y ^='');
proc print data=acc2;
title '测试集上的预测准确率';
run;
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数字化管理与数据化运营体系中,指标是连接原始数据与业务决策的核心载体。零散的原始数据只是无意义的数值堆砌,无法直接反映 ...
2026-06-25在Excel数据汇总、财务统计、业务复盘等日常办公场景中,经常需要完成逐行相乘、整体汇总求和的计算需求,最典型的场景就是:单 ...
2026-06-25 很多数据分析师沉迷于复杂的机器学习算法,却忽略了数据分析最基础也最核心的能力——描述性统计。事实上,80%的商业分析问 ...
2026-06-25【核心关键词】主数据、资产、供应商、现金流、企业、精细化、集团、数字化、中国、数据质量、数据管理、经营管理、地产行业、 ...
2026-06-24在数据分析、假设检验、AB测试、学术研究等统计场景中,显著水平(α)与P值(P-value)是判断统计结果是否具有统计学意义的两个 ...
2026-06-24小李刚入职了一家互联网公司的运营部门。第一次参加业务复盘会,运营主管问了一个看似简单的问题:“这个月新用户留存率下降了5 ...
2026-06-24在数字化转型全面渗透的产业背景下,数据分析已成为互联网、金融、零售、制造等几乎所有行业的核心岗位能力。很多初学者对数据分 ...
2026-06-23在企业并购、股权定价、投融资评估、资产核算等资本市场核心场景中,市场法是应用最广泛、市场认可度最高的企业价值评估方法。传 ...
2026-06-23 许多数据分析师精通Excel函数和SQL查询,但当面对一张上万行的销售明细表,要快速回答“哪个地区销量最高”“哪款产品增长最 ...
2026-06-23【核心关键词】运营、证书、金融、客户、产品、软件、销售额、量化、科技、数据分析、金融行业、证券类软件、业务流程、金融机 ...
2026-06-22在企业方案选型、产品迭代评审、供应商筛选、运营效果复盘等决策场景中,单一指标的优劣判断往往无法支撑科学决策。一套转化效果 ...
2026-06-22 很多数据分析师掌握了Excel函数、会写SQL查询,但当被问到“数据从哪里来”“数据加工有哪些步骤”“如何使用分析工具连接数 ...
2026-06-22【核心关键词】软件、洞察力、大数据、产品、经验、硬件、流量、创新、决策、数据安全、网络安全、数据分析、决策制定、数据挖 ...
2026-06-18在方案选型、效果复盘、产品评估、供应商筛选等各类业务决策场景中,仅凭单一指标下结论往往会陷入 “以偏概全” 的误区。多维度 ...
2026-06-18 很多数据分析师精通Excel单元格操作,但当被问到“表结构数据的基本处理单位是什么”“字段和记录的本质区别”“为什么表结 ...
2026-06-18在数据分析、用户运营与业务增长的工作体系中,漏斗拆解是最基础也最高频的问题定位方法。很多业务场景下,我们只能看到最终的转 ...
2026-06-17在数据库开发、数据清洗与报表统计场景中,数值类型转换为日期是高频刚需操作。业务系统常以 Unix 时间戳、整型日期(如20240617 ...
2026-06-17 数据分析师八成以上的时间在和数据表格打交道,但许多人拿到Excel后习惯性地先算、先分析,结果回头发现漏了一列关键数据, ...
2026-06-17【核心关键词】数据库、电商、知识、产品、数据产品、监管业务、产品经理、业务系统、用户行为分析、用户分析、数据分析、电商 ...
2026-06-16在 Python 动态类型与面向对象的编程体系中,变量定义与类实例化是构建代码逻辑的两大核心基石。变量是数据存储、传递与运算的基 ...
2026-06-16