Python新手求助:逻辑回归系数差异性检验与方差-协方差矩阵获取
Hey there! 作为Python新手刚上手第一个统计项目,能想到用Wald检验来对比逻辑回归系数,这思路很赞👍。我帮你整理了用UCLA经典数据集实现的完整步骤,包括方差-协方差矩阵的提取和Wald检验的计算,一步步来:
第一步:准备UCLA示例数据集
咱们用UCLA常用的录取预测数据集(包含录取状态、GRE成绩、GPA、本科院校排名等变量),直接用statsmodels内置的数据集就可以,不用额外下载:
import pandas as pd import statsmodels.api as sm from scipy.stats import chi2 # 加载内置的二元选择数据集(对应UCLA的admit数据) df = sm.datasets.get_rdataset("BinaryChoice", "Ecdat").data # 重命名列名方便后续操作 df = df.rename(columns={'admit': 'admit', 'gre': 'gre', 'gpa': 'gpa', 'rank': 'rank'}) # 将rank(院校排名)转换为哑变量(分类变量必须处理后才能进回归) df = pd.get_dummies(df, columns=['rank'], drop_first=True)
第二步:拟合逻辑回归模型
先构建自变量矩阵并加入截距项,然后拟合模型:
# 构建自变量矩阵,添加截距项 X = sm.add_constant(df.drop('admit', axis=1)) y = df['admit'] # 拟合逻辑回归模型 logit_model = sm.Logit(y, X) result = logit_model.fit() # 查看模型整体结果(包括系数、p值等) print(result.summary())
第三步:提取并展示参数的方差-协方差矩阵
statsmodels的回归结果对象直接提供了提取方差-协方差矩阵的方法,这个矩阵能帮我们看到参数之间的协方差关系:
# 提取方差-协方差矩阵 cov_matrix = result.cov_params() # 打印矩阵 print("参数的方差-协方差矩阵:") print(cov_matrix) # 如果想更美观地展示(Jupyter环境下生效) display(pd.DataFrame(cov_matrix).style.background_gradient(cmap='coolwarm'))
第四步:执行Wald检验判断系数差异
Wald检验的核心是检验两个系数的差值是否显著不为0,这里分两种方式实现:
方式1:手动计算(理解原理)
假设我们要对比rank_2和rank_3的系数差异,按照Wald统计量的公式手动计算:
# 指定要对比的两个参数 param1 = 'rank_2' param2 = 'rank_3' # 获取参数估计值 beta1 = result.params[param1] beta2 = result.params[param2] # 获取对应方差和协方差 var1 = cov_matrix.loc[param1, param1] var2 = cov_matrix.loc[param2, param2] cov = cov_matrix.loc[param1, param2] # 计算Wald统计量 wald_stat = (beta1 - beta2)**2 / (var1 + var2 - 2*cov) # 计算p值(服从自由度为1的卡方分布) p_value = 1 - chi2.cdf(wald_stat, df=1) # 输出结果 print(f"Wald检验统计量: {wald_stat:.4f}") print(f"对应的p值: {p_value:.4f}") # 结果解读 if p_value < 0.05: print(f"在0.05显著性水平下,拒绝原假设 → {param1}和{param2}的系数存在显著差异!") else: print(f"在0.05显著性水平下,无法拒绝原假设 → {param1}和{param2}的系数无显著差异。")
方式2:用statsmodels内置方法(更高效)
如果不想手动计算,直接用模型结果的wald_test方法,支持自定义假设:
# 先确认模型的变量顺序,避免假设写错 print("模型变量顺序:", X.columns.tolist()) # 构造假设:这里检验rank_2 - rank_3 = 0 hypothesis = 'rank_2 - rank_3 = 0' # 执行Wald检验 wald_test_result = result.wald_test(hypothesis) print(wald_test_result)
这个方法会直接输出统计量、p值和自由度,适合快速验证。
内容的提问来源于stack exchange,提问作者MattGoos
相关产品推荐
相关产品推荐

