【发布时间】:2016-03-27 16:06:50
【问题描述】:
在处理实验室数据时,我想在按治疗分组并按时间点排序的箱线图上叠加数据点的子集。在 SAS 中将所有元素组合在一起并不简单,需要一种我自己无法设计或发现的巧妙方法:)
所需图的美妙之处在于它显示了 2 种不同类型的异常值:
- 箱线图包括统计异常值 - 方形标记 (1.5 IQR)
- 然后覆盖“正常范围”异常值的标记 - 临床定义,特定于每个实验室测试。
在对数据进行分组(例如,按治疗)然后按另一个变量(例如,时间点)进行分组或分类时,这很困难。 SAS 在内部确定箱线图的间距,因此对于覆盖的正常范围数据标记,这种间距很难模拟。在这个方向上的通用解决方案将是一个不可靠的组合。
我在下面演示了这种手动模拟重叠标记的组分离的方法——只是为了给出一个意图的概念。正如预期的那样,正常范围异常值与箱线图组不对齐。此外,同时满足异常值标准(统计和临床)的数据点显示为单独的点,而不是带有重叠标记的单个点。我的绿色注释:
是否有一种简单、可靠的方法来指示 SAS 在箱线图上叠加分组数据点,让所有内容都按预期对齐?
这是重现该错误的代码:
proc sql;
create table labstruct
( mygroup char(3) label='Treatment Group'
, myvisitnum num label='Visit number'
, myvisitname char(8) label='Visit name'
, labtestname char(8) label='Name of lab test'
, labseed num label='Lab measurement seed'
, lablow num label='Low end of normal range'
, labhigh num label='High end of normal range'
)
;
insert into labstruct
values('A', 1, 'Day 1', 'Test XYZ', 48, 40, 60)
values('A', 5, 'Week 1', 'Test XYZ', 50, 40, 60)
values('A', 10, 'Week 2', 'Test XYZ', 52, 40, 60)
values('B', 1, 'Day 1', 'Test XYZ', 52, 40, 60)
values('B', 5, 'Week 1', 'Test XYZ', 50, 40, 60)
values('B', 10, 'Week 2', 'Test XYZ', 48, 40, 60)
;
quit;
data labdata;
set labstruct;
* Put normal range outliers on 2nd axis, manually separate groups on 2nd axis *;
select (mygroup);
when ('A') scatternum = myvisitnum - 1;
when ('B') scatternum = myvisitnum + 1;
otherwise;
end;
* Make more obs from the seeds above *;
label labvalue = 'Lab measurement';
do repeat = 1 to 20;
labvalue = labseed + 6*rannor(3297);
* Scatter plot ONLY normal range outliers *;
if labvalue < lablow or labvalue > labhigh
then scattervalue = labvalue;
else scattervalue = .;
output;
end;
drop repeat labseed;
run;
proc sgplot data=labdata;
block x=myvisitnum block=myvisitname /
nofill
lineattrs=(color=lightgray);
vbox labvalue /
category=myvisitnum
group=mygroup
outlierattrs=(symbol=square);
scatter x=scatternum y=scattervalue /
group=mygroup
x2axis
jitter;
x2axis display=none;
keylegend / position=bottom type=marker;
run;
【问题讨论】:
-
我现在正在看这个。我认为核心问题是箱线图使用离散X轴,而散点图使用线性轴;这应该可以在不使用线性轴的情况下解决,但我需要考虑如何解决。您能否添加您正在使用的 SAS 版本 - 显然是 9.4,因为上述某些版本与 9.3 不兼容,但是什么维护版本(TS1M3 或更早版本?)
-
澄清一下 - 理想情况下,所有的“正常范围”异常值将沿着箱线图的中心对齐(就像箱线图异常值一样)?
-
这篇显示 /groupdisplay=cluster 和 clusterwidth 选项的博文似乎可能相关。 blogs.sas.com/content/graphicallyspeaking/2013/03/24/…
-
@Quentin 不幸的是,这还不完全一致。它实际上要好一些(当使用离散轴完成时),但它并不理想(然后你有一个更难的时间离散抵消它)。我想知道是否有办法让它工作,尽管以某种方式向散点图添加填充或其他东西(箱线图似乎认为它的可用空间比散点图少一些)。
-
Joe 提供的帮助已经超出了我的能力范围。但是,如果您在他的帮助下没有成功,Sanjay Matange 会经常在 community.sas.com 上回复。
标签: sas scatter-plot boxplot outliers