1. 程式人生 > >數理統計14:什麼是假設檢驗,擬合優度檢驗(1),經驗分佈函式

數理統計14:什麼是假設檢驗,擬合優度檢驗(1),經驗分佈函式

在之前的內容中,我們完成了引數估計的步驟,今天起我們將進入假設檢驗部分,這部分內容可參照《數理統計學教程》(陳希孺、倪國熙)。由於本系列為我獨自完成的,缺少審閱,**如果有任何錯誤,歡迎在評論區中指出,謝謝**! [TOC] ## Part 1:什麼是假設檢驗 假設檢驗是一種統計推斷方法,用來判斷樣本與樣本、樣本與總體的差異是由抽樣誤差引起還是本質差別造成的。其步驟,其實就是提出一個假設,然後用抽樣作為證據,判斷這個假設是正確的或是錯誤的,這裡判斷的依據就稱為該假設的一個檢驗。 假設檢驗在數理統計中有重要的用途,比如:橙子的平均重量是80斤,這就是一個假設。我們怎麼才能知道它是對的還是錯的?這需要我們對橙子總體進行抽樣,然後對樣本進行一定的處理,比如計算總體均值的區間估計,如果區間估計不包含80斤,就認為原假設不成立,便拒絕原假設。 當然,由於樣本具有隨機性,因此我們只是對該假設進行**檢驗**而不是證明,也就是說不論假設檢驗的結果是接受假設還是拒絕假設,都不能認為假設本身是正確的或是錯誤的。同時,假設的檢驗也不是唯一確定的,對任何假設都可以有無數種方案進行檢驗,比如上面的例子,$95\%$的區間估計是一種檢驗,$99\%$的區間估計也可以作為檢驗,$90\%$的當然也可以,只要事先確定了即可。 總之,要將實用問題轉化為統計假設檢驗問題處理,一般需要經歷以下幾個步驟: 1. 明確所要處理的問題,將其轉化為二元問題,只能用“是”和“否”來回答。 2. 設計適當的檢驗,規定假設的**拒絕域**,即拒絕假設時樣本$\boldsymbol{X}$會落入的區域範圍(當然也可以是統計量會落入的範圍,這兩個意思是一致的)。 3. 抽取樣本$\boldsymbol{X}$進行觀測,計算需要的統計量的值。 4. 根據樣本的具體值作出接受假設或者否定假設的決定。 以下是假設檢驗問題的一些常用概念: - **零假設**即**原假設**,指的是進行統計檢驗時預先建立的假設,一般是希望證明其錯誤的假設,用字母$H_0$表示。這種區分方式比較玄乎。 - **備擇假設**指的是與原假設所相對立的假設,如果我們拒絕了原假設,就意味著需要接受備擇假設。 - **拒絕域**指的是我們會在什麼時候拒絕原假設,也就是拒絕原假設時樣本所屬的集合,它是樣本空間的一個子集。 在實際生活中,可以作出的假設是多種多樣的,對不同的檢驗問題有不同的方法,我們接下來對其分別進行討論。 ## Part 2:擬合優度檢驗 **擬合優度檢驗**指的是如下的檢驗問題——對於總體$X$和已知的分佈$F$,$H_0$:$X$的分佈為$F$。即用$F(x)$這個分佈函式來擬合樣本$X_1,\cdots,X_n$,擬合的優良程度如何。 對於擬合優度檢驗,其檢驗思想是構造一個統計量$D$,這個統計量刻畫樣本$\boldsymbol{X}=(X_1,\cdots,X_n)$與理論分佈$F$的偏離程度,$D$越大代表理論分佈$F$與樣本表現出來的分佈越不相符。由於在$H_0$成立也就是$X$的分佈為$F$的條件下,$D$作為一個統計量具有確定的抽樣分佈,且這個統計量描述的是擬合的優良程度,自然$D$越小說明擬合得越好。因此,我們這樣定義**擬合優度**:在獲得$\boldsymbol{X}$的情況下計算出$D$的觀測值$D_0$,則擬合優度為 $$ p(D_0)=\mathbb{P}(D\ge D_0|H_0). $$ 直觀地想象擬合優度,由於作為偏離量$D$肯定是非負的,所以如果$D_0$越小,擬合優度就越大,同時這也代表著樣本與理論程度的偏離小,所以**擬合優度可以作為理論分佈$F$是$X$的分佈的可靠性度量**。有了擬合優度之後,如果擬合優度太小,我們就會否定$H_0$,否則接受$H_0$,這需要一個閾值$\alpha$。常常取$\alpha=0.05$,如果擬合優度小於$\alpha$就否定零假設,不過閾值的設定多少是有些主觀的,因此客觀的擬合優度往往比接受和否定的二元回答更有價值。 不過,我們現在還沒有討論偏離量具體應該如何定義,並且偏離量的定義方式也可以多種多樣,因此我們接下來將分情況討論擬合優度檢驗中,偏離統計量$D$的定義。 ### Section 1:離散型(分佈已知) 如果$X$是離散型隨機變數,則可以進一步區分為如下的兩種:有限與可列。我們先討論有限且分佈已知的情況。現在,原假設是$H_0$:$X$服從如下的分佈: $$ F:\begin{pmatrix} a_1 & a_2 & \cdots & a_r \\ p_1 & p_2 & \cdots & p_r \end{pmatrix},\quad \sum_{i=1}^r p_i=1. $$ 適用於這種情況的檢驗是**Pearson的$\chi^2$檢驗**,這是我們所接觸的第一個重要檢驗。以$\nu_i$記所有樣本中取值為$a_i$的個數,稱為**觀察頻數**,即 $$ \nu_i=\#\{j|X_j=a_i\}. $$ 如果樣本容量為$n$,則理論上,應當有以下關係式: $$ p_i\approx \frac{\nu_i}{n},\quad \nu_i\approx np_i. $$ 稱$np_i$為**理論頻數**,如果$H_0$成立,則$|np_i-\nu_i|$對所有$i$都不應該過大,但又不能簡單地取$(np_i-\nu_i)^2$,需要考慮權重問題。Pearson引進如下的統計量,常稱為**Pearson $\chi^2$統計量**,為 $$ K_n=\sum_{i=1}^r\frac{(np_i-\nu_i)^2}{np_i} $$ 這裡,使用$1/np_i$作為權重的調整值,構造出檢驗統計量。使用這個權重的原因是Pearson證明的定理:在$H_0$成立的條件下,有$K_n\stackrel{d}{\to }\chi^2_{r-1}$。由此,如果由樣本計算出$K_n$的觀測值是$k_0$,則擬合優度為 $$ p(k_0)=\mathbb{P}(K_n\ge k_0|H_0)\approx\mathbb{P}(\tilde\chi^2_{r-1}\ge k_0), $$ 這裡$\tilde\chi^2_{r-1}$指的是服從$\chi^2_{r-1}$分佈的隨機變數,這樣擬合優度就可以用$\chi^2$分佈的分位數表近似地計算。實際應用時,我們不一定需要這麼精確的擬合優度,故只要查詢閾值$\alpha$對應的分位數值$\chi^2_{\alpha}(r-1)$,並比較它與$k_0$的大小即可,當$\chi^2_{\alpha}(r-1)\le k_0$時拒絕$H_0$。 > 這裡,我們以書上的例題為例,介紹如何用R語言計算擬合優度。現在$n=556$, > $$ > \begin{matrix} > \nu_i \\ > p_i \\ > np_i > \end{matrix}\begin{pmatrix} > 315 & 108 & 101 & 32 \\ > 9/16 & 3/16 & 3/16 & 1/16 \\ > 312.75 & 104.25 & 104.25 & 34.75 > \end{pmatrix} > $$ > 呼叫自定義函式`pearson.chi2(obersved, prob)`,程式碼見附錄。這個函式將返回一個列表,其中我們所需要的是$\chi^2$統計量的值和擬合優度,故進行如下呼叫: > > ```R > > observed <- c(315, 108, 101, 32) > > prob <- c(9, 3, 3, 1) > > pearson.chi2(observed, prob) > > Pearson chi2 test > > The value of K: 0.470024 > p-value: 0.9254259 > Accept. > ``` > > 這裡,`The value of K`是卡方統計量的值,`p-value`是擬合優度。如果需要進一步使用返回值的其他資訊,這個函式會返回一個列表。 如果$X$是可列的離散隨機變數,則需要對觀測進行**分組**,將其劃分為$r$個區間,這樣就將其轉化為有限的情形。具體地,分組需要讓每一個組內的理論頻數和觀察頻數都不小於5為宜。 ### Section 2:連續型(分佈已知) 如果理論分佈是一個已知的連續型分佈,雖然分組法依然可以解決(具體可以參考書本內容),但是不論如何取分組間隔,都多少遺漏了資訊。對於連續型分佈的驗證,使用**柯爾莫哥洛夫檢驗(柯氏檢驗)**更為合適。為此,我們需要先介紹**經驗分佈函式**。 經驗分佈函式是一個結合了分佈函式的單調、非降、左連續特色的函式,不同的是它可以由樣本計算得出。簡而言之,經驗分佈函式就是將經驗分佈函式中,$F(x)=\mathbb{P}(X< x)$的概率變成頻率。 > 注意,蘇中根《概率論》中,分佈函式的定義是右連續的即$F(x)=\mathbb{P}(X\le x)$,而這裡經驗分佈函式的定義卻是左連續的。不過,將分佈函式定義成左連續或是右連續並不影響使用,我們不妨就遵照左連續的定義。 設$X_1,\cdots,X_n$是$X\sim F$中抽取的簡單隨機樣本,次序統計量為$(X_{(1)},\cdots,X_{(n)})$,則$\forall x$,定義以下函式為經驗分佈函式: $$ F_n(x)=\left\{\begin{array}l 0,& x\le X_{(1)};\\ \frac{k}{n},& X_{(k)}
對於每一個**確定的$x$**,易知 $$ F_n(x)=\frac{1}{n}\sum_{i=1}^n I_{-\infty0. $$ 注意這個$D_n$,它顯然可以用來描述經驗分佈與理論分佈的偏離程度,因此我們顯然可以用它入手來完善擬合優度檢驗理論。柯氏檢驗就是建立在經驗分佈函式基礎上的,此時我們取理論分佈為$F$計算$D_n=\sup\limits_{x\in\mathbb{R}}|F_n(x)-F(x)|$,再根據確定的閾值$\alpha$,讓$K(\lambda)=\alpha$找到合適的$\lambda$,則檢驗的臨界值就是 $$ D_{n,\alpha}=\frac{\lambda}{\sqrt{n}}=\frac{K^{-1}(1-\alpha)}{\sqrt{n}}. $$ 由於經驗分佈函式是階梯型的,真實的分佈函式又是單調的,所以$D_n$必定出在各個$X_i$的觀測值處,具體地有 $$ D_n=\max\left\{\left|F_0(x_{(i)})-\frac{i-1}{n} \right|,\left|F_0(x_{(i)})-\frac{i}{n} \right|,\quad \forall i=1,2,\cdots,n \right\}. $$ > R語言提供了Kolmogorov-Smirnov檢驗函式`ks.test(x, y)`,其中斯米爾諾夫檢驗適用於檢驗兩組樣本是否同分布的。以書上例題為例,可以如下呼叫: > > ```R > > num <- c(0.034, 0.437, 0.863, 0.964, 0.366, 0.469, 0.637, 0.632, 0.804, 0.261) # 書本誤將0.437打成了0.0437,可以在底下的計算表中看出 > > ks.test(num, qunif) > > One-sample Kolmogorov-Smirnov test > > data: num > D = 0.166, p-value = 0.9052 > alternative hypothesis: two-sided > ``` > > 如果我們需要驗證的已知分佈,則`ks.test`的第二個引數直接用分佈的名稱即可(採用預設引數,如果不是預設的$U(0,1)$或者$N(0,1)$則對樣本資料作變換)。 --- 今天,我們介紹了擬合優度檢驗的部分內容,由於篇幅所限,擬合優度檢驗的剩餘部分將放到下一篇文章中介紹。關於Pearson $\chi^2$獨立性檢驗的函式,我將其放到附錄中,在使用時可以用`source()`函式訪問,也可以直接將函式複製執行。 ## 附錄: ### 1、經驗分佈函式繪製 ```R rm(list=ls()) dev.off() opar <- par(no.readonly = T) x <- seq(0,6,0.001) y <- pexp(x, rate = 2) par(mfrow = c(2,2)) plot.ecdf(rexp(10, 2), cex=0.1, main = "10 samples") lines(x, y, col='red') plot.ecdf(rexp(50, 2), cex=0.1, main = "50 samples") lines(x, y, col='red') plot.ecdf(rexp(100, 2), cex=0.1, main = "100 samples") lines(x, y, col='red') plot.ecdf(rexp(200, 2), cex=0.1, main = "200 samples") lines(x, y, col='red') ``` ### 2、自定義函式`pearson.chi2()` ```R pearson.chi2 <- function(x, p, alpha=0.05){ # x是實際頻數,p是概率列表,alpha是閾值 rt <- list() r <- length(x) # 可能出現的情況 p <- p / sum(p) # 歸一化概率列表 n <- sum(x) # 總數 np <- n*p # 理論頻數 rt$observed <- x rt$dim <- r rt$total.observed <- n rt$prob <- p rt$expect <- np K <- 0 for (i in 1:r){ K = K + (np[i]-x[i])^2/np[i] } rt$pearson.chi2 <- K p.value <- 1 - pchisq(K, df=r-1) rt$p.value <- p.value cat("\n\tPearson chi2 test\n\n") cat("The value of K: ", K, "\n") cat("p-value: ", p.value, "\n") if (p.value > alpha){ cat("Accept.\n") } else{ cat("Reject.\n") } lst <- r