2016-02-21 62 views
0

我試圖找到在同一組中所有其他觀測值的平均值。在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下的Pete將顯示884.5,這等於(997 + 772)/ 2。

並且Sara =(544 + 772)/ 2 = 658; Tris =(872 + 434 + 728)/ 3 = 678

任何人有什麼想法?

回答

1

一旦你有每個整個組的平均值,每個觀察的病例刪除的平均值更容易計算。我建議通過雙循環DOW這樣做:

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; 
+0

當'value'沒有丟失時,值得考慮只增加'value_count',因爲'proc means'也會從平均值中排除缺失值。 –

+0

它對於規模一組的人也不適用,但至少它是一個概念證明。 – user667489

2

考慮使用子查詢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 
1

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 
; 
+0

這兩個都需要更好地處理缺失值。 –

+0

@RobertPenr​​idge - 更新。 – Tom

相關問題