調和平均の標準偏差を計算できますか?算術平均の標準偏差を計算できることを理解していますが、調和平均がある場合、標準偏差またはCVをどのように計算しますか?
調和平均の標準偏差を計算できますか?算術平均の標準偏差を計算できることを理解していますが、調和平均がある場合、標準偏差またはCVをどのように計算しますか?
回答:
調和平均確率変数のは、は次のように定義されます
分数の瞬間を取ることは厄介なビジネスなので、代わりに私は作業することを好みます。今
Usinの中心極限定理はすぐにわかります
もちろん、変数aの算術平均Y i = X − 1 iで簡単に作業できるため、およびはiid です。
関数にデルタ法を使用すると、
この結果は漸近的ですが、単純なアプリケーションではそれで十分かもしれません。
更新 @whuberが正しく指摘しているように、単純なアプリケーションは誤称です。中心極限定理は、が存在する場合にのみ成立します。これは非常に制限的な仮定です。
hm <- function(x)1/mean(1/x)
sdhm <- function(x)sqrt((mean(1/x))^(-4)*var(1/x)/length(x))
n<-1000
nn <- c(10,30,50,100,500,1000,5000,10000)
N<-1000
mc<-foreach(n=nn,.combine=rbind) %do% {
rr <- matrix(runif(n*N,min=2,max=3),nrow=N)
c(n,mean(apply(rr,1,sdhm)),sd(apply(rr,1,sdhm)),sd(apply(rr,1,hm)))
}
colnames(mc) <- c("n","DeltaSD","sdDeltaSD","trueSD")
> mc
n DeltaSD sdDeltaSD trueSD
result.1 10 0.089879211 1.528423e-02 0.091677622
result.2 30 0.052870477 4.629262e-03 0.051738941
result.3 50 0.040915607 2.705137e-03 0.040257673
result.4 100 0.029017031 1.407511e-03 0.028284458
result.5 500 0.012959582 2.750145e-04 0.013200580
result.6 1000 0.009139193 1.357630e-04 0.009115592
result.7 5000 0.004094048 2.685633e-05 0.004070593
result.8 10000 0.002894254 1.339128e-05 0.002964259
サイジングされたサンプルのN
サンプルをシミュレートしましたn
。各n
サイズのサンプルについて、標準推定の推定値を計算しました(関数sdhm
)。次に、これらの推定の平均と標準偏差を、各サンプルについて推定された調和平均のサンプル標準偏差と比較します。これは、おそらく調和平均の真の標準偏差であるべきです。
ご覧のとおり、中程度のサンプルサイズでも結果は非常に良好です。もちろん、均一な分布は非常に行儀のよい分布であるため、結果が良好であることは当然のことです。他のディストリビューションの動作を調査するために誰かに任せます。コードは非常に簡単に適応できます。
注:この回答の以前のバージョンでは、デルタ法の結果にエラーがあり、不正確な分散がありました。
主な欠点は、計算が大きく歪んだ基礎となる分布に対して良い信頼区間を生成しないことです。これは、あらゆる汎用的な方法で問題になる可能性があります。調和平均は、データセット内の単一の小さな値の存在にも敏感です。
ここでR
、シミュレーションと数字のコードが。
k <- 5 # Gamma parameter
n <- 12 # Sample size
hm <- k-1 # True harmonic mean
set.seed(17)
t.crit <- -qt(0.05/2, n-1)
par(mfrow=c(4, 5))
for(i in 1:20) {
#
# Generate a random sample.
#
x <- rgamma(n, k)
#
# Estimate the harmonic mean.
#
fit <- lm(x ~ 1, weights=1/x)
beta <- coef(summary(fit))[1, ]
message("Harmonic mean estimate is ", signif(beta["Estimate"], 3),
" +/- ", signif(beta["Std. Error"], 3))
#
# Plot the results.
#
covers <- abs(beta["Estimate"] - hm) <= t.crit*beta["Std. Error"]
plot(ecdf(x), main="Empirical CDF", sub=ifelse(covers, "", "***"))
rect(beta["Estimate"] - t.crit*beta["Std. Error"], 0,
beta["Estimate"] + t.crit*beta["Std. Error"], 1.25,
border=NA, col=gray(0.5, alpha=0.10))
abline(v = hm, col="Blue", lwd=2)
abline(v = beta["Estimate"], col="Red", lty=3, lwd=2)
}