【统计学】分类数据分析——拟合优度检验

        今天在做拟合优度检验时,一直都使用手动的代码编写计算,忽然发现scipy包中已经封装好了现成的,就想记录一下新发现。并给出实例使用吧!

1、卡方统计量

        在分类数据分析中,进行拟合优度检验时,一般使用卡方(Chi-squared)拟合优度统计量。这是因为拟合优度检验用于检查观察值与理论期望值之间的偏离程度,特别是在一个分类变量中的多个类别之间。

1.1、计算公式

\chi ^{2}=\sum\frac{(f_{0}-f_{e})^{2}}{f_{e}}

其中f_{0}:观察值频数;f_{e}:期望值频数 ;

1.2、代码实现

        chi2_contingency是Python中scipy.stats库中的一个函数,用于执行卡方独立性检验和卡方拟合优度检验。这个函数可以用于分析分类数据中的两个或多个分类变量之间的关系,以确定它们是否相互独立或是否符合预期的分布。

自由度 = (Row-1)(Column-1)

import pandas as pd
from scipy.stats import chi2_contingency

# 创建一个示例DataFrame
data = {
    'Column1': [31,8,12,10],
    'Column2': [13,16,10,5],
    'Column3': [16,7,17,7]
}
index = ['row1', 'row2', 'row3','row4']
df = pd.DataFrame(data, index=index)

# 计算卡方统计量
chi2, p, dof, expected = chi2_contingency(df)

print("卡方统计量:", chi2)
print("p值:", p)
print("自由度:", dof)
print("期望频数:", expected)

2、示例

        以下列表格4\times3的列联表为例,检验所学专业是否影响其所选课程,显著性水平为0.05 

会计统计市场营销总计
专业一31131660
专业二

8

16731
专业三12101739
专业四105722
总计614447152

原假设:\pi _{1}=\pi_{2}=\pi_{3}=\pi_{4}

备择假设:\pi_{1}\pi_{2}\pi_{3}\pi_{4} 不完全相同

 2.1、计算实现

f_{e} 的计算方法:行总和\times列总和\div总样本量(以第一个单元为例)

f_{e11}=\frac{61\times 60}{152}=24.0789

        计算每一个f_{0}f_{e}的值得到如下:

f_{0}31131681671210171057
f_{e}24171912910161112967
f_{0}-f_{e}7-4-3-47-3-4-15110
(f_{0}-f{e})^2491691649916125110
\frac{(f_{0}-f{e})^2}{f_{e}}\frac{49}{24}\frac{16}{17}\frac{9}{19}\frac{4}{3}\frac{49}{9}\frac{9}{10}1\frac{1}{11}\frac{25}{12}\frac{1}{9}\frac{1}{6}0

故:卡方统计量 = 14.58 (最后一行全加起来就是这个数值了)

注:人工计算的数据由于都是按照四舍五入,故在最后的计算结果也会存在一定的误差

2.1、代码求解

import pandas as pd
from scipy.stats import chi2_contingency

# 创建一个示例DataFrame
data = {
    '会计': [31,8,12,10],
    '统计': [13,16,10,5],
    '市场营销': [16,7,17,7]
}
index = ['专业A', '专业B', '专业C','专业D']
df = pd.DataFrame(data, index=index)

# 计算卡方统计量
chi2, p, dof, expected = chi2_contingency(df)

print("卡方统计量:", chi2)
print("p值:", p)
print("自由度:", dof)
print("期望频数:", expected)

结果输出:

卡方统计量P值自由度期望频数 f_{e}
14.7018590.02270676
[[24.07894737 17.36842105 18.55263158]
 [12.44078947  8.97368421  9.58552632]
 [15.65131579 11.28947368 12.05921053]
 [ 8.82894737  6.36842105  6.80263158]]

 可以看到此时的卡方统计量为14.7,与上面手动计算的会存在一些误差,但影响不大。

结论:

此时以0.05的显著性水平可以得到 \chi^{2} = 14.7 > \chi_{0.05}^{2}(6) = 12.5916,故可以拒绝原假设。


情感如泉涌,文字成舟。

### 如何在Stata中执行拟合优度检验 #### 使用Logistic回归模型的拟合优度检验 对于logistic回归模型,在Stata中可以通过`estat gof`命令来计算Hosmer-Lemeshow卡方统计量,该统计量用来衡量预测概率与实际观测之间的差异程度。如果p值较大,则说明模型具有较好的拟合效果。 ```stata logit y x1 x2 estat gof, group(10) ``` 上述代码先建立了y对自变量x1和x2的逻辑斯蒂回归模型[^4];接着通过指定分组数目为10来进行 Hosmer-Lemeshow测试[^4]。 #### 对于一般线性模型或其他类型的广义线性模型 针对其他形式的广义线性模型(GLM),比如泊松分布或负二项式分布等计数资料适用的情形下,可以采用偏差残差为基础的方法来做拟合优度检测: ```stata glm y x1 x2, family(poisson) link(log) estat gof ``` 这里选择了泊松族作为响应变量的概率分布假设,并指定了自然对数链接函数[^2]。之后调用了`estat gof`指令完成对该类模型的整体性能评估工作[^2]。 #### 处理门限模型时的拟合优度考量 当涉及到更复杂的非线性结构如门限效应时,除了常规手段外还需要特别留意阈值参数估计的有效性和稳定性问题。虽然没有专门针对这类特殊情形下的全局性测度工具,但是可以从以下几个方面入手间接考察其合理性: - 检查不同子样本内部是否存在明显的模式变化; - 利用似然比检验对比单门槛设定与其他多层嵌套方案之间的好坏差别; - 基于交叉验证技术挑选最优复杂度水平从而达到泛化能力最大化的目的。 ```stata // 进行门限模型估计 xtthresh y x1 x2, threshvar(z) // 通过lrtest比较两个嵌套模型 quietly xtreg y x1 x2 i.group if z<=threshold_value estimates store low_model quietly xtreg y x1 x2 i.group if z>threshold_value estimates store high_model lrtest low_model high_model ``` 这段脚本展示了如何利用Stata内置功能实现两阶段最小二乘法估算带有一个已知分割点z处转换条件的面板数据集上的门限反应规格[^1]。随后借助似然比率测试判断两种情境下各自对应的局部趋势是否具备显著区别。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值