Cách tính phương sai của phân vùng biến


15

Tôi đang chạy thử nghiệm song song trong đó tôi thu thập các mẫu (độc lập), tôi tính toán phương sai của từng nhóm mẫu và bây giờ tôi muốn kết hợp tất cả để tìm tổng phương sai của tất cả các mẫu.

Tôi đang gặp khó khăn trong việc tìm kiếm một dẫn xuất cho điều này vì tôi không chắc chắn về thuật ngữ. Tôi nghĩ về nó như là một phân vùng của một RV.

Vì vậy, tôi muốn tìm Var(X) từ Var(X1) , Var(X2) , ..., và Var(Xn) , trong đó X = [X1,X2,,Xn] .

EDIT: Các phân vùng không cùng kích thước / cardinality, nhưng tổng các kích thước phân vùng bằng số lượng mẫu trong bộ mẫu tổng thể.

EDIT 2: Có một công thức tính toán song song ở đây , nhưng nó chỉ bao gồm trường hợp phân vùng thành hai bộ chứ không phải n bộ.


Đây có phải là giống như câu hỏi của tôi ở đây: mathoverflow.net/questions/64120/...

Cái khung cuối cùng đó có ý nghĩa gì? Và bạn có ý nghĩa gì bởi "tổng phương sai"? Có gì khác ngoài phương sai của tập dữ liệu kết hợp không?
whuber

@whuber mà khung cuối cùng? "Tổng phương sai" có nghĩa là phương sai của tổng số liệu.
gallamine

Biểu thức [X1,X2,,Xn] có thể có nghĩa là nhiều thứ (mặc dù theo quy ước nó sẽ là một vectơ): Tôi đang tìm kiếm một sự làm rõ.
whuber

Câu trả lời:


22

Công thức khá đơn giản nếu tất cả các mẫu phụ có cùng cỡ mẫu. Nếu bạn có mẫu phụ có kích thước k (với tổng số mẫu g k ), thì phương sai của mẫu kết hợp phụ thuộc vào giá trị trung bình E j và phương sai V j của mỗi mẫu phụ: V a r ( X 1 , Cẩu , X g k ) = k - 1gkgkEjVjtrong đó theoVar(Ej)có nghĩa là phương sai của mẫu có nghĩa.

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

Một cuộc biểu tình trong R:

> 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

Nếu kích thước mẫu không bằng nhau, công thức không đẹp lắm.

EDIT: công thức cho kích thước mẫu không đồng đều

Nếu có phụ mẫu, mỗi k j , j = 1 , ... , g yếu tố với tổng số n = Σ k j giá trị, sau đó V một r ( X 1 , ... , X n ) = 1gkj,j=1,,gn=kj trong đó ˉ X =( g j = 1 kj ˉ X j)/nlà trung bình trọng số của tất cả các phương tiện (và bằng giá trị trung bình của tất cả các giá trị).

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

Một lần nữa, một cuộc biểu tình:

> 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

(XjiX¯)2X¯j[(XjiX¯j)(X¯jX¯)]2


cảm ơn. Thật không may, tôi không thể đảm bảo rằng các phân vùng của tôi có cùng kích thước. Tôi đang chạy một quy trình song song ồ ạt, nơi tôi cần tính toán phương sai của từng phân vùng song song sau đó kết hợp, nhưng kết quả / mẫu từ mỗi quy trình song song không bằng nhau (đó là mô phỏng Monte Carlo của các photon nhận được).
gallamine

3
Tôi không thể +1 điều này đủ, công thức siêu hữu ích để tính toán song song trong môi trường kho dữ liệu
Noah Yetter

1

Đây chỉ đơn giản là một phần bổ sung cho câu trả lời của aniko với một bản phác thảo sơ bộ về đạo hàm và một số mã trăn, vì vậy tất cả các khoản tín dụng đều thuộc về aniko.

phái sinh

Để cho XjX= ={X1,X2,Giáo dục,Xg} là một trong g các phần của dữ liệu trong đó số lượng phần tử trong mỗi phần là kj= =|Xj|. Chúng tôi xác định giá trị trung bình và phương sai của từng phần

Ej= =E[Xj]= =1kjΣTôi= =1kjXjTôiVj= =Vmộtr[Xj]= =1kj-1ΣTôi= =1kj(XjTôi-Ej)2
tương ứng. Nếu chúng ta đặtn=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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.