SAS编程:如何确定变量最大小数位数以及应用?

(PS:文章只写了一半,留作项目讨论用,讨论部分在2.1节)

在临床项目试验中,会生成数值变量的描述性统计量的Table。各个统计量的小数位数的确定,不同的公司、不同的项目可能有不同的要求。

有的,要求统计量展示固定的小数位数;有的,要求统计量小数位数根据原数据小数位数确定

前者,直接固定统计量格式进行输出,无需特殊的处理;后者,需要获取原始数据的小数位数,进而判断输出统计量的保留位数后,进行输出。

这篇文章介绍一下,后者的处理和应用过程。

1. 小数位数确定

原始数据小数位数的确定,一般有2个来源:

第一,从保存在SPEC中的数值格式确定数据的小数位数;
第二,直接从数据集中获取数据的最大小数位数。

1.1 SPEC中的格式

SPEC中,会规定输出变量的格式,数值变量的小数位数可以从格式中获取。

SPEC信息一般保存在EXCEL中,导入SAS数据集不复杂,有的公司直接把SPEC的信息保存在特定的逻辑库中。

我以P21的SPEC为例,项目中SPEC的内容与这个类似:

P21

从SPEC中,可以获取到参数的名称、参数结果的数据类型、有效小数位数。程序中,稍加整理,不复杂就可以获得以下内容的数据集。

**Import SPEC:
options validvarname = v7;

proc import datafile="XXX_p21e_adam.xlsx" out = vlm1
    dbms =  xlsx replace;
    getnames = yes;
    sheet = "ValueLevel";
run;

**Get decimal information;
data vlm;
  set vlm1;
  where dataset = "ADLB" and data_type = "float";
  
  length paramcd $8;

  paramcd = scan(where_clause, 4, ".");
  decimal = significant_digits;

  keep dataset paramcd decimal;
run;
ADLB Decimal
1.2 从原始数据集获取小数位数

我用一个ADLB数据集进行演示:

ADLB

整个思路是,将每个Paramcd的数值检测值以best.格式Put出来,以小数点.右侧字符的长度作为该值的小数位数,取变量值中最大的小数位数值

这里有一个注意点,整数Put出来的字符是没有小数点.的,所以需要单独判断。

libname test "E:\99_Test";

proc sql noprint;
  create table decimal as
    select distinct paramcd, 
        max(case
            when index(strip(put(aval,best.)), ".")= 0 then 0
            else length(scan(strip(put(aval,best.)), 2, "."))
          end) as decimal
      from test.adlb
      where aval ne .
      group by paramcd;
quit;
ADLB Decimal

2.小数位数确定之后,如何应用?

描述性统计量的小数位数,一般的要求是:n保留整数;Max、Min与原数据小数位数一致;Mean、Median比源数据多保留1位小数;SD比源数据多保留2位小数。同时,统计量展示的最大小数位数一般不超过4位。

具体如何展示,还需要看项目中的要求,并不固定。这篇文章,以上面的要求来进行举例。

2.1 小数位数的基础应用

最基础的小数位数应用,是使用SAS的put语句,常用的方法是直接Put具体的数字格式。不过,这中处理方式在负数十分位向0进位时,可能会产生一些偏误

我用代码进行实例,对数字0.4, 0.5, -0.4, -0.49 -0.5四舍五入保留整数。使用两种方法,一种是直接put数值格式8.0;一种是使用函数Round处理之后,再put数值格式8.0

data tmp;
    input a @@;

    bput = strip(put(a, 8.0));
    bround = strip(put(round(a, 1), 8.0));
    
    datalines;
        0.4
        0.5
        -0.4
        -0.49
        -0.5
    ;
run;
Result 1

从结果中可以看到,对于-0.4-0.49这2个数值,四舍五入应该进位成0,但是直接Put时,结果是-0,与想要的结果不同。更一般的,对于(-0.5, 0)这个范围的数,Put保留整数时,结果为-0

我没细究这个现象的原因,建议大家在保留小数位数时,先使用Round函数,再put相应的格式。两个函数保留的小数位数要相同,否则会产生二次误差

2.2 单个Paramter的统计量的小数位数处理

数值变量统计量的小数位数处理,受到如何处理所有参数的影响。

以ADLB举例,分析数据集有多个数值型结果的参数。这里有两种处理方式,第一,一次对一个参数进行统计输出,其他参数依次重复;第二,将Paramter作为分组变量,一次处理所有需要分析的参数结果

对应的,小数位数保留的处理也因此不同。

先先计算出数值变量的统计量:

**Create formats for output;

**Get statitstics;
proc means data = test.adlb noprint nway;
    by trt01an ;
    where paramcd = "APTT" and aval ne .;

    var aval;

    output out = stats1 n = n_ mean = mean_ std = sd_ median = median_ min = min_ max=max_;
run;
stat1

从从面可以知道,参数的APTT的小数位数为1,按照规则,小数位数处理如下:

data stats2;
    length n mean sd median min max  $50;
    set stats1;

    n =strip(put(n_, best.));
    mean =strip(put(round(mean_, 0.1**(1+1) ), 8.2));
    sd =strip(put(round(sd_, 0.1**(1+2) ), 8.3));
    median =strip(put(round(median_, 0.1**(1+1) ), 8.2));
    min =strip(put(round(min_, 0.1**(1+0) ), 8.1));
    max =strip(put(round(max_, 0.1**(1+0) ), 8.1));

run;
stats2

工作中,我们不能直接用1来代入,这样就是Hard Coding了。我们可以将APTT的小数位数保留到宏变量中,直接在宏中进行引用。

整个过程处理如下:

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

推荐阅读更多精彩内容