2009-09-26 120 views
8

我有兩組統計數據從處理中生成。來自處理的數據可能會有大量的結果,因此我寧願不必存儲所有數據以便稍後重新計算其他數據。合併兩個統計結果集

假設我有兩組統計數據,它們描述了兩個不同的進程運行會話。

每套包含

Statistics : { mean, median, standard deviation, runs on process} 

我將如何合併兩個的中位數和標準差來獲得統計數據的兩個描述組的組合摘要。

請記住,我無法保留統計數據所描述的兩組數據。

回答

20

你可以得到平均值和標準差,但不是中位數。

new_n = (n(0) + n(1) + ...) 
new_mean = (mean(0)*n(0) + mean(1)*n(1) + ...)/new_n 

new_var = ((var(0)+mean(0)**2)*n(0) + (var(1)+mean(1)**2)*n(1) + ...)/new_n - new_mean**2 

其中n(0)是運行的第一個數據集的數目,n(1)是運行在第二數量,依此類推,mean是平均值,並且var是方差(這僅僅是標準偏差平方)。 n**2表示「n平方」。

獲得組合方差取決於數據集方差等於數據集平方平均值減去數據集平均值平方的事實。在統計學中,

Var(X) = E(X^2) - E(X)^2 

var(n)+mean(n)**2條款上面給我們E(X^2)部分,我們可以再與其他數據集相結合,然後得到期望的結果。

在中位數方面:

如果要結合恰好兩個數據集,那麼你可以肯定的是,合併正中在於兩個中值之間的某處(或等於其中之一),但是有一點你可以說更多。除非你想避免中位數不等於某個數據點,否則取平均值應該沒問題。

如果您一次結合多個數據集,則可以採用中位數的中位數,也可以取平均值。如果不同數據集之間可能存在顯着的系統差異,那麼取平均值可能會更好,因爲採用中位數可以減少異常值的影響。但是如果你在運行之間有系統的差異,忽視它們可能不是一件好事。

3

中位數是不可能的。假設你有兩個元組,(1,1,1,2)和(0,0,2,3,3)。 Medians是1和2,總體中位數是1。沒辦法告訴。

23

阿蒂爾烏斯在數學上是正確的,但他建議計算方差的方式在數值上不穩定。你要計算方差如下:

new_var=(n(0)*(var(0)+(mean(0)-new_mean)**2) + n(1)*(var(1)+(mean(1)-new_mean)**2) + ...)/new_n 

從評論
與原代碼的問題編輯的,如果相比,你的意思是你偏差小,你最終會從減去大量大量地獲得一個相對較小的數字,這會導致你失去浮點精度。新代碼避免了這個問題;而不是轉換爲E(X^2)並返回,它只是將所有貢獻加在一起,並根據樣本大小進行適當加權。

+0

好點,但你能擴展一下嗎? – Artelius 2009-09-26 09:45:03

+9

當然。原始代碼的問題是,如果你的偏差與你的意思相比較小,你最終會從大數中減去一個大數來得到一個相對較小的數字,這將導致你失去浮點精度。新代碼避免了這個問題;而不是轉換爲E(X^2)並返回,它只是將所有貢獻加在一起,並根據樣本大小進行適當加權。 – comingstorm 2009-09-26 11:34:36

+1

+1爲您的答案和評論。兩者都是現貨,寫得很好。 – duffymo 2009-09-26 13:04:46