在本文中不讲每种分析方法的使用前提条件,如线性回归分析中的线性、独立、正态和等方差,这篇文章我们略过所有前提条件的审查,假设所做分析均满足前提条件。医学领域中,我们常常会分析一个变量(连续资料或计数资料或生存资料等)与多个变量的关系,即通过建立回归方程来说明某变量(因变量)随另一个(或多个)其他变量(自变量)的变化而变化的规律,如多因素线性回归、Logistic回归或COX回归等分析;在满足每个方法应用前提得条件下,往往我们从单因素分析入手探索每一个自变量与因变量的关系,再根据单因素分析的结果(p小于检验水准α )将有统计学意义的自变量纳入多因素回归分析模型中进行分析。α 值可以设置为0.05,或0.1或其他。设置过小,某些重要因素会在单因素分析中被遗漏(即说单因素分析时P值大于α ,但多因素分析时p值小于α 。)
再如决策树分析,我们也需要从单因素分析入手,从大量的因素中初步筛选出影响因变量的因素,再进一步分析。在单因素分析中,需要重复的复制粘贴替换model语句的x变量,再在繁多的输出结果中复制粘贴出结果(如单因素分析的参数值参数检验统计量和p值,这样的工作重复操作,如果变量个数少,这点重复性的工作还是可以接受的,如果十几个或是上百个变量,这样的工作繁琐,枯燥,乏味,最最关键的容易出错。那么我们就在想怎么使该过程自动化,每个变量都自动化完成单因素分析,,自动汇总结果,自动根据设置的α 值判断变量是否纳入多因素分析过程,然后自动去完成多因素分析。今天要分享的就是这个盲筛和自动化过程。因为平时工作台多太繁琐,重复的工作最耗不起了。分享给大家。一起来轻松工作。再说一遍,假设线性回归分析的的四个前提条件满足。从线性回归分析的单因素分析到多因素分析,省略模型诊断和评价过程,即去首尾过程。本文还是得用到select…into方法(此处不熟回到文章《SAS SQL select…into语句创建宏变量巧妙解决问题的总结》看看)。
例子为线性回归分析,其他方法雷同。数据来源sashelp逻辑库的Bweight数据集。在这个数据集MomEdLevel变量为有序分类变量,比较有特点的数据,我们首先需要对这该变量进行哑变量化处理,以便结果解释。同样需要哑量化处理的还有多分类变量。回归回归分析简单的说就是建立一个回归方程,回归方程需要估计出每个自变量的参数,这个参数的解释就是在其他变量不改变的情况下,该变量增加1个单位量,因变量的改变值(广泛的说是等式左边的改变值,线性回归分析直接说因变量,logistic回归分析是logit P的改变量等等),如果是多分类,增加一个单位无从解释从哪个分类到哪个分类改变而导致的等式左边的改变,因此需要哑量化处理,便于解释。Logistic、COX回归中,可以直接在class语句中将分类变量哑变量化处理。方法参见(经管论坛提供)。在这需要说明的是,一组哑变量需同时纳入模型中,任意一个哑变量有统计学意义均该变量所产生的所有哑变量需纳入模型中。
在该数据集中变量信息如下:
变量 | 角色 | 标签 |
Weight | 因变量 | Infant Birth Weight |
Black | 自变量/二分类 | Black Mother |
Boy | 自变量/二分类 | Baby Boy |
CigsPerDay | 自变量 | Cigarettes Per Day |
Married | 自变量/二分类 | Married Mother |
MomAge | 自变量 | Mother's Age |
MomEdLevel | 自变量/有序分类 | Mother's Education Level |
MomSmoke | 自变量/二分类 | Smoking Mother |
MomWtGain | 自变量 | Mother's Pregnancy Weight Gain |
Visit | 自变量 | Prenatal Visit |
Weight | 自变量 | Infant Birth Weight |
因此问题的解决思路为:
Step 1:将MomEdLevel哑量化处理;
Step 2:将所有自变量一一进行单因素分析,导出参数检验结果;
Step 3:判断参数检验P值是否小于α 检验水准,再将单因素分析有统计学意义的变量纳入多因素分析模型。
中间需要根据宏变量,参数数据集,分析模块变量三个部分的变量结果处理变量。见程序。这里还需要注意一个问题,在线性回归哑变量分析时,默认最后一个哑变量为参照,所以需将作为参照的哑变量放在哑变量组的最后。程序本来可以很简单,这两天电脑突然就说很多应用不能用了,比方说%sysfunc调用find、index、tranwrd等函数不能用,SAS MACRO的%if..%then %do..不能用….很郁闷。只能节后查下问题,或者重装了。
我觉得Logistic回归分析就很简单,class直接就可以哑变量化。不会来回的对变量值进行处理。最后祝大家国庆节快乐!
/*MomEdLevel哑量化处理*/
data bweight_dummy(drop=MomEdLevel);
set sashelp.bweight;
MomEdLevel0=(MomEdLevel=0);
MomEdLevel1=(MomEdLevel=1);
MomEdLevel2=(MomEdLevel=2);
MomEdLevel3=(MomEdLevel=3);
run;
/*将数据集的变量存放入宏变量中,迭代放入单因素模型做回归分析*/
proc sql noprint;
select name,count(name) into :varnames separated by "_" , :varnum
from dictionary.columns
where libname="WORK"and memname=upcase("bweight_dummy");
quit;
%put &varnames,&varnum;
/*组装哑变量为一个整体*/
data test;
x=tranwrd(resolve('&varnames'),"MomEdLevel0_MomEdLevel1_MomEdLevel2_MomEdLevel3","{MomEdLevel3-MomEdLevel0}");
call symput("vars",x);
run;
%put &vars;
/*编写宏,多个变量一一迭代进入单因素分析模型,并输出、汇总单因素分析关键结果值*/
option mprint symbolgen;
%macro simple_liner;
%do i=2%to &varnum;
%let var=%scan(&vars,&i,"_");
ods output ParameterEstimates=para_&i;
proc reg data=bweight_dummy;
model weight = &var;
run;
data all;
length variable $20;
set all para_&i;
run;
%end;
%mend;
%simple_liner;
/*整理参数,生成多因素分析的宏变量*/
proc sql;
select distinct Variable into :multi_vars separated by " "
from all
having Variable ne "Intercept" and min(Probt) lt 0.05;
quit;
%put &multi_vars;
/*根据生成宏变量值与分析数据集的差距整理宏变量值,复原数据集原变量名称*/
data_null_;
x=tranwrd(resolve('&multi_vars')," MomEdLevel0 MomEdLevel1 MomEdLevel2MomEdLevel3"," {MomEdLevel3-MomEdLevel0}");
call symput("momedu",x);
run;
%put &momedu;
/*多因素分析*/
ods output ParameterEstimates=para_all;
proc reg data=bweight_dummy;
model weight = &momedu;
run;
最后祝大家国庆节快乐!!