楼主: Adrian2Hope
51113 138

[原创博文] 我是一名SAS程序员   [推广有奖]

11
DriftKingHan 发表于 2016-12-3 20:39:13 |只看作者 |坛友微信交流群
Adrian2Hope 发表于 2016-12-3 19:53
回复:hyquid
这位朋友,你好!JD里面说的SDTM是属于CDISC里面的内容,另外,它还有ADaM等等。关于CDISC, ...
楼主你好
我想请问一下
我现在SAS是只有base的水平,下面会进一步学习
上学时学的数学、统计等都忘的差不多了
但是想从事SAS相关的分析工作
是不是还要把数学、统计这些再拾起来才可以
还是说有对这方面要求不那么高的起步的工作呢
谢谢了

使用道具

12
Adrian2Hope 发表于 2016-12-4 19:43:36 |只看作者 |坛友微信交流群
回复:DriftKingHan。
我上面已经说得很清楚,现在有很多公司是面对高校毕业生的,同一职位有不同的leval,只要你是相关专业的,比如统计,数学,计算机,类似于理工的,只要不是特别文科的专业,条件适当的,用人单位都会认真考虑的。希望你成功!
另外,朋友们有什么问题想问我的话,如果我回答过,可以参考之前的。如果没有,可以在这里发问,也可以私信我。
我不太喜欢那样直接在后面点击回复的,那样整帖子看起来不整齐。

使用道具

13
Adrian2Hope 发表于 2016-12-8 16:28:31 |只看作者 |坛友微信交流群
2. many-to-many merge:
在SDTM中,EX domain是存放exposure信息的,SV domain是放subject visit信息的。大多数时候,我们需要将EX中的dose date定位在哪个visit,因而这是需要和SV merge的。现假设:EX中的数据是每条subject有多条dosing record(exstdtc=2012-08-12T09-45, exstdtc=2013-9...),一条对应一个日期/时间,SV中的数据是每个subject有多个visit(visitnum=1, visit=screening, svstdtc=2013-05-15, svendtc=2013-06-12; visitnum=2, visit=run-in, svstdtc=2013-06-13, svendtc=2013-6-20...)。
通过sql能解决这样的问题。

**** 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,所以尽可能只选择一些只要处理变量,这样也不容易出错。

使用道具

14
Adrian2Hope 发表于 2016-12-8 16:43:19 |只看作者 |坛友微信交流群
2. many-to-many merge:
在SDTM中,EX domain是存放exposure信息的,SV domain是放subject visit信息的。大多数时候,我们需要将EX中的dose date定位在哪个visit,因而这是需要和SV merge的。现假设:EX中的数据是每条subject有多条dosing record(exstdtc=2012-08-12T09-45, exstdtc=2013-9...),一条对应一个日期/时间,SV中的数据是每个subject有多个visit(visitnum=1, visit=screening, svstdtc=2013-05-15, svendtc=2013-06-12; visitnum=2, visit=run-in, svstdtc=2013-06-13, svendtc=2013-6-20...)。
通过sql能解决这样的问题。

**** 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;

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,所以尽可能只选择一些只要处理变量,这样也不容易出错。
大家好,我是团长。

使用道具

15
Adrian2Hope 发表于 2016-12-14 18:11:54 |只看作者 |坛友微信交流群
1. 分类数据中的缺失值和0意义很不同
如果某个分类变量的值为缺失值,这说明这个值的结果是不知道的,这条观测不会纳入分析人群和分母的计算;而如果它的值是0,这说明结果是已知的,此时0会对应一个相应的临床意义,同时纳入分析和分母人数的计算。
比如说:考察疗后病人对药物的有效反应率。1=有效,0=无效,这里的有效和无效可依据相应的医学指标来判定。很显然,如果某个病人的反应变量值为1,那说明治疗是有效的,反之,如果为0,则药物无效。但如果数据收集不完全(比如病人失访,关键指标缺失等)而导致无法判定时,那出现缺失值,而不应该是0。
从描述性统计和推断性分析角度看疾病死亡率。
1=死亡,0=没有死亡。如果有几个人的死亡情况从0变为缺失值,也就是不确定,各组(如治疗组,对照组)中变量值为1的类由于分母变小而total percenage值变大,检查相关统计量的p值,发现以前有统计学意义的变得没有统计学意义,治疗组会降低死亡率变成两组药物治疗效果没有统计上区别。
在实际的临床试验中,缺失值非常常见,有的时候是data issue。不过不用担心,在项目的各种文件中会规定缺失值的处理方法,同时在编程的同时注意程序的严密性。

使用道具

16
Adrian2Hope 发表于 2016-12-15 10:29:53 |只看作者 |坛友微信交流群

Performing Many-to-Many Comparions/Joins

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;

tips:
1. sql能处理非常复杂的merge,写法体现在select...on...语句上。
2. 这里要找出的是哪些CM会落在对应这个人的AE中,因而on条件语句的写法异常重要,大家可以画个时间轴图来帮助理解。
3. missing start and stop dates在临床试验数据中很常见,这会带来处理难度,因而在写程序的时候要认真看specification,仔细推敲并验正逻辑的正确性。
4. 谨记遇到多对多的时候,首选sql。
本例是在某书上抄来的,觉得好,所以共享上来。
大家好,我是团长。

使用道具

17
Adrian2Hope 发表于 2016-12-15 12:04:18 |只看作者 |坛友微信交流群

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;

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lovexialulu + 1 + 1 + 1 对论坛有贡献

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

大家好,我是团长。

使用道具

18
Adrian2Hope 发表于 2016-12-15 17:34:27 |只看作者 |坛友微信交流群
在给这个帖子起名字的时候,我纠结了一番。现在做一些基本说明。

正如标题所指出的,我是一名医药行业SAS程序员。诚然,我首先是个程序员,但需要特别强调的是,因为只是略懂了点SAS,然后才做起了SAS程序员。据目前我所了解的,我同学进银行的多,也有读博的,也有当老师的。关于我们这个就业的,没有做过统计,只知道一些要好朋友的情况。可以毫不夸张的说,我完全是走偏了。我的专业是数量经济学,但因为在实习阶段误打误撞进入这个行业,然后几年下来,想出来也出来不了了。“千不该,万不该”学那个SAS!当时我们学的是SPSS,但我本人“要求上进”,觉得学门技术吧,以后总不至于饿死。就这样,在学校阶段参加了那个SAS公司的Base和Advance考试。因为是学生,所以拿得到discount。Base比较顺利,Advance我连考两次竟然都差一点点。算下加上打印资料什么的,快花了3000块吧。我感到很泄气,为什么老失败。后来仔细一想,我完全是为了考试而考试,准备时间也短,心态很出问题。后来想通了,无所谓了。去找工作去吧。谁知道,在网上一投,非常多的公司说可以来实习呀,基本上面一个准一个,无非就是比较和选择。关于考试这块,坛子里信息很多,我就不废话了。现在回想起当初的考试,觉得自己当时的执着有点搞笑。我就是为了完美和好看,总觉得两个总比一个好!关于对SAS的学习,多用多想多查才是根本,才是王道。另外,如果学习没劲的话,可以花钱逼自己学啊,我当初就是这样想的。哎呀,钱都花了,好吃好喝好玩的都省了,这书还不得看点啊,要不,你对得起自己么?人生呐,如果有那么一段日子让你过的特别地难受,特别地孤独,那就是说明你在进步了!

进了这个行业才知道,原来,医药行业还有这个类啊。对大多数普通人来说,医药也只有自己生病了,住院了,才想起来需要吃药,才想起来我们除了食品来填饱肚子之外,还需要有药品来保护自己不让生病,不是有一个有关部门叫“国家食品药品监督管理局”嘛!

上面那个部门就是这个行业的权力机关,有对某个上市新药的生杀予夺大权。由于所涉猎的行业跨度很小,我只能在有限的范围内对一些环节,步骤做个基本说明,如有不妥,还望海涵!
大家好,我是团长。

使用道具

19
Adrian2Hope 发表于 2016-12-15 17:36:03 |只看作者 |坛友微信交流群
一般来说,SAS程序员并不会运用像C,JAVA,C++…类似这样的编程语言,我们只是在特定的环境,特定的平台写程序,我们编程生成的结果是数据集、图、表或其他一些文字性的东西。所以,在向别人介绍自己工作的时候,经常会被误解的。啊?IT啊!是不是经常加班?你说做统计的话,是不是统计卖了多少药?那既然你不是做销售卖药的话,想象不到你是干什么的?反正关于这个话题吧,很有趣。做技术有时候挺怪怪的,别人在那边说起工作口沫横飞,口若悬河,我们插不上话,也没人懂我们做什么。所以,玩技术的朋友们,做人不能太闷了哦。

一个药物,并不是公司一经研发出来,马上就可以批量生产和对外销售的,它必须经过严格的临床试验,被一步步证明是安全的,是有效的,才可能会被ZF批准,才会上市。这一过程投资巨大,风险巨高。当然利润与之伴随。接下来,我会在帖子里贴点GCP的知识,让感兴趣的朋友循序渐进的了解它,认识它。
大家好,我是团长。

使用道具

好的 洗耳恭听

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 15:26