Đây là một ý tưởng hấp dẫn, bởi vì công cụ ước tính độ lệch chuẩn dường như ít nhạy cảm hơn với các ngoại lệ so với các phương pháp bình phương gốc thông thường. Tuy nhiên, tôi nghi ngờ công cụ ước tính này đã được công bố. Có ba lý do tại sao: nó không hiệu quả về mặt tính toán, nó bị sai lệch và ngay cả khi độ lệch được sửa, nó không hiệu quả về mặt thống kê (nhưng chỉ một chút). Chúng có thể được nhìn thấy với một phân tích sơ bộ nhỏ, vì vậy hãy làm điều đó trước và sau đó rút ra kết luận.
Phân tích
Các ước lượng ML của giá trị trung bình và độ lệch chuẩn σμσ dựa trên dữ liệu là(xi,xj)
μ^(xi,xj)=xi+xj2
và
σ^(xi,xj)=|xi−xj|2.
Do đó phương pháp được mô tả trong câu hỏi là
μ^(x1,x2,…,xn)=2n(n−1)∑i>jxi+xj2=1n∑i=1nxi,
đó là công cụ ước tính thông thường của giá trị trung bình và
σ^(x1,x2,…,xn)=2n(n−1)∑i>j|xi−xj|2=1n(n−1)∑i,j|xi−xj|.
E=E(|xi−xj|)ij
E(σ^(x1,x2,…,xn))=1n(n−1)∑i,jE(|xi−xj|)=E.
xixj2σ22–√σχ(1)2/π−−−√
E=2π−−√σ.
Hệ số 2/π−−√≈1.128 là thiên vị trong ước lượng này.
σ^ , nhưng - như chúng ta sẽ thấy - có vẻ không phải là nhiều sự quan tâm trong việc này, vì vậy tôi sẽ chỉ là ước tính nó với một mô phỏng nhanh chóng.
Kết luận
σ^n=20,000 cả hai công cụ ước tính sai lệch và sai lệch được vẽ trên biểu đồ. Lỗi 13% là rõ ràng.
∑i,j|xi−xj|O(n2)O(n)n10,000 hoặc hơn. Chẳng hạn, tính toán con số trước đó cần 45 giây thời gian CPU và 8 GB RAMR
. (Trên các nền tảng khác, các yêu cầu về RAM sẽ nhỏ hơn nhiều, có lẽ với chi phí nhỏ trong thời gian tính toán.)
Đó là thống kê không hiệu quả. Để hiển thị tốt nhất, hãy xem xét phiên bản không thiên vị và so sánh nó với phiên bản không thiên vị của công cụ ước lượng bình phương nhỏ nhất hoặc ước lượng tối đa
σ^OLS=(1n−1∑i=1n(xi−μ^)2)−−−−−−−−−−−−−−−−−−⎷(n−1)Γ((n−1)/2)2Γ(n/2).
R
n=3n=300σ^OLSσ
Sau đó
σ^
Mã
sigma <- function(x) sum(abs(outer(x, x, '-'))) / (2*choose(length(x), 2))
#
# sigma is biased.
#
y <- rnorm(1e3) # Don't exceed 2E4 or so!
mu.hat <- mean(y)
sigma.hat <- sigma(y)
hist(y, freq=FALSE,
main="Biased (dotted red) and Unbiased (solid blue) Versions of the Estimator",
xlab=paste("Sample size of", length(y)))
curve(dnorm(x, mu.hat, sigma.hat), col="Red", lwd=2, lty=3, add=TRUE)
curve(dnorm(x, mu.hat, sqrt(pi/4)*sigma.hat), col="Blue", lwd=2, add=TRUE)
#
# The variance of sigma is too large.
#
N <- 1e4
n <- 10
y <- matrix(rnorm(n*N), nrow=n)
sigma.hat <- apply(y, 2, sigma) * sqrt(pi/4)
sigma.ols <- apply(y, 2, sd) / (sqrt(2/(n-1)) * exp(lgamma(n/2)-lgamma((n-1)/2)))
message("Mean of unbiased estimator is ", format(mean(sigma.hat), digits=4))
message("Mean of unbiased OLS estimator is ", format(mean(sigma.ols), digits=4))
message("Variance of unbiased estimator is ", format(var(sigma.hat), digits=4))
message("Variance of unbiased OLS estimator is ", format(var(sigma.ols), digits=4))
message("Efficiency is ", format(var(sigma.ols) / var(sigma.hat), digits=4))
x <- c(rnorm(30), rnorm(30, 10))