在 SAS 中,查找组中所有其他观测值的平均值



我试图找到同一组中所有其他观测值的平均值

我的数据就像

Value        Name    Group   Mean_all_other
544          Pete      1        ....
997          Sara      1        ....
772          Tom       1        ....
725          Tris      2        ....
872          Lulu      2        ....
434          Mica      2        ....
728          Tina      2        ....
827          Bo        3        ....
322          Zu        3        ....
.....        ...     ...         ...

我知道proc means可以给你群体内的平均值。但是在这里,我想创建同一组中所有其他值的平均值

在这种情况下,皮特在 Mean_all_other 下将显示 884.5,等于 (997+772)/2。

萨拉= (544+772)/2=658; Tris=(872+434+728)/3=678

有人知道吗?

考虑一个proc sql解决方案,使用子查询对每一行平均相同的Group,并调节当前Name。下面的查询使用 SAS 的不相等运算符^=mean()函数,在常规 SQL 中将使用<>运算符和 avg() - 两者都在 SAS 中仍然兼容)。

proc sql;
    create table NewTable as
      select * from
      (select main.Value, main.Name, main.Group,
            (select mean(sub.Value) 
             from CurrentTable sub
             where sub.Group = main.Group
             and sub.Name ^= main.Name) As Mean_all_other
       from CurrentTable as main)
quit;
* Value Name    Group   Mean_all_other
* 544   Pete    1       884.5
* 997   Sara    1       658
* 772   Tom     1       770.5
* 725   Tris    2       678
* 872   Lulu    2       629
* 434   Mica    2       775
* 728   Tina    2       677
* 827   Bo      3       322
* 322   Zu      3       827

获得每个整组的均值后,每个观测值的案例删除均值就更容易计算。我建议通过双道琼斯循环来做到这一点:

data have;
input Value  Name $   Group;
cards;
544          Pete      1
997          Sara      1
772          Tom       1
725          Tris      2
872          Lulu      2
434          Mica      2
728          Tina      2
827          Bo        3
322          Zu        3
;
run;
data want;
    do _N_ = 1 by 1 until(last.group);
        set have;
        by group;
        value_sum = sum(value_sum,value);
        value_count = sum(value_count,1);
    end;
    do _N_ = 1 to _N_;
        set have;
        mean_all_other = (value_sum - value)/(value_count - 1);
        output;
    end;
    drop value_:;
run; 

PROC SQL将很乐意为您重新合并摘要统计信息。 请注意,此语法在其他 SQL 实现中可能不起作用,但在 SAS 中工作正常。您可以使用 DIVIDE 函数来避免只有一个成员的组被零除。

create table want as
  select *
       , divide(sum(value) - value, n(value) - 1) as mean_all_other
  from have
  group by group
;

对于其他 SQL 实现,您需要自己重新合并聚合结果。

create table want as
  select a.*
       , divide(b.sum_value - a.value, b.n_value - 1) as mean_all_other
  from have a
     , (select group,sum(value) as sum_value,n(value) as n_value
        from have
        group by group
       ) b
  where a.group = b.group
;

如果可能缺少 VALUE 的值,则需要添加 CASE 语句来处理这些情况。

create table want as
  select *
       , case when (missing(value)) then mean(value)
              else divide(sum(value) - value, n(value) - 1)
         end as mean_all_other
  from have
  group by group
;

相关内容

  • 没有找到相关文章

最新更新