Python中计算各预测变量与因变量的调整R方等统计量的咨询
解决单变量与因变量的调整R²及p值计算问题
嘿,我懂你现在的处境——已经搞定了用相关系数矩阵算单个自变量和因变量的R、R²,但调整R²怎么算就卡壳了,还得加上p值对吧?咱们直接上干货,一步步解决这个问题。
首先得明确:你要的是每个自变量单独和因变量做简单线性回归对应的调整R²和p值,对吧?毕竟在多元回归前先做单变量探索性分析是很合理的思路。
核心原理
调整R²的公式:对于简单线性回归(仅一个自变量),调整R²的计算公式是:
调整R² = 1 - [(1 - R²) * (n - 1) / (n - 2)]其中
n是你的样本量。这个公式是多元调整R²的特例(因为k=1,只有一个自变量)。不过其实不用手动算,statsmodels库直接给我们现成的结果。p值的意义:这里的p值是指该自变量对因变量的线性关系是否显著的检验结果(简单回归中,自变量系数的p值和模型整体F检验的p值是完全一致的)。
代码实现(用pandas + statsmodels)
假设你的数据框叫df,因变量列名为'y',其他列都是自变量。直接运行下面的代码就能得到所有指标:
import pandas as pd import statsmodels.api as sm # 初始化存储结果的字典 result_dict = { '自变量名称': [], '相关系数R': [], 'R²': [], '调整R²': [], 'p值': [] } # 提取因变量和自变量列表 y = df['y'] independent_cols = [col for col in df.columns if col != 'y'] sample_size = len(df) # 遍历每个自变量计算指标 for col in independent_cols: # 准备自变量数据(添加截距项,statsmodels需要手动加) X = sm.add_constant(df[col]) # 拟合简单线性回归模型 model = sm.OLS(y, X).fit() # 提取各个指标 r = df[col].corr(y) # 和你之前用相关矩阵得到的R完全一致 r_squared = model.rsquared adj_r_squared = model.rsquared_adj # 直接用模型自带的调整R²,不用手动算 p_value = model.pvalues[col] # 取该自变量系数的p值 # 把结果存入字典 result_dict['自变量名称'].append(col) result_dict['相关系数R'].append(round(r, 4)) result_dict['R²'].append(round(r_squared, 4)) result_dict['调整R²'].append(round(adj_r_squared, 4)) result_dict['p值'].append(round(p_value, 4)) # 转成DataFrame方便查看 result_df = pd.DataFrame(result_dict) print(result_df)
关键说明
- 为什么用
statsmodels而不是自己算调整R²?因为它不仅能直接给出rsquared_adj,还能顺便帮我们算出p值,一举两得,而且避免手动计算可能出错。 - 你之前用相关系数矩阵得到的R和这里的
df[col].corr(y)结果完全一致,R²就是R的平方,和模型的rsquared也完全匹配——这验证了两种方法的一致性。 - p值小于0.05(常用显著性水平)时,说明该自变量和因变量的线性关系在统计上是显著的。
内容的提问来源于stack exchange,提问作者Marco




