卡方檢驗中的p值計算 - CSDN

2021-01-18 CSDN技術社區


卡方檢驗作為一種常見的假設檢驗,在統計學中的地位是顯而易見的,如果你還不太清楚可以參看這篇博文:卡方檢驗用於特徵選擇,寫的非常的淺顯易懂,如果你還想再擴展點卡方檢驗方面的知識,可以參看這篇博文卡方檢驗基礎,寫的也很有意思。前輩的功底都很深厚,小弟就就不再闡述卡方檢驗的原理、意義及如何計算了,理解了其實很簡單就那麼個公式,再根據實際業務場景關鍵看你選擇哪一個。從chi-squared value 到p-value,相信大多數同學和我一樣,查表,因為大學課本上就是這麼寫的。假如在實際業務場景中,自由度和顯著性水準都不確定的情況下,怎麼辦呢?查表就顯得不那麼地道了。

這時可能很多同學想到了著名的fisher精確檢驗,因為這個檢驗能直接求出的精確的p-value,但是在檢驗數據樣本比較大的情況下,fisher精確檢驗的計算複雜度會讓你顯得那麼的力不從心,本系列的後面將會講到fisher精確檢驗的原理並給出其源碼及與chi-squared的效率對比。還是抓緊時間侃侃怎麼通過chi-squared計算p-value吧,估計心急的同學就等不及了。ok,咱們攻城師還是用代碼說話,先上代碼:

public double chisqr2pValue(int dof, double chi_squared) { if (chi_squared < 0 || dof < 1) { return 0.0; } double k = ((double) dof) * 0.5; double v = chi_squared * 0.5; if (dof == 2) { return Math.exp(-1.0 * v); } double incompleteGamma = IncompleteGamma.log_igf(k,v); // 如果過小或者非數值或者無窮 if (Math.exp(incompleteGamma) <= 1e-8 || Double.isNaN(Math.exp(incompleteGamma)) || Double.isInfinite(Math.exp(incompleteGamma))) { return 1e-14; } double gamma = Math.log(Gamma.getApproxGamma(k)); incompleteGamma -= gamma; if(Math.exp(incompleteGamma) > 1){ return 1e-14; } double pValue = 1.0 - Math.exp(incompleteGamma); return (double) pValue;}


這個chisqr2pValue函數引用到了兩個函數,一個為getApproxGamma(k) 一個為log_igf(k,v),如果你對該函數的實現原理不太清楚,wiki中侃的很清楚:卡方分布,本文也不再闡述卡方分布的密度函數、自由度等等;具體求P-value說白了就是計算卡方分布的分布函數值,如下的公式:


其中,分子為不完全伽馬函數,分母為伽馬函數;那麼上述chisqu2pvalue就是實現了上述公式。Ok,現在的問題轉換為怎麼求分子與分母。

在兩年前我曾為了實現伽馬函數的功能代碼敲個積分,但是效果不太理想。但,今天發現個利器:斯特靈公式,估計大多數同學跟我一樣,第一感覺斯特靈公式不是用來求階乘的嗎?不錯,確實是,在實現fisher時我也用到了斯特靈公式;可是哥們確實有點孤陋寡聞,斯特靈還有個求伽馬函數的近似公式,如下:


如果你想了解詳細的斯特靈公式的推導信息,也是參考wiki:斯特林公式 是不是覺得維基太牛逼了?好吧,還是趕緊上代碼:

public static double getApproxGamma(double n) { // RECIP_E = (E^-1) = (1.0 / E) double RECIP_E = 0.36787944117144232159552377016147; // TWOPI = 2.0 * PI double TWOPI = 6.283185307179586476925286766559; double d = 1.0 / (10.0 * n); d = 1.0 / ((12* n) - d); d = (d + n) *RECIP_E; d = Math.pow(d,n); d *= Math.sqrt(TWOPI/ n); return d; }



好,剩下的就差不完全伽馬函數沒有解了,怎麼求?問大神wiki:不完全伽馬函數 哎呦,在裡面又發現個牛逼的不用計算積分的公式:


而M函數為什麼呢?就是傳聞中的合連幾何函數,如果對這個函數感興趣的可以繼續參考wiki:合連幾何函數 ,不過這裡我們依舊只使用它的一個公式:


Ok,公式知道了,代碼實現就很簡單了,只不過在這裡為了便於大數的計算,我採用了計算其log值,代碼如下:

public static double log_igf(double s, double z) { if (z < 0.0) { return 0.0; } double sc = (Math.log(z) * s) - z - Math.log(s); double k = KM(s, z); return Math.log(k) + sc; } private static double KM(double s, double z) { double sum = 1.0; double nom = 1.0; double denom = 1.0; double log_nom = Math.log(nom); double log_denom = Math.log(denom); double log_s = Math.log(s); double log_z = Math.log(z); for (int i = 0; i < 1000; ++i) { log_nom += log_z; s++; log_s = Math.log(s); log_denom += log_s; double log_sum = log_nom - log_denom; sum += Math.exp(log_sum); } return sum; }


Ok,簡單吧?!以後你再也不用坑爹地查表了。下一篇再介紹下fisher精確檢驗吧。

 


相關焦點

  • 卡方檢驗結果分析專題及常見問題 - CSDN
    R語言卡方檢驗與結果可視化1,卡方分析簡介與實例2,R語言chisq.test()3,基於ggstatsplot包的可視化分析卡方分析簡介與實例:卡方檢驗是生物學中應用很廣的一種假設檢驗,可以通過對構成比,率進行檢驗,進而判斷分類資料間的偏差程度。
  • 卡方分布與卡方檢驗
    本文轉載自CSDNsselssbh的卡方分布與卡方檢驗 https://blog.csdn.net/bitcarmanlee
  • 卡方檢驗相關性專題及常見問題 - CSDN
    但是,在某種程度上,這個過程會非常緩慢,計算量會以平方級別增長,因為我們要計算的是每對特徵之間的互信息量。 卡方檢驗和卡方分布卡方檢驗是一種用途很廣的計數資料的假設檢驗方法。它屬於非參數檢驗的範疇,主要是比較兩個及兩個以上樣本率( 構成比)以及兩個分類變量的關聯性分析。其根本思想就是在於比較理論頻數和實際頻數的吻合程度或擬合優度問題。
  • python卡方檢驗 - CSDN
    卡方檢驗可以用於判斷兩個類別變量的相關性是否顯著。在分類的應用場景中可以用卡方檢驗選擇特徵,特徵與目標變量的相關性越顯著說明特徵越重要,預測力越強。      一、先簡單介紹一下卡方檢驗的步驟。假設y為目標變量,取值為好和壞,x為特徵變量取值為高、中、低。
  • spss卡方_spss卡方檢驗 - CSDN
    3、設置輸出的結果,點擊statistics,打開一個新的對話框   4、勾選chi-square(卡方檢驗),勾選phi and cramer's V(衡量交互分析中兩個變量關係強度的指標),點擊continue,回到交叉表對話框   5、點擊cells,設置cell中要展示的數據
  • 為什麼卡方值是0,p值是1?
    ——《推拿》有個老師在做卡方檢驗的時候,做出來的卡方值是0,p值也接近1 了,自我感覺不太對,就來諮詢我,我索性把這個做一個統一的講解。(數據為亂編,如有雷同,純屬巧合。)這是SPSS錄入數據的界面,檢驗一下兩組之間性別人數是否有差異。
  • 統計學常用概念|T檢驗、F檢驗、卡方檢驗、P值、自由度
    專業上,p值為結果可信程度的一個遞減指標,p值越大,我們越不能認為樣本中變量的關聯 是總體中各變量關聯的可靠指標。p值是將觀察結果認為有效即具有總體代表性的犯錯概率。如p=0.05提示樣本中變量關聯有5%的可能是由於偶然性造成 的。即假設總體中任意變量間均無關聯,我們重複類似實驗,會發現約20個實驗中有一個實驗,我們所研究的變量關聯將等於或強於我們的實驗結果。
  • 卡方檢驗在實際工作中的應用
    卡方檢驗是以χ2分布為基礎的一種常用假設檢驗方法,統計樣本的實際觀測值與理論推斷值之間的偏離程度,主要在分類數據資料統計推斷中應用,如兩個或多個率/構成比之間的比較以及分類資料的相關分析等。p值(多設定為0.05)及自由度,根據χ2分布查出拒絕H0假設的臨界值;若計算得χ2>臨界值,即H0成立的概率<5%,表示在95%置信水平下,觀察值與理論值之間有顯著差異;反之,則說明兩者無差異。
  • f檢驗的p值大於 - CSDN
    F值和t值就是這些統計檢定值,與它們相對應的概率分布,就是F分布和t分布。統計顯著性(sig)就是出現目前樣本這結果的機率。2,統計學意義(P值或sig值)結果的統計學意義是結果真實程度(能夠代表總體)的一種估計方法。專業上,p值為結果可信程度的一個遞減指標,p值越大,我們越不能認為樣本中變量的關聯 是總體中各變量關聯的可靠指標。
  • f檢驗求p值 - CSDN
    F值和t值就是這些統計檢定值,與它們相對應的概率分布,就是F分布和t分布。統計顯著性(sig)就是出現目前樣本這結果的機率。2,統計學意義(P值或sig值)結果的統計學意義是結果真實程度(能夠代表總體)的一種估計方法。專業上,p值為結果可信程度的一個遞減指標,p值越大,我們越不能認為樣本中變量的關聯 是總體中各變量關聯的可靠指標。
  • python 卡方檢驗專題及常見問題 - CSDN
    卡方檢驗可以用於判斷兩個類別變量的相關性是否顯著。在分類的應用場景中可以用卡方檢驗選擇特徵,特徵與目標變量的相關性越顯著說明特徵越重要,預測力越強。      一、先簡單介紹一下卡方檢驗的步驟。假設y為目標變量,取值為好和壞,x為特徵變量取值為高、中、低。
  • 每天學習一點R:44.卡方檢驗
    卡方檢驗卡方檢驗就是統計樣本的實際觀測值與理論推斷值之間的偏離程度
  • r語言卡方檢驗算法_r語言符號檢驗算法 - CSDN
    p是原假設落在小區間的理論概率,預設值表示均勻分布,rescale.p是邏輯變量,選擇FALSE(預設值)時,要求輸入的p滿足和等於1;選擇TRUE時,並不要求這一點,程序將重新計算p值。simulate.p.value邏輯變量(預設值為FALSE),當為TRUE,將用仿真的方法計算p值,此時,B表示仿真的此值。
  • r語言的p值檢驗 - CSDN
    前文連結:醫學統計與R語言:多列分組正態性檢驗醫學統計與R語言:標準Z值一定服從標準正態分布?醫學統計與R語言:對數正態分布與卡方分布醫學統計與R語言:qvalue醫學統計與R語言:Meta 回歸作圖(Meta regression Plot)醫學統計與R語言:aggregate.plot了解一下醫學統計與R語言:有序Probit回歸(Ordered Probit Model)醫學統計與R語言:Probit回歸模型及邊際效應
  • SPSS教程:分層卡方檢驗(各層的OR值如何計算?咋報告結果?)
    針對這個問題,有小夥伴在留言中問到,如何判斷層間OR值是否一致呢?是否有相關的統計學方法來進行檢驗呢?如果層間OR值同質,又該如何計算合併的OR值呢?這個時候,卡方檢驗家族就要派「分層卡方檢驗」上場了,本期內容就來向大家進行詳細介紹。
  • 卡方檢驗原理與應用實例
    本文簡單介紹卡方檢驗的原理和兩個類型的卡方檢驗實例。Ai為i水平的觀察頻數,Ei為i水平的期望頻數,n為總頻數,pi為i水平的期望頻率。i水平的期望頻數Ti等於總頻數n×i水平的期望概率pi,k為單元格數。
  • 卡方檢驗多種用途總結
    >使用路徑:醫學研究→卡方擬合優度檢驗(3)設置期望值:不勾選【期望值設置】,系統會默認各比例相等,本例中期望比例為4:6,所以需要手動設置。上表格顯示,男女的實際頻數分別是48和52,預期頻數分別是40和60;經過卡方擬合優度檢驗顯示,實際比例和期望比例並沒有呈現出顯著性差異(X2=2.667,p=0.102>0.05),意味著實際情況與期望情況基本一致,無明顯的差異性。
  • r語言卡方檢驗和似然比檢驗_r語言似然比檢驗代碼 - CSDN
    反過來,它也可以幫助你在給定置信度水平情況下,計算在某樣本量內能檢測到給定效應值的概率。如果概率低得難以接受,修改或者放棄這個實驗將是一個明智的選擇。本章中將學習如何對多種統計檢驗進行功效分析,包括比例檢驗、t檢驗、卡方檢驗、平衡的單因素ANOVA、相關性分析,以及線性模型分析。
  • python 卡方專題及常見問題 - CSDN
    卡方檢驗是一種用途很廣的計數資料的假設檢驗方法。它屬於非參數檢驗的範疇,主要是比較兩個及兩個以上樣本率( 構成比)以及兩個分類變量的關聯性分析。其根本思想就是在於比較理論頻數和實際頻數的吻合程度或擬合優度問題。
  • 卡方檢驗
    ,採用非參數檢驗進行組間比較。選擇Analyze - Descriptive Statistics - Crosstabs 將分組變量group放入Row(s)框中→將變量sex放入Column(s)框中; 在Crosstabs: Statistics框中:勾選Chi-square,然後點擊Continue點擊Cells,激活Crosstabs: Cell display框,勾選Observed和Expected,勾選Row,點擊