在临床试验中,实验室指标的分析通常涉及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编程处理中,关键点有两个:
- Standard Units值向Conventional Units的换算。
- 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有两个值,AVAL
,AVALC
,前者表示数值型分析值,后者表示字符型分析值。对于收集的实验室检查的缩写LBSTSTCD
,如果对应的是传统单位的分析值,paramcd = lbststcd
; 如果是标准单位的分析值,paramcd = lbststcd||"C"
。在这个项目中,如果有一些实验室指标收集的内容是包含>
、<
符号的,AVAL
会直接去掉符号,保留数值(aval = input(compress(lbscresc,'<>'), best.);
)。
以上就是ADLB中Standard Units和Conventional Units的编程处理。
若有疑问,欢迎评论区交流!