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为真,其他情况下为假
阅读全文
0 0
- sas统计分析学习笔记(五)
- sas统计分析学习笔记(一)
- sas统计分析学习笔记(二)
- sas统计分析学习笔记(三)
- sas统计分析学习笔记(六)
- sas统计分析学习笔记(九)——方差分析
- SAS学习(五)
- SAS统计分析学习笔记(七)——相关和简单回归分析
- SAS统计分析学习笔记(八)——T检验和非参数比较
- SAS学习笔记(五)——关于样本划分
- SAS学习笔记(一)
- SAS学习笔记(二)
- sas 学习笔记(1)
- sas 学习笔记(2)
- SAS学习笔记(一)
- SAS学习笔记(二)
- SAS学习笔记(三)
- SAS学习笔记(四)
- R语言读取xlsx文件
- Spring Boot 热部署
- 常用命令总结
- 数据挖掘中的关联规则
- Android中常见的内存泄漏汇总
- sas统计分析学习笔记(五)
- MAC上读出usb
- Lucene搜索引擎+HDFS+MR完成垂直搜索
- 匈牙利算法
- Flask-hello程序
- Super Jumping! Jumping! Jumping!
- 今天写了一条把我两个月职业生涯学到的SQL知识全用上了的语句
- 关闭服务器windows server的IE浏览器的增强安全配置
- 文本相关性排序