Équation correcte pour la covariance sans biais pondérée de l'échantillon

9

Je cherche l'équation correcte pour calculer la covariance sans biais pondérée de l'échantillon. Les sources Internet sont assez rares sur ce thème et elles utilisent toutes des équations différentes.

L'équation la plus probable que j'ai trouvée est celle-ci:

qjk=je=1Nwje(je=1Nwje)2-je=1Nwje2je=1Nwje(Xjej-X¯j)(Xjek-X¯k).

De: https://en.wikipedia.org/wiki/Sample_mean_and_sample_covariance#Weighted_samples

Bien sûr, vous devez au préalable calculer la moyenne de l'échantillon pondéré (sans biais).

Cependant, j'ai trouvé plusieurs autres formules comme:

qjk=1je=1Nwje)-1je=1Nwje(Xjej-X¯j)(Xjek-X¯k).

Ou j'ai même vu des codes source et des articles universitaires en utilisant simplement la formule de covariance standard mais avec la moyenne de l'échantillon pondéré au lieu de la moyenne de l'échantillon ...

Quelqu'un peut-il m'aider et faire la lumière?

/ EDIT: mes poids sont simplement le nombre d'observations pour un échantillon dans l'ensemble de données, donc weights.sum () = n

généreux
la source
1
Quels types de poids utilisez-vous? Selon l'application, les poids peuvent signifier différentes choses et la bonne réponse dépend de leur signification. Par exemple, ils peuvent être un raccourci pour les fréquences (une observation a un poids de dans l'ensemble de données pour refléter son occurrence fois dans les données) ou ils peuvent être un raccourci pour les probabilités d'être dans un échantillon (pour les échantillons aléatoires pondérés, tels que échantillons stratifiés ou hiérarchisés). FF
whuber
@whuber: Mes poids sont simplement le nombre d'observations pour un échantillon dans l'ensemble de données, et donc: Somme (poids) = n
génial
1
Ensuite, votre question est répondue à de nombreux endroits ici (bien que cela ne soit pas immédiatement apparent), y compris stats.stackexchange.com/questions/58986/… (qui explique le principe) ainsi que stats.stackexchange.com/questions/6534/ … (Que je maintiens toujours incorrect, mais vous pouvez décider par vous-même).
whuber
@whuber: merci pour votre aide, mais le premier lien concerne l'écart type (racine carrée de la variance) et non la covariance, et le second est tout à fait faux (comme vous l'avez souligné).
génial
3
Il n'y a pas de différence entre la variance et la covariance: toutes les covariances peuvent être obtenues car (les combinaisons linéaires) des variances et des variances ne sont bien sûr que des exemples particuliers de covariances. (Les mathématiciens appellent cette relation la polarisation .)
whuber

Réponses:

18

J'ai trouvé la solution dans un livre de 1972 (George R. Price, Ann. Hum. Genet., Lond, pp485-490, Extension of covariance selection mathématiques, 1972) .

Covariance de l'échantillon pondéré biaisé:

Σ=1je=1Nwjeje=1Nwje(Xje-μ)T(Xje-μ)

Et la covariance non pondérée de l'échantillon donnée en appliquant la correction de Bessel:

Σ=1je=1Nwje-1je=1Nwje(Xje-μ)T(Xje-μ)

μ est la moyenne de l'échantillon pondéré (sans biais):

μ=je=1NwjeXjeje=1Nwje

Remarque importante: cela ne fonctionne que si les poids sont des poids de type "répétition", ce qui signifie que chaque poids représente le nombre d'occurrences d'une observation, et que je=1Nwje=NN représentent la taille réelle de l'échantillon (nombre total réel d'échantillons, en tenant compte des poids).

J'ai mis à jour l'article sur Wikipedia, où vous trouverez également l'équation de la variance d'échantillon pondérée non biaisée:

https://en.wikipedia.org/wiki/Weighted_arithmetic_mean#Weighted_sample_covariance

Note pratique: je vous conseille de multiplier d'abord colonne par colonne wje et (Xje-μ) puis faire une multiplication matricielle avec (Xje-μ)pour envelopper les choses et effectuer automatiquement la sommation. Par exemple, en code Python Pandas / Numpy:

import pandas as pd
import numpy as np
# X is the dataset, as a Pandas' DataFrame
mean = mean = np.ma.average(X, axis=0, weights=weights) # Computing the weighted sample mean (fast, efficient and precise)
mean = pd.Series(mean, index=list(X.keys())) # Convert to a Pandas' Series (it's just aesthetic and more ergonomic, no differenc in computed values)
xm = X-mean # xm = X diff to mean
xm = xm.fillna(0) # fill NaN with 0 (because anyway a variance of 0 is just void, but at least it keeps the other covariance's values computed correctly))
sigma2 = 1./(w.sum()-1) * xm.mul(w, axis=0).T.dot(xm); # Compute the unbiased weighted sample covariance

A fait quelques vérifications d'intégrité en utilisant un ensemble de données non pondéré et un ensemble de données pondéré équivalent, et cela fonctionne correctement.

généreux
la source
@whuber: non, c'est correct, mais cela dépend de ce à quoi vos "poids" sont affectés. Dans mon cas, c'est le nombre d'observations (aka "répétitions"), en tant que telle cette équation fonctionne correctement. Dans votre cas avec des poids normalisés ou aussi si les poids sont les variances de chaque mesure d'une observation, dite "fiabilité", alors cela ne fonctionne pas et l'autre équation sur le wiki doit être utilisée (ce qui n'est pas le cas travailler avec des poids de type "répétitions"!).
génial
@whuber: de toute façon si vous avez une approche plus généralisable, je serais heureux d'en entendre parler. J'ai exploré tout Internet et ce site Web et je n'ai pas trouvé d'équation qui fonctionnerait pour les poids de type répétition, sauf celui que j'ai publié ci-dessus!
génial
3
Il ne peut pas exister de formule universelle: si les poids ne sont pas des fréquences intégrales (par exemple, s'ils ont été normalisés pour résumer à l'unité), alors vous avez perdu toutes les informations sur la taille totale de l'échantillon n, d'où il est impossible d'estimer le facteur de correction n/(n-1). Néanmoins, à condition que les poids ne correspondent pas à l'unité, votre formule produira une réponse. C’est pourquoi il est essentiel de préciser que votre formule n’est pas généralement applicable et que lewje doivent être des fréquences réelles et rien d'autre.
whuber
3
@whuber: Merci pour l'explication, c'est ce que je craignais (pas d'équation unifiée et perte de facteur de correction). J'ai ajouté une note à ma réponse pour mieux décrire cela. Je vais également ajouter votre ligne sur le facteur de correction dans l'article Wikipedia.
génial
@whuber Entré à travers ces anciens fils. Je me demande comment votre affirmation selon laquelle "il ne peut pas y avoir de formule universelle" correspond par exemple à une réponse acceptée dans ce fil: stats.stackexchange.com/questions/47325 . Pensez-vous que cette réponse est fausse (en affirmant qu'il existe une expression impartiale pour tous les poids)?
amoeba