分享

SAS系列05:SAS数据整理(一)

 松哥精鼎统计 2020-10-23
导读

     前面我们介绍了将外部数据导入为SAS数据集,今天要开始对数据集进行处理。在实际数据分析过程中,统计分析或建模过程花的时间不是最多的,而是在数据理解和数据预处理阶段需要花大量的时间。本章将从数据理解和数据预处理进行介绍

一、数据的理解






图4-1  数据预处理流程
      
    数据的整理与核查是数据统计分析的基础。在实际工作中,尤其是大数据项目,收集的数据可能以不同的格式或者不同的载体存储,因此,在数据格式的转换、数据的清洗、数据集的合并和筛选等方面要花费大量的时间。在收到数据后,首先根据研究目的要对数据完整性和变量类型等方面有充分认识,以便制订数据处理计划。

(一)数据的完整性

      数据完整性的核查是一项比较繁杂的过程。需要充分认识每个变量的具体含义,确定每个变量都有允许的取值范围、是否存在异常值;核对每个变量的取值是否一致、变量间的关系是否符合逻辑性;变量的缺失值情况、是否存在冗余变量(对于所有观测来说,其取值都是相同的,或者含有重复信息);确定关联数据的关键字。

(二)数据的变量类型

     变量是随机变量的简称,表示观察对象在性质、数量和程度等方面的特征,不同的变量可以取不同的数值。根据变量是定量的或定性的,可以将数据分为定量数据、定性数据和有序数据三种类型。
      定量数据(quantitative data)又称为计量资料(measurement data)或数值变量(numerical variable)资料,是指观察每个研究单位或个体某项指标大小而获取的数据。变量的观测结果是数值型的,一般有度量衡单位。根据其观测值的取值是否连续,又可分为连续型(如身高、体重等)和离散型(如脉搏、心率等)。
       定性数据(qualitative data)又称为计数资料(enumeration data)或无序分类变量(unordered categorical variable)资料或名义变量(nominal variable)资料,是指将研究单位按某种互不相容的属性或类别分组计数,分组汇总各组研究单位数后得到的资料。其变量值是定性的,可分为二分类(如性别、是否吸烟等)和多分类(如血型、职业等)。
       有序数据(ordinal data)又称等级资料(ranked data)或半定量资料(semi-quantitative),是指将观察单位按某种属性的不同程度或顺序分成等级后分组计数,分类汇总各组观察单位数得到的资料,其变量值具有半定量的性质,如某药物的疗效为治愈、显效、好转、无效四个等级。

二、数据的预处理






      数据的预处理是为数据的最终分析结果提供质量保证,即从原始数据中构造用于分析的最终数据集,包括:数据集的合并、变量和观测的选择、数据转换和清理等。接下来将从SAS数据集的调用、变量的处理、观测的处理、数据集的处理四个方面来介绍SAS实现。

(一)SAS数据集的调用

     在前面我们已经介绍了获取外部数据,并创建SAS数据集的各种方法。现在来介绍SAS数据集的调用。SAS数据调用可以通过DATA步的set语句和PROC SQL来实现。











*===DATA步的set语句调用SAS数据集;DATA weight; /*SAS数据集Bweight创建的临时数据集weight*/ SET sashelp.Bweight;RUN;*===RPOC SQL过程调用SAS数据集;PROC SQL; CREATE TABLE weight as SELECT *FROM sashelp.Bweight;QUIT;

      在实际工作中,SAS数据集的调用是与变量处理、观测的处理和数据集的合并交织在一起,在后面的部分将详细介绍DATA步和RPOC SQL过程。

(二)变量的处理

       对数据集中变量的处理主要是变量的筛选、重命名、变量类型的转换、新变量的生成等,可用数据集选项、SAS语句和PROC 过程步来实现。
2.1 筛选变量

(1)KEEP=/DROP=和KEEP/DROP语句筛选变量
        KEEP=/DROP=选项不仅可以在DATA语句中使用,也可以在SET语句中使用。在DATA步中,SET语句将数据读入到PDV中。SET语句中的KEEP=/DROP=选项是直接将选取的变量读入到PDV中,而DATA语句中的选项则是将全部数据读入到PDV中后再保留选取的变量。
      
      因此,SET语句中的KEEP=/DROP=选项的筛选变量时会更高效,但是DATA语句中的KEEP=/DROP=选项可以同时建立多个数据集。DATA步中的KEEP/DROP语句也是在PDV中选取变量。在实际应用中,我们会根据实际需求来确定实现变量筛选的方法。



































*====保留变量;*===SET语句KEEP=选项保留变量;DATA class;  /*建立临时数据集*/ SET sashelp.classfit (KEEP=name sex age height weight);RUN;
*===DATA语句KEEP=选项保留变量;DATA height(KEEP=name sex age height) weight(KEEP=name sex age weight); SET sashelp.classfit;RUN;
*===SET语句DROP=选项删除变量;DATA class;  /*建立临时数据集*/ SET sashelp.classfit (DROP=lowermean uppermean);RUN;
*====删除变量;*===DATA语句DROP=选项删除变量;DATA class(DROP=predict lowermean uppermean lower upper) predict(DROP=height weight); SET sashelp.classfit;RUN;
*===DATA步KEEP语句保留变量;DATA class; SET sashelp.classfit; KEEP name sex age height weight;RUN;
*===DATA步DROP语句删除变量;DATA class; SET sashelp.classfit; DROP lowermean uppermean;RUN;

(2)PROC SQL筛选变量













*===RPOC SQL选取变量;PROC SQL; CREATE TABLE class as SELECT name,sex,height,weight  /*指定保留的变量*/ FROM sashelp.classfit;QUIT;
*===RPOC SQL删除变量;PROC SQL; ALTER TABLE class DROP height;QUIT;

2.2 修改变量名


(1)RENAME=选项和RENAME语句修改变量名


















*===DATA语句中RENAME=选项修改变量名;DATA class(rename=(lowermean=L_mean uppermean=U_mean)); SET sashelp.classfit;RUN;
*===SET语句中RENAME=选项修改变量名;DATA class; SET sashelp.classfit(rename=(lowermean=L_mean uppermean=U_mean)); /*将lowermean修改为L_mean, 将uppermean修改为U_mean*/RUN;
*===DATA步中RENAME语句修改变量名;DATA class; SET sashelp.classfit; RENAME lowermean=L_mean /*将lowermean修改为L_mean*/            uppermean=U_mean; /*将uppermean修改为U_mean*/RUN;

(2)PROC SQL修改变量名








PROC SQL; CREATE TABLE class6 as SELECT name,sex,height,weight,predict, lowermean as L_mean, /*将lowermean修改为L_mean*/          uppermean as U_mean /*将uppermean修改为U_mean*/ FROM sashelp.classfit;QUIT;

2.3生成新变量


       在数据处理的过程,会生成新的变量以利于进一步的数据分析、建模,如根据研究目的生成分组变量、建模需要生成哑变量、变量运算。新变量的生成可以通过DATA步和PROC过程等来实现。在生成新变量的过程中,可能需要多个语句或者过程步的组合来完成,如在DATA步中生成新变量可以通过赋值语句、循环语句、条件语句、SAS函数等多种方法组合生成,实际应用时可根据具体情况来进行选择和组合。

(1)变量计算和生成分组变量






























*===DATA步使用表达式和IF-ELSE语句生成新变量;DATA class; SET sashelp.classfit; W_error=predict-weight; /*生成新变量W_error*/ FORMAT W_error 7.4; IF W_error<=0 THEN group=1; /*生成分组变量group*/ ELSE group=2;RUN;
*===DATA步SELECT-WHEN语句生成分组变量;DATA class; SET sashelp.classfit; W_error=predict-weight; /*生成新变量W_error*/ FORMAT W_error 7.4; SELECT; /*生成分组变量group*/ WHEN(W_error<=0) group=1; OTHER group=0; END;RUN;
*===RPOC SQL生成分组变量;PROC SQL; CREATE TABLE class2 as SELECT *, predict-weight AS W_error, /*生成新变量W_error*/ CASE WHEN(calculated W_error<=0) THEN 1 ELSE 0 END AS group   /*生成分组变量group*/ FROM sashelp.classfit;QUIT;
(2)生成哑变量

       哑变量(Dummy variables)又称虚拟变量,用以反映质的属性的一个人工变量,是量化了的自变量,通常取值为0或1。在建立模型时,自变量是分类变量时,可以考虑哑变量来处理。关于哑变量的详细说明将在后期建模时进行介绍。































*===创建生成哑变量的数据集;DATA model; DO disease=1,0; DO factor=1 to 3; INPUT freq @@; OUTPUT; END; END; DATALINES;20 5 25 30 10 20;RUN;
*===ARRAY语句,DO-END循环语句和IF-ELSE条件语句生成哑变量;DATA model1; SET model; ARRAY f{3} factor1-factor3; DO i=1 to 3; IF factor=i THEN f{i}=1; ELSE f{i}=0; END;RUN;
*===IF-ELSE语句生成哑变量;DATA model2; SET model; IF factor=1 THEN factor1=1; ELSE factor1=0; IF factor=2 THEN factor2=1; ELSE factor2=0; IF factor=3 THEN factor3=1; ELSE factor3=0;RUN;

(3)变量类型转换






















*===DATA步PUT函数将数值变量转换成字符型变量;DATA class1; SET class; group1=put(group,best.);RUN;
*===创建字符变量转换数值变量的数据集;DATA example; INPUT name $ gender$ job $ @@; DATALINES;Andy M 1Jonh F 3Smith M 5Jane F 3;RUN;*===INPUT函数将字符型变量转换为数值型变量;DATA example1; SET example;    job_c=INPUT (job,1.);RUN;

(4)变量求和与累加
























*===创建数据集;PROC IMPORT datafile="E:study fileJindingtongjiSASscore.xlsx" out=score dbms=xlsx replace;RUN;*===行求和与平均值;DATA score1; SET score(rename=(var1=name var2=gender var3=chinese var4=math var5=english var6=history var7=geography)); total=sum(chinese,math,english,history,geography); /*每个观测求和,也可写为"chinese+math+english+history+geography"*/ average=MEAN(chinese,math,english,history,geography); FORMAT average 5.2;RUN;*===变量累加;DATA score2; SET score1; cum_chinese+chinese; /*chinese分数累加,cum_chinese为累加变量*/ cnt_chinese+1; /*chinese分数累加计数变量cnt_chinese */ avg_chinese=cum_chinese/cnt_chinese; FORMAT avg_chinese 5.2;RUN;
2.4 查找缺失变量

       数据缺失是数据分析过程中经常会遇到的问题之一。当缺失数据比例很小时,可直接对缺失记录进行舍弃或手工处理。但在缺失数据较多时,如果舍弃,则会丢失大量信息,还会影响对结果的推论。在对缺失数据进行处理前,可以通过对缺失数据的查找,充分了解缺失数据是十分有必要的。SAS中查找缺失数据可能通过DATA步中的ARRAY语句、DO-END语句和IF-THEN语句实现。对于缺失值的处理,我们将在后面的章节介绍。































*===生成一个查找缺失变量的新变量;DATA class_mis1(DROP=n c); SET class; LENGTH misslist $ 50; ARRAY num{*} _numeric_;/*定义数值型变量数组和所有数值型变量*/ ARRAY char{*} _character_;/*定义字符型变量数组和所有字符型变量*/ DO n=1 to dim(num); if missing(num{n}) THEN misslist=catx(",","",vname(num{n})); /*缺失的数值型变量输出到变量misslist*/ END; DO c=1 to dim(char); IF missing(char{c}) THEN misslist=catx(",","",vname(char{c})); /*缺失的字符型变量输出到变量misslist */ END;RUN;
*===生成一个有缺失变量的新数据集;DATA class_miss2(drop=n c); SET class; ARRAY num{*} _numeric_; DO n=1 TO dim(num);      IF missing(num{n}) THEN OUTPUT;/*输出缺失数值型变量的观测*/ END; ARRAY char{*} _character_; DO c=1 TO dim(char);      IF missing(char{c}) THEN OUTPUT;/*输出缺失字符型变量的观测*/ END;run;
       今天我们就先介绍到这儿,观测的处理和数据集的处理在下一期介绍。整理不易,欢迎点亮再看哦!

参考文献:

[1] 谷鸿秋. SAS编程演义[M]. 北京:清华大学出版社,2017.

[2] 高惠璇. SAS系统Base SAS软件使用手册[M]. 北京:中国统计出版社,1997.

[3] https://support./en/software/base-sas-support.html.

[4] 夏庄坤, 徐唯, 潘红莲, 等. 深入解析SAS——数据处理、分析优化与商业应用[M]. 北京: 机械工业出版社,2014.

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多