Chi-squared 卡方检验

本文介绍了如何使用卡方检验进行特征选择的方法,包括卡方检验的原理、计算过程及Python实现。通过卡方检验可以量化特征与目标变量之间的关联程度,并筛选出最重要的特征。

卡方检验筛选特征

利用 χ 2 \chi^2 χ2筛选特征时,我们计算每个特征和类标之间的 χ 2 \chi^2 χ2统计量,最后选择 χ 2 \chi^2 χ2分数最高的k个特征。

χ 2 \chi^2 χ2检验

χ 2 \chi^2 χ2独立性检验用于检验两个类别型变量之间是否存在显著的关联关系。

特征x正类负类总计
x = 1 x=1 x=1 A A A B B B A + B = M A+B=M A+B=M
x = 0 x=0 x=0 C C C D D D C + D = N − M C+D=N-M C+D=NM
总计 A + C = P A+C=P A+C=P B + D = N − P B+D=N-P B+D=NP N N N

A , B , C , D A,B,C,D A,B,C,D表示观测到的数量, E A , E B , E C , E D E_A,E_B,E_C,E_D EA,EB,EC,ED分别表示期望值。

原假设:变量之间相互独立
备选假设:变量之间不独立

基于原假设,即变量之间相互独立,那么 x = 1 x=1 x=1出现在正类中的概率应该等于 x = 1 x=1 x=1出现在所有样本中的概率,因此我们有
E A A + C = A + B N ⟹ E A = A + B N ( A + C ) \frac{E_A}{A+C}=\frac{A+B}{N}\Longrightarrow E_A=\frac{A+B}{N}(A+C) A+CEA=NA+BEA=NA+B(A+C)
同理可求出 E A , E B , E C , E D E_A,E_B,E_C,E_D EA,EB,EC,ED

χ 2 \chi^2 χ2统计量的计算公式为:

χ 2 = 1 d ∑ k = 1 K ( O k − E k ) 2 E k = ( A − E A ) 2 E A + ( B − E B ) 2 E B + ( C − E C ) 2 E C + ( D − E D ) 2 E D \chi^2 =\frac{1}{d} \sum_{k=1}^{K}\frac{(O_k-E_k)^2}{E_k}\\ =\frac{(A-E_A)^2}{E_A}+\frac{(B-E_B)^2}{E_B}+\frac{(C-E_C)^2}{E_C}+\frac{(D-E_D)^2}{E_D} χ2=d1k=1KEk(OkEk)2=EA(AEA)2+EB(BEB)2+EC(CEC)2+ED(DED)2

其中 d = ( r o w s − 1 ) ( c o l s − 1 ) = ( 2 − 1 ) ( 2 − 1 ) = 1 d=(rows-1)(cols-1)=(2-1)(2-1)=1 d=(rows1)(cols1)=(21)(21)=1为自由度。

如果我们拒绝原假设 ( p &lt; = t h r e s h o l d ) (p &lt;= threshold) p<=threshold,则特征 x x x在我们模型中是一个重要的变量。

注意使用 χ 2 \chi^2 χ2检验的前提:

  1. 类别型变量
  2. 频率至少为5
  3. 变量独立抽样
Python 中利用 χ 2 \chi^2 χ2检验筛选特征
	# Load libraries
	from sklearn.datasets import load_iris
	from sklearn.feature_selection import SelectKBest
	from sklearn.feature_selection import chi2
	#Load Data
	# Load iris data
	iris = load_iris()
	
	# Create features and target
	X = iris.data
	y = iris.target
	
	# Convert to categorical data by converting data to integers
	X = X.astype(int)
	
	#Compare Chi-Squared Statistics
	# Select two features with highest chi-squared statistics
	chi2_selector = SelectKBest(chi2, k=2)
	X_kbest = chi2_selector.fit_transform(X, y)
	# Show results
	print('Original number of features:', X.shape[1])
	print('Reduced number of features:', X_kbest.shape[1])

t检验和卡方检验

简单介绍T检验和卡方检验
T检验
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。

适用条件:卡方检验适用于分类变量,主要涉及到的是二分类变量的理论值和实际值的检测。

T检验(T Test)是最常见的一种假设检验类型,主要验证总体均值间是否存在显著性差异。T检验属于参数假设检验,所以它适用的范围是数值型的数据,在网站分析中可以是访问数、独立访客数、停留时间等,电子商务的订单数、销售额等。T检验还需要符合一个条件——总体符合正态分布。


参考文献

Chi Square Feature Selection in Python
Chi Square test for feature selection

<think>我们遇到了在进行卡方检验(BMI分类)时,卡方近似计算可能不准确的问题。这通常发生在样本量较小或期望频数过低的情况下。根据统计学原则,当期望频数小于5的单元格比例超过20%,或存在期望频数小于1的单元格时,卡方检验的近似性会变差。此时,我们可以考虑以下改进方法: ### 1. 精确检验法(Fisher精确检验) 当样本量小或存在小期望频数时,Fisher精确检验是理想的替代方法。该检验直接计算所有可能排列的概率,不依赖渐近分布。 **Stata实现**: ```stata tabulate groupvar BMI_level, exact ``` 其中`groupvar`是分组变量(如性别),`BMI_level`是我们创建的BMI分类变量。 ### 2. 合并分类 如果某些BMI类别频数过低,可考虑合并相邻类别(如将“体重过轻”合并到“正常体重”),但需确保合并具有临床意义。 **示例合并**: ```stata recode BMI_level (0=1) (1=1) (2=2) (3=3), gen(BMI_level_merged) ``` 将体重过轻(0)合并到正常体重(1),生成新变量`BMI_level_merged`。 ### 3. 蒙特卡洛模拟 对于大样本但分布不均匀的情况,可使用基于模拟的卡方检验,通过随机置换生成经验分布。 **Stata实现**: ```stata tabulate groupvar BMI_level, exact mc ``` ### 4. 卡方检验的连续性校正(Yates校正) 针对$2\times2$列联表,当样本量小但无法使用Fisher检验时(如表格维度更大),可考虑Yates连续性校正。但在多维表中应用有限。 **Stata实现**(仅适用于$2\times2$表): ```stata tabulate groupvar BMI_level, chi2 expected ``` ### 5. 自助法(Bootstrap) 通过重抽样估计卡方统计量的分布,适用于复杂抽样设计。 **Stata实现**: ```stata bootstrap r(chi2), reps(1000): tabulate groupvar BMI_level, chi2 estat bootstrap, all ``` ### 验证期望频数 进行卡方检验前,务必检查期望频数: ```stata tabulate groupvar BMI_level, expected ``` - **问题判断**:若结果中红色警告(>20%单元格期望频数<5)或出现期望频数<1,则需采用上述替代方法。 ### 实例分析 假设我们研究性别(`sex`)与BMI_level的关系: ```stata * 生成BMI_level(假设已有BMI变量) generate BMI_level = cond(BMI<18.5, 0, cond(BMI<24, 1, cond(BMI<28, 2, 3))) label define bmilab 0 "Underweight" 1 "Normal" 2 "Overweight" 3 "Obese" label values BMI_level bmilab * 检查期望频数 tab sex BMI_level, expected chi2 * 若期望频数不满足条件,采用Fisher精确检验 tab sex BMI_level, exact ``` ### 注意事项 1. **样本量要求**:卡方检验要求总样本量$n \geq 40$且所有期望频数$\geq 5$[^1]。 2. **有序分类处理**:若BMI_level具有等级特性(如从低到高),应考虑趋势卡方检验(Cochran-Armitage检验): ```stata nptrend BMI_level, by(groupvar) exact ``` 3. **复杂设计**:若数据来自分层抽样,需使用`svy: tabulate`校正设计效应。 [^1]: 卡方检验的适用条件包括足够的样本量和期望频数 §§相关问题§§ 1. 在Stata中如何执行Fisher精确检验? 2. 当卡方检验条件不满足时,合并分类的标准是什么? 3. 如何对有序分类变量进行趋势卡方检验? 4. 在复杂抽样设计中如何进行卡方检验? </think> 当卡方检验的期望频数过低时,Chi-squared近似可能不准确,以下是改进卡方检验准确性的方法及Stata实现: ### 一、问题诊断:验证卡方检验条件 首先检查期望频数是否满足条件: ```stata tab groupvar BMI_level, expected chi2 ``` - **判断标准**: 1. 所有单元格期望频数 ≥ 5 2. 当 $n \geq 40$ 但存在 $1 \leq$ 期望频数 $<5$ 的单元格时,需校正 3. 若存在期望频数 $<1$ 或 $>20\%$ 单元格期望频数 $<5$,应使用精确检验 ### 二、解决方案及Stata实现 #### 1. Fisher精确检验(推荐) 当样本量小或期望频数低时,使用精确概率法替代卡方近似: ```stata tab groupvar BMI_level, exact * 或使用蒙特卡洛模拟(大样本时) tab groupvar BMI_level, exact mc reps(10000) ``` #### 2. 连续性校正(Yates校正) 适用于 $2 \times 2$ 列联表: ```stata tab groupvar BMI_level, chi2 expected * 自动应用Yates校正 ``` #### 3. 分类合并 当某些BMI类别频数过低时,合并临床意义相近的类别: ```stata * 示例:合并过轻和正常体重 recode BMI_level (0=1) (1=1) (2=2) (3=3), gen(BMI_level2) tab groupvar BMI_level2, chi2 ``` #### 4. Bootstrap卡方检验 通过重抽样提高准确性: ```stata bootstrap r(chi2), reps(1000): tab groupvar BMI_level, chi2 estat bootstrap, all ``` #### 5. 似然比检验 作为卡方检验的替代: ```stata tab groupvar BMI_level, lrchi2 ``` ### 三、结果解读注意事项 1. **Fisher检验输出**: - 关注 `Fisher's exact =` 后的p值 - 当 $p < 0.05$ 时拒绝原假设 2. **合并分类原则**: - 临床合理性优先(如肥胖类别不应与正常体重合并) - 合并后需重新检验期望频数 ### 四、完整案例 ```stata * 生成BMI_level gen BMI_level = cond(BMI<18.5,0, cond(BMI<24,1, cond(BMI<28,2,3))) * 添加值标签 label define cat 0 "过轻" 1 "正常" 2 "超重" 3 "肥胖" label values BMI_level cat * 检查期望频数 tab gender BMI_level, expected * 执行Fisher精确检验 tab gender BMI_level, exact ``` > **重要提示**:当总样本量 $n < 40$ 或存在期望频数 $<1$ 时,*必须*使用精确检验而非卡方近似[^1]。 [^1]: Fisher精确检验适用于小样本和低期望频数场景
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值