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;
数据分析咨询请扫描二维码
数据分析师的工作内容涉及多个方面,主要包括数据的收集、整理、分析和可视化,以支持商业决策和问题解决。以下是数据分析师的一 ...
2024-11-21数据分析师必须掌握的技能可以从多个方面进行归纳和总结。以下是数据分析师需要具备的主要技能: 统计学基础:数据分析师需要 ...
2024-11-21数据分析入门的难易程度因人而异,总体来看,入门并不算特别困难,但需要一定的学习和实践积累。 入门难度:数据分析入门相对 ...
2024-11-21数据分析是一项通过收集、整理和解释数据来发现有用信息的过程,它在现代社会中具有广泛的应用和重要性。数据分析能够帮助人们更 ...
2024-11-21数据分析行业正在迅速发展,随着技术的不断进步和数据量的爆炸式增长,企业对数据分析人才的需求也与日俱增。本文将探讨数据分析 ...
2024-11-21数据分析的常用方法包括多种技术,每种方法都有其特定的应用场景和优势。以下是几种常见的数据分析方法: 对比分析法:通过比 ...
2024-11-21企业数字化转型是指企业利用数字技术对其业务进行改造和升级,以实现提高效率、降低成本、创新业务模式等目标的过程。这一过程不 ...
2024-11-21数据分析作为一个备受追捧的职业领域,吸引着越来越多的女性加入其中。对于女生而言,在选择成为一名数据分析师时,行业选择至关 ...
2024-11-21大数据技术专业主要学习计算机科学、数学、统计学和信息技术等领域的基础理论和技能,旨在培养具备大数据处理、分析和应用能力的 ...
2024-11-21《Python数据分析极简入门》 第2节 3 Pandas数据查看 这里我们创建一个DataFrame命名为df: importnumpyasnpi ...
2024-11-21越老越吃香的行业主要集中在需要长时间经验积累和专业知识的领域。这些行业通常知识更新换代较慢,因此随着年龄的增长,从业者能 ...
2024-11-20数据导入 使用pandas库的read_csv()函数读取CSV文件或使用read_excel()函数读取Excel文件。 支持处理不同格式数据,可指定分隔 ...
2024-11-20大数据与会计专业是一门结合了大数据分析技术和会计财务理论知识的新型复合型学科,旨在培养能够适应现代会计业务新特征的高层次 ...
2024-11-20要成为一名数据分析师,需要掌握一系列硬技能和软技能。以下是成为数据分析师所需的关键技能: 统计学基础 理解基本的统计概念 ...
2024-11-20是的,Python可以用于数据分析。Python在数据分析领域非常流行,因为它拥有丰富的库和工具,能够高效地处理从数据清洗到可视化的 ...
2024-11-20在这个数据驱动的时代,数据分析师的角色变得愈发不可或缺。他们承担着帮助企业从数据中提取有价值信息的责任,而这些信息可以大 ...
2024-11-20数据分析作为现代信息时代的支柱之一,已经成为各行业不可或缺的工具。无论是在商业、科研还是日常决策中,数据分析都扮演着至关 ...
2024-11-20数字化转型已成为当今商业世界的热点话题。它不仅代表着技术的提升,还涉及企业业务流程、组织结构和文化的深层次变革。理解数字 ...
2024-11-20在现代社会的快速变迁中,选择一个具有长期增长潜力的行业显得至关重要。了解未来发展前景好的行业不仅能帮助我们进行职业选择, ...
2024-11-20统计学专业的就业方向和前景非常广泛且充满机遇。随着大数据、人工智能等技术的快速发展,统计学的重要性进一步凸显,相关人才的 ...
2024-11-20