web-dev-qa-db-fra.com

Pourquoi la fonction var () me donne-t-elle une réponse différente de ma variance calculée?

Je ne savais pas si cela devrait aller dans SO ou dans un autre fichier .SE; je vais donc le supprimer si cela est considéré comme hors sujet.

J'ai un vecteur et j'essaie de calculer la variance "à la main" (c'est-à-dire basée sur la définition de la variance mais effectuant toujours les calculs en R) en utilisant l'équation: V[X] = E[X^2] - E[X]^2E[X] = sum (x * f(x)) et E[X^2] = sum (x^2 * f(x)).

Cependant, ma variance calculée est différente de la fonction var() de R (que j’utilisais pour vérifier mon travail). Pourquoi la fonction var() est-elle différente? Comment calcule-t-on la variance? J'ai vérifié mes calculs plusieurs fois, donc je suis assez confiant dans la valeur calculée. Mon code est fourni ci-dessous.

vec <- c(3, 5, 4, 3, 6, 7, 3, 6, 4, 6, 3, 4, 1, 3, 4, 4)
range(vec)
counts <- hist(vec + .01, breaks = 7)$counts
fx <- counts / (sum(counts)) #the pmf f(x)
x <- c(min(vec): max(vec)) #the values of x
exp <- sum(x * fx) ; exp #expected value of x
exp.square <- sum(x^2 * fx) #expected value of x^2
var <- exp.square - (exp)^2 ; var #calculated variance
var(vec)

Cela me donne une variance calculée de 2,234, mais la fonction var() indique que la variance est de 2,338.

14
pocketlizard

Alors que V [X] = E [X ^ 2] - E [X] ^ 2 est la variance de la population (lorsque les valeurs du vecteur sont la population entière et non un échantillon), la fonction var calcule un estimateur pour la variance de la population (la variance de l'échantillon ). 

9
Sven Hohenstein

Bien que cela ait déjà été répondu, je crains que certains puissent encore être confondus entre variance de population} et son estimation à partir d'un échantillon, et cela peut être dû à l'exemple.

Si le vecteur vec représente la population complète, alors vec est simplement un moyen de représenter la fonction de distribution, ce qui peut être résumé de manière plus succincte dans le fichier pmf que vous en avez dérivé. De manière cruciale, les éléments de vec dans ce cas ne sont pas des variables aléatoires. Dans ce cas, vos calculs de E [X] et var [X] à partir du pmf sont corrects.

Cependant, la plupart du temps, lorsque vous avez des données (par exemple sous la forme d'un vecteur), il s'agit d'un échantillon aléatoire de la population sous-jacente. Chaque élément du vecteur est la valeur observée d'une variable aléatoire: il s'agit d'un "tirage" de la population. Pour cet exemple, il est juste de supposer que chaque élément est dessiné indépendamment, à partir de la même distribution ("iid"). En pratique, cet échantillonnage aléatoire signifie que vous ne pouvez pas calculer le véritable pmf, car certaines variations peuvent être dues au hasard. De même, vous ne pouvez pas obtenir la valeur vraie de E [X], E [X ^ 2], et donc de Var [X], de l'échantillon. Ces valeurs doivent être estimées. La moyenne de l'échantillon est généralement une bonne estimation pour E [X] (en particulier, elle est non biaisée), mais il s'avère que la variance de l'échantillon est une estimation biaisée de la variance de la population. . Pour corriger ce biais, vous devez le multiplier par le facteur n/(n-1).

Comme ce dernier cas est le plus utilisé dans la pratique (hormis les exercices manuels), il correspond à ce qui est calculé lorsque vous appelez la fonction var() dans R. Donc, si vous êtes invité à trouver la "variance estimée", cela implique très probablement que votre vecteur vec est un échantillon aléatoire et que vous tombez dans ce dernier cas. Si telle était la question de départ, vous avez alors votre réponse et j'espère qu'il sera clair que le choix du nom des variables et les commentaires dans votre code peuvent prêter à confusion}: en effet, vous ne pouvez pas calculer le pmf, la valeur attendue ou la variance de la population à partir d'un échantillon aléatoire: vous pouvez obtenir leurs estimations, et l'une d'entre elles, celle de la variance, est biaisée.

Je voulais clarifier ceci, car cette confusion, comme on le voit dans le codage, est très courante lorsque l'on se familiarise avec ces concepts. En particulier, la réponse acceptée peut être trompeuse: V [X] = E [X ^ 2] - E [X] ^ 2 est non la variance de l'échantillon; il s’agit bien de la variance de population que vous ne pouvez pas obtenir de l’échantillon aléatoire. Si vous remplacez les valeurs de cette équation par leur estimation échantillon (sous forme de moyennes), vous obtiendrez échantillon.V [X] = moyenne [X ^ 2] - moyenne [X] ^ 2, qui est la variance de l'échantillon et est biaisé.

Certains peuvent dire que je suis pointilleux sur la sémantique; Cependant, "l'abus de notation" dans la réponse acceptée n'est acceptable que lorsque tout le monde le reconnaît comme tel. Cependant, pour ceux qui essaient de comprendre ces différences conceptuelles, je pense qu'il est préférable de rester précis.

6
wiwh

Voici un moyen de calculer la "variance estimée de la population" correspondant à la sortie de la fonction var dans le paquetage stats: 

vec <- c(3, 5, 4, 3, 6, 7, 3, 6, 4, 6, 3, 4, 1, 3, 4, 4)
n <- length(vec)
average <- mean(vec)
differences <- vec - average
squared.differences <- differences^2
sum.of.squared.differences <-  sum(squared.differences)
estimator <- 1/(n - 1)
estimated.variance <- estimator * sum.of.squared.differences
estimated.variance
[1] 2.383333
var(vec) == estimated.variance # The "hand calculated" variance equals the variance in the stats package.
[1] TRUE

Je me demande ce que les gens pensent de l’étiquetage du terme «estimateur».

Dans une fonction (il est peu probable que des erreurs et des anomalies soient gérées de même que la fonction var dans le paquetage stats):

estimated.variance.by.hand <- function (x){
  n <- length(x)
  average <- mean(x)
  differences <- x - average
  squared.differences <- differences^2
  sum.of.squared.differences <-  sum(squared.differences)
  estimator <- 1/(n - 1)
  est.variance <- estimator * sum.of.squared.differences
  est.variance
}
estimated.variance.by.hand(vec)
estimated.variance.by.hand(1:10)
var(1:10)
estimated.variance.by.hand(1:100)
var(1:100)
1
dca

La R-base var() prend N-1 dans le dénominateur, pour obtenir un estimateur plus fiable (moins biaisé) de la variance. Malheureusement, il n'y a pas d'option pour dire à var() de prendreNà la place, alors j'ai écrit ma propre fonction de variance pour ce cas.

var_N = function(x){var(x)*(length(x)-1)/length(x)}

Et du code pour illustrer la fonction ci-dessus, la fonction de base, la manière manuelle et la fonction estimated.variance.by.hand() de @ dca:

## Data
x = c(4,5,6,7,8,2,4,6,6)
mean_x = mean(x)


## Variance with N-1 in denominator
var(x)
sum((x - mean_x) ^2) / (length(x) - 1)
estimated.variance.by.hand(x)


## Variance with N in denominator
sum((x - mean_x) ^2) / length(x)
var(x) * (length(x) - 1) / length(x)
var_N = function(x){var(x)*(length(x)-1)/length(x)}
var_N(x)
1
SeGa