sas统计分析学习笔记(五)

来源:互联网 发布:vb多线程实例 编辑:程序博客网 时间:2024/05/24 04:51

1.处理日期变量

使用指针和输入格式来读取数据(这被称为格式化输入)。栏位指针(@)首先告诉程序从哪一个栏位开始读取。之后我们要附上变量名,并且说明要读取的数据类型,数据类型就被称为输入格式,两种非常常见的输入格式W.n和$W。
W.n是数字输入格式,告诉程序读取栏位数为W的数据,并且将最后n位数字作为小数部分。举例来说,6.1告诉程序读取栏位6,并且在最后一位数字之前加上小数点。
$W.是输入格式是用来读取栏位W的字符型数据。可以这样写
INPUT @1  ID      $3.      @4  DOB     MMDDYY10.      @14 ADMIT   MMDDYY10.      @24 DISCHRG MMDDYY10.      @34 DX      1.      @35 FEE     5.;
若日期MMDDYY中不包含两个斜杠,则数据只占用8个栏位,那么就应该使用MMDDYY8.格式。
接下来来,我们从这些数据里计算两个新变量:计算每个患者入院的年龄和住院时间,因此将刚刚的程序补充完整:
DATA HOSPITAL;INPUT @1    ID            $3.      @4    DOB     MMDDYY10.  @14   ADMIT   MMDDYY10.  @24   DISCHRG MMDDYY10.      @34   DX             1.      @35   FEE            5.;LENGTH_STAY = DISCHRG - ADMIT +1;AGE = ADMIT-DOB;DATALINES;00110/21/194612/12/200412/14/20048 800000205/01/198007/08/200408/08/200441200000301/01/196001/01/200401/04/20043 900000406/23/199811/11/200412/25/2004715123;
得到结果如下:
从表中看到003的出生日期是0,因为这个人是在1960年1月1日出生的,这一天是sas定义中的零点,现在也可以使用输出格式转换日期数值的输出形式,两种十分常用的日期格式是:MMDDYY10.和DATE9.(例子:10/21/1995、21OCT1995)。我们把生日的输出格式定义为MMDDYY10.,把入院和出院日期的输出格式定义为DATA9.,现在需要在DATA步骤中添加一行语句:
FORMAT DOB MMDDYY10. ADMIT DISCHRG DATE9.;
数据列表就变成了:


计算两个日期之间的间隔年数用sas函数YRDIF,如果要计算入院时的准确年龄就应该写成
AGE=YRDIF(DOB,ADMIT,'ACTUAL');
如果要计算一个人在某一个特定日期的年龄,例如2005年1月1日,指定为日期常数‘01JAN2005’D,计算一个人在这一天的年龄应该这样写:
AGE=YRDIF(DOB,'01JAN2005'D,'ACTUAL');
计算到今天的年龄:
AGE=YRDIF(DOB,TODAY(),'ACTUAL');
我们可能想这样定义年龄:在某人没到18岁生日之前都不算18岁,使用INT函数省去小数部分:
AGE=INT(AGE);
也可以使用嵌套函数
AGE=INT(YRDIF(DOB,ADMIT,'ACTUAL'));
如果想要将年龄取值保留到小数点后两位,就使用ROUND函数,这个函数需要两个自变量:需要四舍五入的数字和舍入单位:
AGE=ROUND(YRDIF(DOB,ADMIT,'ACTUAL'),.01);
如果四舍五入成整数,则不需要后面的舍入单位。
如果要将值设回1900年,即改变YEARCUTOFF选项的值,需要使用option语句:
OPTION YEARCUTOFF=1900;

2.追踪数据

假设我们收集了一组患者的数据,每次患者来访,我们都会填写一个表格,收集的数据包括,患者ID,来访日期(月 日 年),心率(HR),收缩压(SBP),舒张压(DBP),诊断代码(DX),处方费(DOCFEE),检验费(LABFEE)。
现在假设每个患者每年最多来访四次,那么下面是一种编排方法:
DATA HOSP_PATIENTS;INPUT #1   @1  ID        $3   @4  DATE1     MMDDYY8.   @12 HR1       3.   @15 SBP1      3.   @18 DBP1      3.   @21 DX1       3.   @24 DOCFEE1   4.   @28 LABFEE1   4.      #2   @4  DATE2     MMDDYY8.   @12 HR2       3.   @15 SBP2      3.   @18 DBP2      3.   @21 DX2       3.   @24 DOCFEE2   4.   @28 LABFEE2   4.       #3   @4  DATE3     MMDDYY8.   @12 HR3       3.   @15 SBP3      3.   @18 DBP3      3.   @21 DX3       3.   @24 DOCFEE3   4.   @28 LABFEE3   4.        #4   @4  DATE4     MMDDYY8.   @12 HR4       3.   @15 SBP4      3.   @18 DBP4      3.   @21 DX4       3.   @24 DOCFEE4   4.   @28 LABFEE4   4.;  FORMAT DATE1-DATE4 MMDDYYYY10.;DATALINES;0071021198307012008001400400150007120119830721300900200050020000700700909031983066110070137003000000090090090050705198307414008201300900000005011519820801800960140200150000506181982070170084014008004000050703198306414008401400800200;
在INPUT语句里的#号表示每个被试有多行数据。每个患者每次来访占用一行数据, 采用此方法后,我们需要在来访次数少于4的患者数据后插入空行,使得每个患者的记录都是4行,如果想要计算被试内的数据的平均数,则应该在DATALINES语句之前写下:
AVEHR=MEAN(OF HR1-HR4);AVESBP=MEAN(OF SBP1-SBP4);AVEDBP=MEAN(OF DBP1-DBP4);
“MEAN”函数能计算列出的所有变量的平均数,如果没有加OF,将只计算两个数的平均数。
 
与上面方法相比,更好的方法是将每个患者的每次来访都作为一个独立的观测值。
由于想要把一个患者多次来访的数值放在一起求平均,因此不能简单地直接使用proc means过程,要计算患者的平均心率和血压,关键就在于将ID变量作为一个CLASS或者BY变量。 
DATA PATIENTS;INPUT @1  ID        $3.      @4  DATE      MMDDYY8.  @12 HR        3.      @15 SBP       3.      @18 DBP       3.      @21 DX        3.      @24 DOCFEE    4.      @28 LABFEE    4.;     FORMAT DATE MMDDYY10.;DATALINES;0071021198307012008001400400150007120119830721300900200050020000909031983066110070137003000000050705198307414008201300900000005011519820801800960140200150000506181982070170084014008004000050703198306414008401400800200;PROC MEANS DATA=PATIENTS NOPRINT NWAY;  CLASS ID;  VAR HR--DBP DOCFEE LABFEE;  OUTPUT OUT=STATS MEAN=M_HR M_SBP M_DBP M_DOCFEE M_LABFEE;RUN;
每个患者的HR、SBP等变量的平均数将存储在一个新的数据集STATS中.

3.选择每个患者的第一次或者最近一次来访

PROC SORT DATA=PATIENTS;BY ID DATE;RUN;DATA RECENT; *创建数据集RECENT;SET PATIENTS;*从数据集PATIENTS里将数据读取过来;BY ID;IF LAST.ID;RUN;
首先将数据按照ID和DATE进行排序。在SET语句之后,使用了BY变量,前提是该数据之前已依据某相同变量排序过。使用BY语句的结果是,SAS数据集中生成了两个新变量
FIRST.和LAST.,这两个变量是逻辑变量,只有真(1)或者假(0)。本例中,由于BY变量是ID,因此自动生成的是FIRST.ID和LAST.ID,当读取某个ID是第一个观测值时,FIRST.ID为真,其他情况下为假













原创粉丝点击