Değişkenlerin bir bölümünün varyansı nasıl hesaplanır


15

(Bağımsız) örnekleri paralel olarak topladığım bir deney yapıyorum, her örnek grubunun varyansını hesaplıyorum ve şimdi tüm örneklerin toplam varyansını bulmak için hepsini birleştirmek istiyorum.

Terminolojiden emin olmadığım için bunun için bir türev bulmakta zorlanıyorum. Ben bir RV bir bölümü olarak düşünüyorum.

Bu yüzden , , ... ve dan bulmak istiyorum , burada = .V a r ( X 1 ) V a r ( X 2 ) V a r ( X n ) X [ X 1 , X 2 , , X n ]Var(X)Var(X1)Var(X2)Var(Xn)X[X1,X2,,Xn]

DÜZENLEME: Bölümler aynı boyut / kardinalite değildir, ancak bölüm boyutlarının toplamı, toplam örnek setindeki örnek sayısına eşittir.

DÜZENLEME 2: Paralel hesaplama için bir formül vardır , ancak setini değil, yalnızca iki kümeye bölünme durumunu kapsar .n


Bu, buradaki sorumla

Bu son parantez ne anlama geliyor? Peki "toplam varyans" ile ne demek istiyorsun? Birleşik veri kümesinin varyansı dışında bir şey var mı?
whuber

@whuber son köşeli ayraç? "toplam varyans", toplam veri kümesinin varyansı anlamına gelir.
gallamin

ifadesi birçok anlama gelebilir (geleneksel olarak bir vektör olsa da): Bir açıklama arıyordum. [X1,X2,,Xn]
whuber

Yanıtlar:


22

Tüm alt numuneler aynı numune boyutuna sahipse, formül oldukça basittir. boyutunda alt örnekleri varsa (toplam örnekleri için), birleştirilmiş örneğin varyansı , her bir alt örneğin ortalama ve varyansına bağlıdır : burada , numune araçlarının varyansı anlamına gelir.k g k E j V j V a r ( X 1 , , X g k ) = k - 1gkgkEjVj

Var(X1,,Xgk)=k1gk1(j=1gVj+k(g1)k1Var(Ej)),
Var(Ej)

R'de bir gösteri:

> x <- rnorm(100)
> g <- gl(10,10)
> mns <- tapply(x, g, mean)
> vs <- tapply(x, g, var)
> 9/99*(sum(vs) + 10*var(mns))
[1] 1.033749
> var(x)
[1] 1.033749

Örnek boyutları eşit değilse, formül çok hoş değildir.

EDIT: eşit olmayan örnek boyutları için formül

Varsa alt örnekler, her bir toplam için elemanları değerleri, daha sonra burada , tüm araçların ağırlıklı ortalamasıdır (ve tüm değerlerin ortalamasına eşittir) ).gkj,j=1,,gn=kj

Var(X1,,Xn)=1n1(j=1g(kj1)Vj+j=1gkj(X¯jX¯)2),
X¯=(j=1gkjX¯j)/n

Yine bir gösteri:

> k <- rpois(10, lambda=10)
> n <- sum(k)
> g <- factor(rep(1:10, k))
> x <- rnorm(n)
> mns <- tapply(x, g, mean)
> vs <- tapply(x, g, var)
> 1/(n-1)*(sum((k-1)*vs) + sum(k*(mns-weighted.mean(mns,k))^2))
[1] 1.108966
> var(x)
[1] 1.108966

Bu arada, bu formüller ölçekli toplamı olarak arzu edilen varyans yazarak elde etmek kolaydır , daha sonra sokulması : , fark formülünün karesini kullanarak ve basitleştirme.ˉ X j [ ( X j i - ˉ X j ) - ( ˉ X j - ˉ X ) ] 2(XjiX¯)2X¯j[(XjiX¯j)(X¯jX¯)]2


Teşekkürler. Ne yazık ki, bölümlerimin aynı boyutta olduğunu garanti edemiyorum. Her bölümün varyanslarını paralel olarak hesaplamak ve sonunda birleştirmek için gereken büyük ölçüde paralel bir işlem yürütüyorum, ancak her paralel işlemin sonuçları / örnekleri eşit değil (alınan fotonların Monte Carlo simülasyonu).
gallamin

3
Bir veri ambarı ortamında paralel hesaplama için bu yeterince, süper yararlı formülü +
1'leyemiyorum

1

Bu basitçe türetmenin kaba bir taslağı ve bazı python koduyla aniko'nun cevabına bir eklentidir , bu yüzden tüm krediler aniko'ya gider.

türetme

Let biri her bir bölümü için eleman sayısı olan veriler parçaları. Her parçanın ortalamasını ve varyansını . Biz ayarlanırsa toplam veri kümesi varyansı ile elde edilir: XjX={X1,X2,,Xg}gkj=|Xj|

Ej=E[Xj]=1kji=1kjXjiVj=Var[Xj]=1kj1i=1kj(XjiEj)2
n=j=1gkj
Var[X]=1n1j=1gi=1kj(XjiE[X])2=1n1j=1gi=1kj((XjiEj)(E[X]Ej))2=1n1j=1gi=1kj(XjiEj)22(XjiEj)(E[X]Ej)+(E[X]Ej)2=1n1j=1g(kj1)Vj+kj(E[X]Ej)2.
Her bölüm için aynı boyutta , yani , yukarıdaki formül basitleştirir kj:kj=k
Var[X]=1n1j=1g(k1)Vj+k(g1)Var[Ej]=k1n1j=1gVj+k(g1)k1Var[Ej]

piton kodu

Aşağıdaki python işlevi, ilk boyut boyunca bölünmüş diziler için çalışır ve farklı boyutlardaki parçalar için "daha karmaşık" formülü uygular.

import numpy as np

def combine(averages, variances, counts, size=None):
    """
    Combine averages and variances to one single average and variance.

    # Arguments
        averages: List of averages for each part.
        variances: List of variances for each part.
        counts: List of number of elements in each part.
        size: Total number of elements in all of the parts.
    # Returns
        average: Average over all parts.
        variance: Variance over all parts.
    """
    average = np.average(averages, weights=counts)

    # necessary for correct variance in case of multidimensional arrays
    if size is not None:
        counts = counts * size // np.sum(counts, dtype='int')

    squares = (counts - 1) * variances + counts * (averages - average)**2
    return average, np.sum(squares) / (size - 1)

Aşağıdaki gibi kullanılabilir:

# sizes k_j and n
ks = np.random.poisson(10, 10)
n = np.sum(ks)

# create data
x = np.random.randn(n, 20)
parts = np.split(x, np.cumsum(ks[:-1]))

# compute statistics on parts
ms = [np.mean(p) for p in parts]
vs = [np.var(p, ddof=1) for p in parts]

# combine and compare
combined = combine(ms, vs, ks, x.size)
numpied = np.mean(x), np.var(x, ddof=1)
distance = np.abs(np.array(combined) - np.array(numpied))
print('combined --- mean:{: .9f} - var:{: .9f}'.format(*combined))
print('numpied  --- mean:{: .9f} - var:{: .9f}'.format(*numpied))
print('distance --- mean:{: .5e} - var:{: .5e}'.format(*distance))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.