我可以假設這個樣本的(對數)正態性嗎?
這是我的樣本的 QQ 圖(注意對數 Y 軸);:
正如 whuber 所指出的,這表明底層分佈是左偏的(右尾較短)。
在 R 中使用
shapiro.test
(在對數轉換後的數據上),我得到了一個測試統計量和 p 值,這意味著我們正式拒絕原假設在 95% 的置信水平。我的問題是:這在實踐中是否足以進行假設(對數)正態性的進一步分析?特別是,我想使用 Cox 和 Land 的近似方法計算相似樣本均值的置信區間(在論文中描述:Zou, GY, cindy Yan Huo and Taleban, J. (2009)。簡單的置信區間對數正態平均值及其與環境應用的差異。Environmetrics 20, 172–180):
ci <- function (x) { y <- log(x) n <- length(y) s2 <- var(y) m <- mean(y) + s2 / 2 z <- qnorm(1 - 0.05 / 2) # 95% #z <- qnorm(1 - 0.10 / 2) # 90% d <- z * sqrt(s2 / n + s2 * s2 / (2 * (n - 1))) return(c(exp(m - d), exp(m + d))) }
我注意到置信區間往往以略高於實際樣本均值的點為中心。例如:
> mean(x) [1] 82.3076 > y <- log(x) > exp(mean(y) + var(y) / 2) [1] 91.22831
我認為這兩個值應該是相同的.
與對數正態分佈相比,這些數據具有短尾,與 Gamma 分佈不同:
set.seed(17) par(mfcol=c(1,1)) x <- rgamma(500, 1.9) qqnorm(log(x), pch=20, cex=.8, asp=1) abline(mean(log(x)) + .1,1.2*sd(log(x)), col="Gray", lwd=2)
然而,由於數據強烈右偏,我們可以預期最大值在估計均值及其置信區間中發揮重要作用。因此**,我們應該預期對數正態 (LN) 估計量會傾向於高估均值和兩個置信限**。
讓我們檢查一下,為了比較,使用通常的估計量:即樣本均值及其正態理論置信區間。請注意,通常的估計器僅依賴於樣本均值的近似正態性,而不是數據的近似正態性,並且 - 對於如此大的數據集 - 可以預期效果很好。為此,我們需要對
ci
函數稍作修改:ci <- function (x, alpha=.05) { z <- -qnorm(alpha / 2) y <- log(x); n <- length(y); s2 <- var(y) m <- mean(y) + s2 / 2 d <- z * sqrt(s2 / n + s2 * s2 / (2 * (n - 1))) exp(c(mean=m, lcl=m-d, ucl=m+d)) }
這是正常理論估計的並行函數:
ci.u <- function(x, alpha=.05) { mean(x) + sd(x) * c(mean=0, lcl=1, ucl=-1) / sqrt(length(x)) * qnorm(alpha/2) }
應用於這個模擬數據集,輸出是
> ci(x) mean lcl ucl 2.03965 1.87712 2.21626 > ci.u(x) mean lcl ucl 1.94301 1.81382 2.07219
ci.u
看起來更接近真實平均值的正態理論估計,但很難從一個數據集中判斷哪個過程效果更好。為了找出答案,讓我們模擬很多數據集:trial <- function(n=500, k=1.9) { x <- rgamma(n, k) cbind(ci(x), ci.u(x)) } set.seed(17) sim <- replicate(5000, trial())
我們有興趣將輸出與真實平均值進行比較. 一組直方圖揭示了這方面:
xmin <- min(sim) xmax <- max(sim) h <- function(i, ...) { b <- seq(from=floor(xmin*10)/10, to=ceiling(xmax*10)/10, by=0.1) hist(sim[i,], freq=TRUE, breaks=b, col="#a0a0FF", xlab="x", xlim=c(xmin, xmax), ...) hist(sim[i,sim[i,] >= 1.9], add=TRUE,freq=TRUE, breaks=b, col="#FFa0a0", xlab="x", xlim=c(xmin, xmax), ...) } par(mfcol=c(2,3)) h(1, main="LN Estimate of Mean") h(4, main="Sample Mean") h(2, main="LN LCL") h(5, main="LCL") h(3, main="LN UCL") h(6, main="UCL")
現在很清楚,對數正態程序傾向於高估平均值和置信限,而通常的程序做得很好。我們可以估計置信區間程序的覆蓋範圍:
> sapply(c(LNLCL=2, LCL=5, LNUCL=3, UCL=6), function(i) sum(sim[i,] > 1.9)/dim(sim)[2]) LNLCL LCL LNUCL UCL 0.2230 0.0234 1.0000 0.9648
這個計算說:
- LN 下限在大約 22.3% 的時間(而不是預期的 2.5%)中無法覆蓋真實平均值。
- 通常的下限在大約 2.3% 的情況下無法覆蓋真實平均值,接近預期的 2.5%。
- LN 上限將始終超過真實平均值(而不是按預期在 2.5% 的時間內低於該平均值)。這使其成為雙邊 100% - (22.3% + 0%) = 77.7% 置信區間,而不是 95% 置信區間。
- 通常的上限在 100 - 96.5 = 3.5% 的時間裡無法覆蓋真實平均值。這比預期值 2.5% 略大。因此,通常的限制包括雙邊 100% - (2.3% + 3.5%) = 94.2% 置信區間,而不是 95% 置信區間。
對數正態區間的標稱覆蓋率從 95% 減少到 77.7% 是可怕的。對於通常的區間,降低到 94.2% 一點也不差,這可以歸因於(原始數據的,而不是它們的對數)偏度的影響。
我們必須得出結論,對平均值的進一步分析不應假設對數正態性。
當心!某些過程(例如預測限)對偏度的影響比這些均值的置信限更敏感,因此可能需要考慮它們的偏態分佈。但是,對於幾乎任何預期的分析,對數正態過程似乎不太可能在這些數據上表現良好。