SAS编程:ADLB中Standard Units和Conventional Units的处理

在临床试验中,实验室指标的分析通常涉及Standard Units和Conventional Units。ADLB数据集的设计基于统计师给出的TFL Shell,在Shell中,某些指标会展示Standard Units和Conventional Units两种分析结果。考虑上这一点,ADLB的SAS编程中会有对应的处理。

不同的项目中,实验室指标数据收集的内容可能有所区别,有的项目可能只收集了Standard Units值,有的可能同时收集了Standard Units和Conventional Units值。对于前者,要展示Conventional Units结果的分析,编程中需要对LB中的记录进行处理新生成一条记录,这里的处理还涉及与保存单位换算系数的数据集拼接以及对应的计算。对于后者,需要先判断收集到的Conventional Units是否与TFLShell中展示的一致,不一致的话依旧需要进行换算。

ADLB编程处理中,关键点有两个:

  1. Standard Units值向Conventional Units的换算。
  2. LB中收集的Standard Units和Conventional Units值通常是在一条记录中,所以需要判断对应记录是否需要生成Conventional Units的记录,若是,需要将一条记录Derive成两条;

单位换算中,有以下这些步骤:

  • 判断收集的Conventional Units是否与TFL Shell中一致(TFL Shell具体的变量信息通常保存在VLM_SPEC 中);
  • 保留不一致变量的信息,以便后续程序条件判断;
  • 与保存换算信息的数据集拼接,进行单位换算。

可以参考以下代码:

proc sql noprint;
 *Slect the inconsistent conventional units;
  create table inconu as
    select a.*, b.lborresu
    from conu_lb as a
      inner join
      conu_vlm as b
    on a.lbststcd = b. lbststcd
    where a.lbscresu ne b.lborresu

*Save Testcd with inconsistent units into macro var;
  select distinct quote(strip(lbststcd)) into: inconu separated by ", "
    from inconu;

*Get convfact and convunit from CONVUNIT datasets;
  Create table adlb2 as
    select a.*, b.convfact, b.convunit
    from adlb1 as a
      left join
    CONVUNIT as b
    on a.lbststcd = b.sasname
    order by usubjid;
quit;

%put &incou;

*Convert values;
data adlb3;
  set adlb2;
  if lbtestcd in (&incou.) then do;
    if lbstresn ne . then do;
      lbscresn=round(lbstresn * convfact, 0.01);
      lbscresc=strip(put(lbscresn));
    end;

    if lbstnrlo ne . then lbscnrlo=strip(put(lbstnrlo*convfact, 8.2));
    if lbstnrhi ne . then lbscnrhi=strip(put(lbstnrhi*convfact, 8.2));
  end;
run;

对以上代码做几点说明。单位转换是Standard Units向Conventional Units的转换;不同公司收集的变量名称不同是很常见的,lbststcd是这个项目中TESTCD的值,lbscresu保存Conventional Units;在VLM_SPEC中,lborresu保存Conventional Units;在系数数据集中,sasname保存TESTCD值, convfact保存具体的系数值,convunit保存转换后的Conventional Units;除了换算分析值,对应的参考值区间范围也要进行换算。

关于保留不一致变量的信息,以便后续程序条件判断的代码,使用了Quote函数,具体介绍可以参考这篇文章,SAS编程:Quote函数的应用

第2个关键点,生成具体的Paramcd记录。这个Paramcd因分析值的类型总共分为3类,分别是标准单位数值型,传统单位数值型以及字符型。编程的思路是,对3类分析值分别处理,生成对应的Paramcd。分类信息,一般保存在Adam_VLM_SPEC中。

可以参考以下代码:

*Get LBTESTCD for conventional unit records, standard unit records and character records;
proc sql noprint;
  *Conventional unit;
  select distinct quote(strip(lbststcd)) into : con_lst separated by ", "
    from adam_vlm_spec
    where domain = "ADLB" and strip(wherevalue)=stirp(lbststcd)||"C" and variable_name="AVAL";
    
  *Standard unit;
  select distinct quote(strip(lbststcd))  into : si_lst separated by ", "
    from adam_vlm_spec
    where domain="ADLB" and strip(wherevalue)=stirp(lbststcd) and variable_name="AVAL";

  *Character;
  select distinct quote(strip(lbststcd))  into : si_lst separated by ", "
    from adam_vlm_spec
    where domain="ADLB" and strip(wherevalue)=stirp(lbststcd) and variable_name="AVALC";
quit;

%put con_lst = &con_lst;
%put si_lst = &si_lst;
%put char_lst = &char_lst;

*Derive Paramcd;
data adlb4;
  set adlb3;
  length paramcd $8.;

  *Conventional Unit;
  if lbscresc ne "" and lbststcd in (&con_lst) then do;
    paramcd = stirp(lbststcd)||"C";
    aval = input(compress(lbscresc,'<>'), best.);
    anrlo = input(lbscnrlo, best.);
    anrhi = input(lbscnrhi, best.);
    output;
  end;

  *Standard Unit;
  if lbstresc ne "" and lbststcd in (&si_lst) then do;
    paramcd = stirp(lbststcd);
    aval = input(compress(lbstresc,'<>'), best.);
    anrlo = input(lbscnrlo, best.);
    anrhi = input(lbscnrhi, best.);
    output;
  end;

   *Character result;
   if lbstresc ne "" and lbststcd in (&char_lst.) then do;
      paramcd = lbststcd;
      avalc = strip(lbstresc);
      output;
    end;
run;

对代码做一些说明。在adam_vlm_spec中,变量variable_name有两个值,AVALAVALC,前者表示数值型分析值,后者表示字符型分析值。对于收集的实验室检查的缩写LBSTSTCD,如果对应的是传统单位的分析值,paramcd = lbststcd; 如果是标准单位的分析值,paramcd = lbststcd||"C"。在这个项目中,如果有一些实验室指标收集的内容是包含><符号的,AVAL会直接去掉符号,保留数值(aval = input(compress(lbscresc,'<>'), best.);)。

以上就是ADLB中Standard Units和Conventional Units的编程处理。

若有疑问,欢迎评论区交流!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容