Cette réponse présente deux solutions: les corrections de Sheppard et une estimation du maximum de vraisemblance. Les deux s'accordent étroitement sur une estimation de l'écart type: pour le premier et 7,69 pour le second (une fois ajusté pour être comparable à l'estimateur «sans biais» habituel).7.707.69
Corrections de Sheppard
Les «corrections de Sheppard» sont des formules qui ajustent les moments calculés à partir de données regroupées (comme celles-ci) où
les données sont supposées être régies par une distribution supportée sur un intervalle fini [a,b]
cet intervalle est divisé séquentiellement en des cases égales de largeur commune qui est relativement petite (aucune case ne contient une grande proportion de toutes les données)h
la distribution a une fonction de densité continue.
Ils sont dérivés de la formule de somme d'Euler-Maclaurin, qui se rapproche des intégrales en termes de combinaisons linéaires de valeurs de l'intégrande à des points régulièrement espacés, et donc généralement applicables (et pas seulement aux distributions normales).
Bien qu'à proprement parler une distribution normale ne soit pas prise en charge sur un intervalle fini, à une approximation extrêmement proche, elle l'est. Essentiellement, toute sa probabilité est contenue dans sept écarts-types de la moyenne. Par conséquent, les corrections de Sheppard s'appliquent aux données supposées provenir d'une distribution normale.
Les deux premières corrections de Sheppard sont
Utilisez la moyenne des données regroupées pour la moyenne des données (c'est-à-dire qu'aucune correction n'est nécessaire pour la moyenne).
Soustraire h2/12
h2/12h−h/2h/2h2/12
Faisons les calculs. J'utilise R
pour les illustrer, en commençant par préciser les comptages et les bacs:
counts <- c(1,2,3,4,1)
bin.lower <- c(40, 45, 50, 55, 70)
bin.upper <- c(45, 50, 55, 60, 75)
La formule appropriée à utiliser pour les comptages provient de la réplication des largeurs de bacs par les montants donnés par les comptages; autrement dit, les données regroupées sont équivalentes à
42.5, 47.5, 47.5, 52.5, 52.5, 57.5, 57.5, 57.5, 57.5, 72.5
xkkx2
bin.mid <- (bin.upper + bin.lower)/2
n <- sum(counts)
mu <- sum(bin.mid * counts) / n
sigma2 <- (sum(bin.mid^2 * counts) - n * mu^2) / (n-1)
mu
1195/22≈54.32sigma2
675/11≈61.367.83h=5h2/12=25/12≈2.08675/11−52/12−−−−−−−−−−−−√≈7.70
Estimations du maximum de vraisemblance
Fθθ(x0,x1]kFθ , alors le ( additif) à la probabilité logarithmique de ce bac est
log∏i=1k(Fθ(x1)−Fθ(x0))=klog(Fθ(x1)−Fθ(x0))
(voir MLE / probabilité d'intervalle lognormalement distribué ).
Λ(θ)θ^−Λ(θ)θ . Le R
code suivant fait le travail pour une distribution normale:
sigma <- sqrt(sigma2) # Crude starting estimate for the SD
likelihood.log <- function(theta, counts, bin.lower, bin.upper) {
mu <- theta[1]; sigma <- theta[2]
-sum(sapply(1:length(counts), function(i) {
counts[i] *
log(pnorm(bin.upper[i], mu, sigma) - pnorm(bin.lower[i], mu, sigma))
}))
}
coefficients <- optim(c(mu, sigma), function(theta)
likelihood.log(theta, counts, bin.lower, bin.upper))$par
(μ^,σ^)=(54.32,7.33)
σn/(n−1)σn/(n−1)−−−−−−−−√σ^=11/10−−−−−√×7.33=7.697.70
Vérification des hypothèses
Pour visualiser ces résultats, nous pouvons tracer la densité normale ajustée sur un histogramme:
hist(unlist(mapply(function(x,y) rep(x,y), bin.mid, counts)),
breaks = breaks, xlab="Values", main="Data and Normal Fit")
curve(dnorm(x, coefficients[1], coefficients[2]),
from=min(bin.lower), to=max(bin.upper),
add=TRUE, col="Blue", lwd=2)
11 valeurs), des écarts étonnamment importants entre la distribution des observations et la vraie distribution sous-jacente peuvent se produire.
Vérifions plus formellement l'hypothèse (faite par le MLE) que les données sont régies par une distribution normale. Un test de qualité d’ajustement approximatif peut être obtenuχ2test: les paramètres estimés indiquent la quantité attendue de données dans chaque bac; leχ2la statistique compare les dénombrements observés aux dénombrements attendus. Voici un test en R
:
breaks <- sort(unique(c(bin.lower, bin.upper)))
fit <- mapply(function(l, u) exp(-likelihood.log(coefficients, 1, l, u)),
c(-Inf, breaks), c(breaks, Inf))
observed <- sapply(breaks[-length(breaks)], function(x) sum((counts)[bin.lower <= x])) -
sapply(breaks[-1], function(x) sum((counts)[bin.upper < x]))
chisq.test(c(0, observed, 0), p=fit, simulate.p.value=TRUE)
La sortie est
Chi-squared test for given probabilities with simulated p-value (based on 2000 replicates)
data: c(0, observed, 0)
X-squared = 7.9581, df = NA, p-value = 0.2449
Le logiciel a effectué un test de permutation (ce qui est nécessaire car la statistique du test ne suit pas exactement une distribution khi carré: voir mon analyse sur Comment comprendre les degrés de liberté ). Sa valeur p de0,245, qui n'est pas petite, montre très peu de signes de sortie de la normalité: nous avons des raisons de faire confiance aux résultats du maximum de vraisemblance.