Sas 如何总结不同年龄组的疾病数量?

Sas 如何总结不同年龄组的疾病数量?,sas,Sas,我有多发病患者的数据集。这些疾病在不同的时间点发展 ID time_ enrolled Baseline_age dis1 dis1_time dis2 dis2_time dis_3 dis3_time 1 2005.5 35 1 2010.7 1 2012.1 0 2015.3 2 2004.3 49 0 2011.3 1 2013.8 0

我有多发病患者的数据集。这些疾病在不同的时间点发展

ID  time_ enrolled   Baseline_age dis1 dis1_time dis2 dis2_time dis_3 dis3_time
1     2005.5           35         1     2010.7    1     2012.1   0     2015.3
2     2004.3           49         0     2011.3    1     2013.8   0     2017.9
...
我总结了每个基线年龄组30-39岁、40-49岁等人群中患有一种、两种或三种疾病的比例。现在,我想统计一下,例如,在40-49岁时,患有一种、两种或三种疾病的人数。这个比例就是他们在这个年龄段代表所有人的比例。
首先,我想计算他们患上最后一种疾病时的最大年龄,但随后年轻年龄组的类别将为空,老年年龄组的类别也将为空,例如,如果一个人在70岁之前患上了所有疾病。有没有人想过我该如何处理这个问题?我使用SAS进行编程。

有几个注意事项:

  • 当数据被转换成一个高而薄的结构时,处理更容易
    • 每个id/疾病标志一行
  • 在某些情况下,该人的年龄范围可能存在“差距”
    • 例:20-29岁的疾病,接下来是40-49岁的疾病
      这对我来说是30-39岁年龄段疾病的隐性零计数。在计算所有ID中30-39种疾病的比例时,这一隐式方法非常重要(并且应该加以考虑)
    • 当年龄的标准值用于一定范围内的年龄时,很容易填补“空白”。可以使用自定义格式和自定义信息计算“标准”值
    • 仅应在登记日期和最后一个疾病日期之间的年龄段添加空白的虚拟记录
接近

  • 为每个id和注册年龄转置年龄和标志
  • 使用
    方法
    对每个id年龄(标准化)的标志进行求和,以获得年龄范围内并发疾病的计数
  • 左连接交叉连接ID和年龄,用于填充间隙
  • 再次使用
    方法
    计算年龄和年龄*flag\u计数
  • 使用
    DATA
    步骤计算计数的比例[年龄*标志计数]/[年龄]
示例代码

* custom format and informat for standardizing age;

proc format;
  value agegrp
    20-29 = '20-29'
    30-39 = '30-39'
    40-49 = '40-49'
    50-59 = '50-59'
    60-69 = '60-69'
    70-79 = '70-79'
    80-89 = '80-89'
    90-high = '90 + '
  ;
  invalue agegrp
    '20-29' = 20
    '30-39' = 30
    '40-49' = 40
    '50-59' = 50
    '60-69' = 60
    '70-79' = 70
    '80-89' = 80
    '90 + ' = 90
  ;
run;

* generate some sample data;

data have;
  call streaminit(123);
 
  do id = 1 to 10000;
    enrolled = '01jan2000'd + rand('integer', 1, 3650);
    age = 20 + rand('integer', 59);

    flag1 = rand('uniform') < 0.25;
    date1 = enrolled + rand('integer',2500);

    flag2 = rand('uniform') < 0.25;
    date2 = date1 + rand('integer',2500);

    flag3 = rand('uniform') < 0.25;
    date3 = date2 + rand('integer',2500);

    output;
  end;
  format enrolled date: yymmdd10. flag: 1.;
run;

* compute age at each disease flag time point;

data stage1;
  set have;
  
  age1 = age + intck('year', enrolled, date1);
  age2 = age + intck('year', enrolled, date2);
  age3 = age + intck('year', enrolled, date3);
run;

* parallel array based transposition of ages and flags;

data stage2;
  set stage1;

  * map age in range to first value in range;
  * need for later when creating zero counts for intermediate age ranges not in data;
  * counts of zero counts needed to compute proportion;

  enroll_age = input(put(age,agegrp.),agegrp.);

  age = input(put(age1,agegrp.),agegrp.); flag = flag1; output;
  age = input(put(age2,agegrp.),agegrp.); flag = flag2; output;
  age = input(put(age3,agegrp.),agegrp.); flag = flag3; output;

  keep id enroll_age age flag;
  format enroll_age age 4. flag 1.;
run;

ods listing;

* compute number of simultaneous diseases in age range;

proc means noprint nway data=stage2;
  class id enroll_age age;
  format enroll_age age agegrp.;
  var flag;
  output out=stage3(drop= _type_ _freq_) sum=flag_count;
run;

* data for cross join;

data all_ages;
  do age = 20 to 90 by 10;
    output;
  end;
  format age agegrp.;
run;

* combine all_ages with each id so as to get a zero count
* for a range not present between enroll_date and max date;

proc sql;
  create table stage4 as
  select ids.id, ages.age, coalesce(stage3.flag_count,0) as flag_count
  from
    ( select distinct id from stage3 ) as ids
  cross join 
    all_ages as ages
  left join 
    stage3
    on ids.id = stage3.id and ages.age = stage3.age
  group by
    ids.id
  having
    ages.age between min(stage3.enroll_age) and max(stage3.age)
  order by
    ids.id, age
  ;
quit;

* compute counts;

proc means noprint data=stage4;
  class age flag_count;
  output out=stage5 N(id)=;
  types age age*flag_count;
run;

* compute proportions;

data want;
  merge
    stage5 (where=(_type_=2) rename=_freq_=age_freq)
    stage5 (where=(_type_=3) rename=_freq_=flag_count_freq)
  ;
  by age;

  age_flag_count_proportion = flag_count_freq / age_freq;

  format age_flag_count_proportion percent5.;

  keep age flag_count age_freq flag_count_freq age_flag_count_proportion;
  format flag_count 1.;
run;
*用于标准化年龄的自定义格式和信息;
proc格式;
价值agegrp
20-29 = '20-29'
30-39 = '30-39'
40-49 = '40-49'
50-59 = '50-59'
60-69 = '60-69'
70-79 = '70-79'
80-89 = '80-89'
90高='90+'
;
无效年龄组
'20-29' = 20
'30-39' = 30
'40-49' = 40
'50-59' = 50
'60-69' = 60
'70-79' = 70
'80-89' = 80
'90 + ' = 90
;
跑
*生成一些样本数据;
有数据;
调用streaminit(123);
do id=1至10000;
登记='2000年1月1日'd+兰特('integer',13650);
年龄=20+兰特('整数',59);
flag1=兰特(‘统一’)<0.25;
日期1=登记+兰德('integer',2500);
flag2=兰特(‘统一’)<0.25;
date2=date1+rand('integer',2500);
flag3=兰特(‘统一’)<0.25;
date3=date2+rand('integer',2500);
产出;
结束;
格式报名日期:yymmdd10。国旗:1。;
跑
*计算每个疾病标志时间点的年龄;
数据阶段1;
集有;
年龄1=年龄+intck('年',登记,日期1);
年龄2=年龄+intck('年',登记,日期2);
年龄3=年龄+intck('年',登记,日期3);
跑
*基于并行数组的年龄和标志转换;
数据阶段2;
设置阶段1;
*将范围内的年龄映射到范围内的第一个值;
*在为数据中未包含的中间年龄段创建零计数时,需要稍后进行修改;
*计算比例所需的零计数计数;
enroll_age=输入(put(age,agegrp.),agegrp.);
年龄=输入(放(年龄1,年龄组),年龄组);flag=flag1;产出;
年龄=输入(放(年龄2,年龄组),年龄组);flag=flag2;产出;
年龄=输入(放(年龄3,年龄组),年龄组);flag=flag3;产出;
保留id注册年龄标志;
格式注册年龄为4岁。旗帜1。;
跑
ods清单;
*计算年龄范围内同时发生疾病的数量;
proc表示noprint nway data=阶段2;
班级id注册年龄;
格式注册\年龄agegrp。;
var标志;
输出=阶段3(下降=\类型\频率\总和=标志\计数;
跑
*交叉连接数据;
所有年龄段的数据;
do年龄=20至90岁乘以10岁;
产出;
结束;
格式化agegrp。;
跑
*将所有年龄与每个id合并,以获得零计数
*注册日期和最大日期之间不存在的范围;
proc-sql;
将表stage4创建为
选择ids.id、ages.age、coalesce(stage3.flag\u count,0)作为flag\u count
从…起
(从阶段3中选择不同的id)作为id
交叉连接
所有的年龄都是年龄
左连接
阶段3
在ids.id=stage3.id和ages.age=stage3.age上
分组
id.id
有
年龄。最小值(阶段3.登记年龄)和最大值(阶段3.年龄)之间的年龄
订购人
id.id,年龄
;
退出
*计算计数;
proc表示noprint data=stage4;
班级年龄标志计数;
输出=阶段5 N(id)=;
类型年龄*标志计数;
跑
*计算比例;
数据需求;
合并
阶段5(其中=(类型=2)重命名=\频率\年龄\频率)
阶段5(其中=(类型=3)重命名=\频率\标志\计数\频率)
;
按年龄划分;
年龄\标志\计数\比例=标志\计数\频率/年龄\频率;
格式年龄\标志\计数\比例百分比5。;
保持年龄标志\计数年龄\频率标志\计数\频率年龄\计数\比例;
格式化标志\u计数1。;
跑
示例输出数据


非常感谢你,Richard,我想知道是否有可能同时调整性别和地区的比例?很可能,这取决于你所说的调整是什么意思,以及在考虑到两个额外的分类变量性别和地区的情况下,你打算如何划分你的人口。您可能需要为性别和地区创建其他格式和信息。谢谢Richard的解释。另一个问题是,如果我们想找出每个年龄组中患有不同疾病组合的人的比例,我们如何总结?再次,我总结了基线年龄,但现在我想计算一下,例如,在40-49岁患有疾病1+疾病2等的人数,比例为