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

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 8000
00205/01/198007/08/200408/08/2004412000
00301/01/196001/01/200401/04/20043 9000
00406/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;
0071021198307012008001400400150
0071201198307213009002000500200
007
007
0090903198306611007013700300000
009
009
009
0050705198307414008201300900000
0050115198208018009601402001500
0050618198207017008401400800400
0050703198306414008401400800200
;
在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;
0071021198307012008001400400150
0071201198307213009002000500200
0090903198306611007013700300000
0050705198307414008201300900000
0050115198208018009601402001500
0050618198207017008401400800400
0050703198306414008401400800200
;
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为真,其他情况下为假













  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值