在SAS 9.4中计算跨多行和多列的中值

在SAS 9.4中计算跨多行和多列的中值,sas,median,Sas,Median,我试图搜索多个地方,但还没有找到解决方案。我想知道这里是否有人能帮我 我正在尝试计算SAS 9.4中多个行和列的Q1和Q3中值。我使用的数据集如下所示: Obs tumor_size_1 tumor_size_2 tumor_size_3 tumor_size_4 1 4 1.5 1 1 2 2.5 2 . . 3 3 .

我试图搜索多个地方,但还没有找到解决方案。我想知道这里是否有人能帮我

我正在尝试计算SAS 9.4中多个行和列的Q1和Q3中值。我使用的数据集如下所示:

Obs tumor_size_1 tumor_size_2 tumor_size_3 tumor_size_4
1   4            1.5          1            1
2   2.5          2            .            .
3   3            .            .            .
4   4            .            .            .
5   3.5          1            .            .

上下文是指一个人可能有一个或多个肿瘤的医疗条件。每行代表一个人。每个人可能有多达4个肿瘤。我想确定整个队列中所有肿瘤的中位大小,而不仅仅是每个人的中位大小。有没有办法计算这个?提前感谢。

数据的转置将产生一种数据结构形式,可以在各种聚合组合下进行中位数和四分位数计算,使用PROC SUMMARY和CLASS语句生成

例如:

data have;
input
patient tumor_size_1 tumor_size_2 tumor_size_3 tumor_size_4; datalines;
1   4            1.5          1            1
2   2.5          2            .            .
3   3            .            .            .
4   4            .            .            .
5   3.5          1            .            .
;

proc transpose data=have out=new_have;
by patient;
var tumor:;
run;

proc summary data=new_have;
  class patient;
  var col1;
  output out=want Q1=Q1 Q3=Q3 MEDIAN=MEDIAN N=N;
run;
结果

patient    _TYPE_    _FREQ_    Q1     Q3     MEDIAN     N

   .          0        20       1    3.50     2.25     10
   1          1         4       1    2.75     1.25      4
   2          1         4       2    2.50     2.25      2
   3          1         4       3    3.00     3.00      1
   4          1         4       4    4.00     4.00      1
   5          1         4       1    3.50     2.25      2
_TYPE_u列描述了组合类变量的方式,以便获得所需统计数据的结果。_TYPE_u=0的情况适用于所有值,在这个问题中,_FREQ_=20表示计算考虑了20个输入,其中N=10个输入没有丢失,并且参与了实际计算。当存在多个类变量时,_TYPE_uu的作用变得更加明显

从文件中:

包含类变量信息的变量_TYPE_uu。默认情况下,类型是一个数值变量。如果在PROC语句中指定CHARTYPE,则_TYPE_u是一个字符变量。当使用32个以上的类变量时,_TYPE_uu自动成为字符变量。 及

_TYPE_u的值指示PROC MEANS使用哪个类变量组合来计算统计信息。_TYPE_u的字符值是一系列的0和1,其中每个值表示类型中的活动类变量。例如,对于三个类变量,PROC MEANS将类型1表示为001,将类型5表示为101,依此类推

计算全部中值的一种不太优雅的方法是将所有值存储在一个超大数组中,并在读取最后一行后在数组上使用中值函数:

data median_all;
  set have end=lastrow;
  array values [1000000] _temporary_;
  array sizes tumor_size_1-tumor_size_4;

  do sIndex = 1 to dim(sizes);
/*    if not missing (sizes[sIndex]) then do; */  %* decomment for dense fill;
      vIndex + 1;
      values[vIndex] = sizes[sIndex];
/*    end; */                                     %* decomment for dense fill;
  end;

  if lastrow then do;
    median_all_tumor_sizes = median (of values(*));
    output;
    put (median:) (=);
  end;

  keep median:;
run;

-------- LOG -------
median_all_tumor_sizes=2.25


嗨,Richard,谢谢你周到的回复。我很抱歉,但我觉得我原来的帖子太含糊不清了。我希望做的是计算一个中位数的肿瘤大小,它是数据集中测量的每个肿瘤的平均值,即所有行和列。因此,在上面的例子中,我希望所有值和所有患者都有一个单一的汇总统计数据,即值4、1.5、1、1、2.5、2、3、4、3.5和Q1=1.125以及Q3=2.875的中位数=2.25,而不是每个患者的单个中位数。再次感谢您@Alex您要查找的输出位于第一行。如果您不想要每个患者的输出,那么只需删除类patient;从最后一步开始。@user667489非常感谢您的澄清@理查德,我真的很感谢你的帮助!非常感谢,亚历克斯