回复:hyquid
这位朋友,你好!JD里面说的SDTM是属于CDISC里面的内容,另外,它还有ADaM等等。关于CDISC,内容极其丰富!另外,对于只做global项目的sas programmer来说,对CDISC里面的各项内容足够了解那是必须的!local就不一定了。所以,你说的proc cdisc,可能是误读了。
关于面试,首先要看面试者的条件和经验,针对不同的情况,会有不同的面试要求。
具体到你的话,非统计,没经验,这很正常,完全没有任何问题。只是在面试的时候实话实话就足够了。他们肯定会问你做过什么,可能会有考试(上机,做题)。不会可以学啊,这有什么可担心的呢?
so, just go for it without hesitate!
另外,有朋友加我好友,我这边权限比较低,加不了。但这不妨碍大家在这里交流讨论哈。欢迎大家没事就进来坐坐!
**** Use Proc SQL for many-to-many merge.;
**** Assign dose date to a specific visit window by comparing to visit start and visit stop date.;
proc sql;
create table exvisit as
select distinct ex.usubjidn, exstdtn, visitnum, svstdtn, svendtn
from ex left join sv
on ex.usubjidn = sv.usubjidn and svstdtn le exstdtn le svendtc
order by ex.usubjidn, exstdtn
;
quit;
tips:
1). 像--STDTC, --ENDTC是标准的CDISC变量,是字符型的,如果要涉及到日期数值的比较,肯定是要先转化为可比较的数值型变量。因为日期时间很多是不完整的,所以可能会用到calculation algorithm,这就看specification中么规定了。
2). EX中总有某个date不落入某个visit,有些computation会define visit window。比如visitnum=2这一天的前后3天都算是visit是等于2的。
3). 由于sql overlap value,所以尽可能只选择一些只要处理变量,这样也不容易出错。
**** Use Proc SQL for many-to-many merge is required.;
**** Assign dose date to a specific visit window by comparing to visit start and visit stop date.;
proc sql;
create table exvisit as
select distinct ex.usubjidn, exstdtn, visitnum, svstdtn, svendtn
from ex left join sv
on ex.usubjidn = sv.usubjidn and svstdtn le exstdtn le svendtc
order by ex.usubjidn, exstdtn
;
quit;
The following program defines the two data sets and joins them with PROC SQL so that you get all medications taken during any specific adverse event.
**** MERGE/JOIN ADVERSE EVENTS WITH CONCOMITANT MEDICATIONS.
**** KEEP MEDICATIONS THAT STARTED OR STOPPED DURING AN ADVERSE
**** EVENT OR ENTIRELY SPANNED ACROSS AN ADVERSE EVENT.;
proc sql;
create table ae_meds as
select a.subject, a.ae_start, a.ae_stop,
a.adverse_event, c.cm_start, c.cm_stop,
c.conmed from
aes as a left join conmeds as c
on (a.subject = c.subject) and
( (a.ae_start <= c.cm_start <= a.ae_stop) or
(a.ae_start <= c.cm_stop <= a.ae_stop) or
((c.cm_start < a.ae_start) and (a.ae_stop < c.cm_stop)));
quit;
3. Redefining a Variable within a DATA Step
在merge数据集的同时derive新的变量容易出现“易想不到”的问题。我曾经就碰到过,明明if...then...写的很清晰,字符型变量值的也严格和数据集里面的值完全一样,但就是得不到正确的结果,后来不为省事分两个data步写,先完成merge,然后再derive。这是最保险的一种方法,当然是正确的。其实这里忽视了一个问题:在data步里面通过merge, set, update语句产生一个变量的时候,sas会自动"Retain"所有衍生变量值。在sas base相关资料里面会详有细说明类似PDV这样的概念。所以容易出现这样的情况:不仅满足条件的那条record result是赋予的新值,而且其他在同一个by group里面的也是这值,你当然不是你想要的。我们可以用rename在一个data step里面处理。
reference code:
**** FLAG EVENTS THAT RESULTED IN DEATH;
data aes;
merge death(rename = (death = _death)) aes;
by subject;
**** DROP OLD DEATH VARIABLE.;
drop _death;
**** CREATE NEW DEATH VARIABLE.;
if adverse_event = "Fatal MI" then
death = 1;
else
death = _death;
run;