我如何通过 ID 识别一列中的三个最大值并取它们的平方然后将它们添加到 SAS 中?

How can I identify three highest values in a column by ID and take their squares and then add them in SAS?

我正在研究伤害严重程度评分 (ISS),我的数据集有以下四列:ID、High_AIS、Dxcode(诊断代码)、ISS_bodyregion。每个 ID/case 都有多个“dxcode”值以及相应的 High_AIS 和 ISS_bodyregion - 这意味着每个 ID/case 在不同的 body 区域有多处受伤。计算 ISS 的规则指定我们必须 select 三个不同 ISS body 区域

的 AIS 值

对于一些ID,我们只有一个值(当然当一个人只有一次受伤和一个相关的dxcode和AIS时)。我的目标是计算 ISS(范围从 0-75),为了做到这一点,我想告诉 SAS 以下内容:

  1. Select三个ID最大的AIS值(当然当ID有超过3个AIS值时),取它们的平方并相加得到ISS。
  2. 如果ID只有一处受伤且AIS = 6,则ISS将自动等于75(无论其他地方是否受伤)。
  3. 如果ID的AIS值少于3个(比如第5个ID只有两个AIS值:0和1),那么只考虑两个,将它们平方并相加,因为我们没有第三个严重的ISS body 此 ID 的区域。
  4. 如果ID只有3个AIS(比如1,0,0)那么就只考虑三个,即使是ISS=1也把它们平方相加。
  5. 如果 ID 的所有伤害和 AIS 值都等于 0(例如:0,0),那么 ISS 将等于 0。
  6. 如果ID有多处受伤,AIS值为:2,2,1,1,1,ISS_bodyregion = 5,5,6,6,6。然后我们看到ISS_bodyregion重复自己,说明提示我们只selectISS最高AIS值body区域只一次,因为它有来自不同的 ISS body 区域。因此,在这种情况下,我想告诉 SAS,如果 ISS_bodyregion 重复自身,则只 select 具有最高 AIS 值的那个,其余的保留。

我很困惑,因为我告诉 SAS 考虑所有这些上述注意事项,我似乎无法将它们全部放在一个代码中。非常感谢你提前。我已经按 ID 降序 high_AIS.

对我的数据进行了排序

因此,如果您要尝试实施此算法 https://aci.health.nsw.gov.au/networks/institute-of-trauma-and-injury-management/data/injury-scoring/injury_severity_score,那么您需要这样的数据:

data have;
  input id region :. ais ;
cards;
1 HEAD/NECK   4 
1 HEAD/NECK   3
1 FACE        1 
1 CHEST       2 
1 ABDOMEN     2
1 EXTREMITIES 3
1 EXTERNAL    1
2 ABDOMEN     3
3 FACE        1
3 CHEST       2
4 HEAD/NECK   6
;

所以首先找到每个区域每个 id 的最大值。例如通过使用 PROC SUMMARY.

proc summary data=have nway;
  class id region;
  var ais;
  output out=bodysys max=ais;
run;

现在按 ID 和 AIS 订购

proc sort data=bodysys ;
  by id ais ;
run;

现在可以按ID处理,将AIS分数累加到一个数组中。您可以使用 MOD() 函数循环遍历数组,以便每个 ID 的最后三个观察值将是数组中剩余的值(跳过第一个子集到每个 ID 三个观察值的需要)。

data want;
  do count=0 by 1 until(last.id);
    set bodysys;
    by id;
    array x[3] ais1-ais3 ;
    x[1+mod(count,3)] = ais;
  end;
  iss=0;
  if ais>5 then iss=75;
  else do count=1 to 3 ;
    iss + x[count]**2;
  end;
  keep id ais1-ais3 iss ;
run;

结果:

Obs    id    ais1    ais2    ais3    iss

 1      1      2       3       4      29
 2      2      3       .       .       9
 3      3      1       2       .       5
 4      4      6       .       .      75