चरों के विभाजन के विचरण की गणना कैसे करें


15

मैं एक प्रयोग चला रहा हूं जहां मैं (स्वतंत्र) नमूनों को इकट्ठा कर रहा हूं, मैं नमूनों के प्रत्येक समूह के विचरण की गणना करता हूं और अब मैं सभी नमूनों के कुल विचरण का पता लगाने के लिए संयोजन करना चाहता हूं।

मुझे इसके लिए व्युत्पत्ति प्राप्त करने में कठिन समय लग रहा है क्योंकि मुझे शब्दावली पर यकीन नहीं है। मैं इसे एक आरवी के विभाजन के रूप में सोचता हूं।

तो मैं पता लगाना चाहते हैं से वी एक आर ( एक्स 1 ) , वी एक आर ( एक्स 2 ) , ..., और वी एक आर ( एक्स एन ) है, जहां एक्स = [ एक्स 1 , एक्स 2 , , एक्स एन ]Var(X)Var(X1)Var(X2)Var(Xn)X[X1,X2,,Xn]

संपादित करें: विभाजन समान आकार / कार्डिनैलिटी नहीं हैं, लेकिन विभाजन के आकार कुल नमूने में नमूनों की संख्या के बराबर हैं।

EDIT 2: यहाँ एक समानांतर गणना के लिए एक सूत्र है , लेकिन यह केवल विभाजन के मामले को दो सेटों में शामिल करता है, सेटों को नहीं ।n


क्या यह यहाँ मेरे प्रश्न के समान है: mathoverflow.net/questions/64120/…

उस अंतिम ब्रैकेट का क्या अर्थ है? और "कुल विचरण" से आपका क्या अभिप्राय है? क्या यह संयुक्त डेटासेट के विचरण के अलावा कुछ है?
whuber

@ जो आखिरी ब्रैकेट है? "कुल विचरण" का अर्थ है कुल डेटासेट का विचरण।
गैलमाइन

अभिव्यक्ति का मतलब कई चीजें हो सकती हैं (हालांकि पारंपरिक रूप से यह एक वेक्टर होगा): मैं एक स्पष्टीकरण की तलाश में था। [X1,X2,,Xn]
whuber

जवाबों:


22

यदि सभी उप-नमूने का नमूना आकार समान है, तो सूत्र काफी सीधा है। आप था आकार के उप नमूने कश्मीर (के लिए कुल k नमूने), तो संयुक्त नमूने के विचरण मतलब पर निर्भर करता है जे और विचरण वी जे प्रत्येक उप नमूने की: वी एक आर ( एक्स 1 , , एक्स जी के ) = के - gkgkEjVjजहांVar(Ej) काअर्थ है नमूना का विचरण।

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

आर में एक प्रदर्शन:

> 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

यदि नमूना आकार समान नहीं हैं, तो सूत्र इतना अच्छा नहीं है।

EDIT: असमान नमूना आकारों के लिए सूत्र

gkj,j=1,,gn=kj

Var(X1,,Xn)=1n1(j=1g(kj1)Vj+j=1gkj(X¯jX¯)2),
X¯=(j=1gkjX¯j)/n is the weighted average of all the means (and equals to the mean of all values).

Again, a demonstration:

> 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

By the way, these formulas are easy to derive by writing the desired variance as the scaled sum of (XjiX¯)2, then introducing X¯j: [(XjiX¯j)(X¯jX¯)]2, using the square of difference formula, and simplifying.


thanks. Unfortunately, I can't guarantee that my partitions are all the same size. I'm running a massively parallel process where I need to calculate the variances of each partition in parallel then combine in the end, but the results/samples from each parallel process are not equal (it's a Monte Carlo simulation of received photons).
gallamine

3
I can't +1 this enough, super helpful formula for parallel computation in a data warehouse environment
Noah Yetter

1

This is simply an add-on to the answer of aniko with a rough sketch of the derivation and some python code, so all credits go to aniko.

derivation

Let XjX={X1,X2,,Xg} be one of g parts of the data where the number of elements in each part is kj=|Xj|. We define the mean and the variance of each part to be

Ej=E[Xj]=1kji=1kjXjiVj=Var[Xj]=1kj1i=1kj(XjiEj)2
respectively. If we set n=j=1gkj, the variance of the total dataset is given by:
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.
If we have the same size k for each part, i.e. j:kj=k, above formula simplifies to
Var[X]=1n1j=1g(k1)Vj+k(g1)Var[Ej]=k1n1j=1gVj+k(g1)k1Var[Ej]

python code

The following python function works for arrays that have been splitted along the first dimension and implements the "more complex" formula for differently sized parts.

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)

It can be used as follows:

# 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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.