该答复提出了两种解决方案:谢泼德的更正和最大似然估计。 两者都非常接近标准偏差的估计值:第一个为,第二个为7.69(经过调整后可与通常的“无偏”估计量进行比较)。7.707.69
谢泼德的更正
“ Sheppard的更正”是用于调整根据合并数据(如此类)计算的矩的公式,其中
假定数据受有限间隔[ a ,b ]上支持的分布控制[a,b]
将该间隔依次划分为公共宽度相对较小的相等单元(没有单元包含所有数据的很大一部分)h
分布具有连续密度函数。
它们是从Euler-Maclaurin和公式得出的,该公式根据在规则间隔的点处被积物的值的线性组合来近似积分,因此通常适用(并且不仅适用于正态分布)。
尽管严格说来,在有限的间隔内不支持正态分布,但是非常接近。本质上,其所有概率都包含在平均值的七个标准偏差之内。因此,谢泼德的修正适用于假定来自正态分布的数据。
前两个Sheppard的更正是
将合并数据的平均值用作数据的平均值(即,不需要对该平均值进行校正)。
h2/12
h2/12h−h/2h/2h2/12
让我们进行计算。我R
用来说明它们,首先指定计数和容器:
counts <- c(1,2,3,4,1)
bin.lower <- c(40, 45, 50, 55, 70)
bin.upper <- c(45, 50, 55, 60, 75)
用于计数的正确公式是通过按计数给定的数量来复制箱宽度。也就是说,合并的数据等于
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
最大似然估计
Fθθ(x0,x1]kFθ
log∏i=1k(Fθ(x1)−Fθ(x0))=klog(Fθ(x1)−Fθ(x0))
(请参阅MLE /对数正态分布区间的可能性)。
Λ(θ)θ^−Λ(θ)θR
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
验证假设
为了可视化这些结果,我们可以在直方图中绘制拟合的法线密度:
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
χ2χ2R
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)
输出是
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
0.245