计算年龄的SAS宏程序
2008-12-21
分类:医学统计
正文在临床试验中,使用sas计算受试者的年龄,大体上有两种三种思路:
一种是计算当前日期(应该是受试者签署知情同意书的那一天)与受试者生日相差有多少天,然后除以365.25即为年龄值(我把它叫做计算法),另一 种思路是,根据当前的月、日进行判断,当前月份比出生月份大的,或月份相同但当前日等于或大于出生日的情况,年龄即为当前年份与出生年份之差,否则,年龄 是上述差-1,这种方法计算的是整数周岁(我称之为判断法,呵呵),而第一种方法如果不对结果取整的话,年龄是带有小数位的。
第三种方法也是计算周岁,实现方法更为简单,结果与第二种方法是一致的。具体的代码见文后的补充。
根据上述两种方法计算出来的年龄,大多数情况下应该是一致的,但也有例外。
我用999组数据做了一个测试,利用上述两种计算方法得出的结果,有1组数据是不同的。
birthday: 1950-02-07,today: 2008-02-07
第1种计算方法得出的年龄是:57岁,第2种计算方法得出的年龄是58岁。
我测试用的数据在这:age_data.txt,导出程序是这个:age_import.sas
下面是具体的SAS代码
第二种方法,我把它写成了宏程序,如下:
%macro age_caculation(birthday,today,dataset,output);
data &output;
set &dataset;
year = year(&today)-year(&birthday);
if month(&today) gt month(&birthday)
or month(&today) eq month(&birthday) and day(&today) ge day(&birthday)
then age = year(&today)-year(&birthday);
else age = year(&today)-year(&birthday) - 1;
keep &birthday &today year age;
run;
%mend;根据测试数据,代入相应的参数:
%age_caculation(birthday,today,exec.age,age2);
得到了数据集age2
然后是第一种方法:
data tmp;
set age2;
age2=(mdy(month(today),day(today),year(today))-mdy(month(birthday),day(birthday),year(birthday)))/365.25;
age2=datdif(birthday,today,’actual’)/365.25;
age3=int(age2);
check = age3-age;
run;
因为要测试两种计算方法得到的结果是否完全一致,所以加了一个check 。
最后运算的结果,就是上面提到的,出现了一组不相同的结果。
此前从没想过,年龄的计算问题,竟然挺有意思。个人认为,如果做年龄的数据核查,应该采用第二种方法,即判断法,因为这种方法得到的周岁年龄是最准确的,如果是进行人口学特征分析,采用第一种直接计算的方法比较好,因为它(不对结果取整)更“真实”地反映了受试者的年龄。
补充:刚刚看了dmcookies提供的宏,实现方法更为简单,代码如下:
%macro age (birth,ref) ;
%* One line exact age calculation due to Billy Kreuter (SAS-L) ;
%* Use it as function where functions can be used, e.g. DATA step;
%* ex: age = %age ( birth , today() ) ;
int((intck('month',&birth,&ref)-(day(&birth)>day(&ref)))/12)
%mend age ;
在这个宏里,就一个语句,通过INTCK(interval,from,to)函数计算从birth到ref间隔的月数,然后再通过一个判断确定是否要减1,最后除以12、取整,很好很简单!
还有没有其它的方法啦?呵呵
总结:计算年龄的通用宏
计算周岁
%macro age (birth,ref) ;
int((intck('month',&birth,&ref)-(day(&birth)>day(&ref)))/12)
%mend age ;
计算年龄(不取整)
%macro age (birthday,today) ;
datdif(birthday,today,'actual')/365.25;
%mend age ;
转载原创文章,请注明:转载自益药,益友-Medleaf的医药博客[http://www.cnmed.net/blog/]
本文链接地址:http://www.cnmed.net/blog/2008/sas-macro-age-caculation.html


RSS 订阅我的博客













暂时没有人发言