科研学习|研究方法——逻辑回归系数的显著性检验(python实现)

1. 背景


回归方程与回归系数的显著性检验

2. statsmodels 库

statsmodels库可以用来做逻辑回归、线性回归。并且会在summary中给出显著性检验的结果。最终我们想要的就是如下图的报告。

 3. 计算过程

如果我们使用的sklearn构建的逻辑回归就没有办法直接输出这个报告,所以需要自己计算这个表中的信息。

3.1 先用statemodels计算作为对比

import pandas as pd
from sklearn.datasets import load_boston
from scipy import stats
import statsmodels.api as sm
import numpy as np''' 数据demo'''
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = pd.DataFrame(boston.target, columns=['target'])X = sm.add_constant(X)  # 添加常数项
model = sm.OLS(y, X)
results = model.fit()
y_pred = pd.DataFrame(model.predict(results.params, X),columns=['pred'])
print(results.summary())''''''

输出结果:

                           OLS Regression Results                            
==============================================================================
Dep. Variable:                 target   R-squared:                       0.741
Model:                            OLS   Adj. R-squared:                  0.734
Method:                 Least Squares   F-statistic:                     108.1
Date:                Thu, 04 Nov 2021   Prob (F-statistic):          6.72e-135
Time:                        11:07:53   Log-Likelihood:                -1498.8
No. Observations:                 506   AIC:                             3026.
Df Residuals:                     492   BIC:                             3085.
Df Model:                          13                                         
Covariance Type:            nonrobust                                         
==============================================================================coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         36.4595      5.103      7.144      0.000      26.432      46.487
CRIM          -0.1080      0.033     -3.287      0.001      -0.173      -0.043
ZN             0.0464      0.014      3.382      0.001       0.019       0.073
INDUS          0.0206      0.061      0.334      0.738      -0.100       0.141
CHAS           2.6867      0.862      3.118      0.002       0.994       4.380
NOX          -17.7666      3.820     -4.651      0.000     -25.272     -10.262
RM             3.8099      0.418      9.116      0.000       2.989       4.631
AGE            0.0007      0.013      0.052      0.958      -0.025       0.027
DIS           -1.4756      0.199     -7.398      0.000      -1.867      -1.084
RAD            0.3060      0.066      4.613      0.000       0.176       0.436
TAX           -0.0123      0.004     -3.280      0.001      -0.020      -0.005
PTRATIO       -0.9527      0.131     -7.283      0.000      -1.210      -0.696
B              0.0093      0.003      3.467      0.001       0.004       0.015
LSTAT         -0.5248      0.051    -10.347      0.000      -0.624      -0.425
==============================================================================
Omnibus:                      178.041   Durbin-Watson:                   1.078
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              783.126
Skew:                           1.521   Prob(JB):                    8.84e-171
Kurtosis:                       8.281   Cond. No.                     1.51e+04
==============================================================================

3.2 自己代码做

计算的函数

def func_sign_testing_LRCoef(X, y_pred, y_true, Coef):'''逻辑回归系数的显著性检验:param X: 原始数据,行为样本,列为特征(注意,如果你的Coef比特征多一列,那么应该在数据上加一列const   X.insert(0, 'const', 1)  # 添加常数项):param y_pred: 模型的预测结果:param y_true: 数据的真实结果:param Coef: 逻辑回归的回归系数:return: 返回报告包含'coef','std error','tval','pval','lower alpha','upper alpha''''# y_pred = y_pred.values# y_true = y.values# Coef = results.params.valuesn, p = X.shapep = p - 1  # p 为特征数# X.insert(0, 'const', 1)  # 添加常数项# SSR = np.dot(y_pred - y_true.mean(), y_pred - y_true.mean())y_pred = np.squeeze(y_pred)y_true = np.squeeze(y_true)Coef = np.squeeze(Coef)SSR = np.dot(np.squeeze(y_pred) - np.squeeze(y_true).mean(),np.squeeze(y_pred) - np.squeeze(y_true).mean())SSE = np.dot(np.squeeze(y_pred) - np.squeeze(y_true),np.squeeze(y_pred) - np.squeeze(y_true))# SSE = np.dot(y_pred - y_true, y_pred - y_true)# 先计算回归方程的显著性f_val = (SSR / p) / (SSE / n - p - 1)f_pval = stats.f.sf(f_val, p, n - p - 1)print("LR F", f_val)print("LR p", f_pval)# 单个参数的显著性检验# print(X.columns)ttest_result = pd.DataFrame(None, index=X.columns,columns=['coef', 'std error', 'tval', 'pval', '[lower alpha', 'upper alpha]'])ttest_result.loc[:, 'coef'] = np.squeeze(Coef)error = np.dot(y_true - y_pred, y_true - y_pred)S = np.array(np.linalg.inv(np.dot(X.T, X)))for i, col in enumerate(X.columns):RMSE = np.sqrt(error / n - p - 1)tval = Coef[i] / np.sqrt((error / (n - p - 1)) * S[i][i])ttest_result.loc[col, 'tval'] = tval# pval_test = stats.t.sf(np.abs(tval), df=492) * 2std_error = Coef[i] / tval  # np.sqrt(S[i][i]) * RMSE# 其实表里的t检验值就剩余表里的b系数除以std error哦,t=b/std errorttest_result.loc[col, 'std error'] = std_errorpval = stats.t.sf(np.abs(tval), df=(n - p - 1)) * 2ttest_result.loc[col, 'pval'] = pval[lower_a, upper_a] = stats.norm.ppf(q=[0.025, 0.975], loc=Coef[i], scale=std_error)ttest_result.loc[col, '[lower alpha'] = lower_attest_result.loc[col, 'upper alpha]'] = upper_areturn ttest_result

调用函数

boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = pd.DataFrame(boston.target, columns=['target'])
X = sm.add_constant(X)  # 添加常数项
model = sm.OLS(y, X)
results = model.fit()
y_pred = pd.DataFrame(model.predict(results.params, X),columns=['pred'])# results.params.values 将训练得到的coef系数给进函数
func_sign_testing_LRCoef(X, y_pred, y, results.params.values)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/179604.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(3)实现一个具有清零功能的按键计数器,对按键进行计数并显示

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 counter.v 1.2 debounce.v …

自定义控件封装

上边对两个控件整合时用函数指针是因为QSpinBox::valueChange有重载版本 自定义的接口放在类外 你设计的界面可以通过提升为调用这些接口 添加qt设计师界面类

音视频封装格式:AAC音频基础和ADTS打包方案详解

现在主流的封装格式支持的音视频编码标配是H264AAC,其中像TS、RTP、FLV、MP4都支持音频的AAC编码方式。当然,后继者不乏Opus这种编码方式,它主要应用在互联网场景,比如现在谷歌的WebRTC音视频解决方案就用的Opus,但是A…

Poly风格模型的创建与使用_unity基础开发教程

Poly风格模型的创建与使用 安装Poly相关组件Poly模型的创建Poly模型编辑 安装Poly相关组件 打开资源包管理器Package Manager 在弹出的窗口左上角Packages选择Unity Registry 搜索框搜索 Poly 搜索结果点击Polybrush 点击右下角 Install 同时也别忘了导入一下模型示例&#…

【文件包含】metinfo 5.0.4 文件包含漏洞复现

1.1漏洞描述 漏洞编号————漏洞类型文件包含漏洞等级⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐漏洞环境windows攻击方式 MetInfo 是一套使用PHP 和MySQL 开发的内容管理系统。MetInfo 5.0.4 版本中的 /metinfo_5.0.4/about/index.php?fmodule文件存在任意文件包含漏洞。攻击者可利用漏洞读取网…

找风景视频素材,就上这5个网站。

找风景视频素材那一定要上这6个网站,免费下载,赶紧收藏! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富,网站主要还是以设计类素材为主,高清视频素材也很多,像风景…

【Docker】实现JMeter分布式压测

一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试。如本网站所示,一个JMeter实例将能够控制许多其他的远程JMeter实例,并对你的应用程序产生更大的负载。JMeter使用Java RMI[远程方法调用]来与分布式网络中的对象进行交互。JMeter主站…

资产跟踪影响利润的 7 种方式

几乎每个工人都被托付某种有形资产来完成他们的工作。根据您的工作领域,这可能是一套制服、徽章、一台电脑、一部工作电话、一套建筑钥匙、一个工具包,甚至是一台价值超过您年薪的机器。 无论如何,我们都熟悉丢失您所保管的物品所带来的压力…

11月第2周榜单丨飞瓜数据B站UP主排行榜榜单(B站平台)发布!

飞瓜轻数发布2023年11月6日-11月12日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营…

【论文阅读】(CGAN)Conditional Generative Adversarial Nets

论文地址:[1411.1784] Conditional Generative Adversarial Nets (arxiv.org) - 条件生成式对抗网络; 解读: 这篇论文中的Conditional GAN和原生GAN在结构上没有太大差别,时间也是紧随着原生GAN出来的,它的思想应该后…

python采集小破站视频弹幕

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用]: Python 3.8 Pycharm模块使用]: import requests 数据请求 import jieba 分词 import wordcloud 词云 import re 正则通过爬虫程序采集数据 分析数…