如何使用statsmodels获取多元线性回归的标准化(Beta)系数

12
使用pandas statsmodels的.summary()函数时,OLS回归结果包括以下字段。
coef    std err          t      P>|t|      [0.025      0.975]

如何获得标准化系数(不包括截距),类似于在SPSS中实现的方式?

3个回答

12

你只需要首先使用z分布(即z-score)标准化你的原始DataFrame,然后执行线性回归。

假设你将DataFrame命名为df,其中包含自变量x1x2x3,以及因变量y。请考虑以下代码:

import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.formula.api as smf

# standardizing dataframe
df_z = df.select_dtypes(include=[np.number]).dropna().apply(stats.zscore)

# fitting regression
formula = 'y ~ x1 + x2 + x3'
result = smf.ols(formula, data=df_z).fit()

# checking results
result.summary()

现在,coef将向您显示标准化(beta)系数,以便您可以比较它们对因变量的影响。

注:

  1. 请记住,您需要使用.dropna()。否则,如果列中有任何缺失值,则stats.zscore将为该列返回所有NaN
  2. 您可以手动选择列而不是使用.select_dtypes(),但请确保您选择的所有列都是数字。
  3. 如果您只关心标准化(beta)系数,您也可以使用result.params仅返回它。 它通常以科学符号方式显示。 您可以使用类似round(result.params, 5)的方法将其四舍五入。

1
我们可以通过外生变量的标准差来转换估计的params。结果.t_test(transformation)计算线性变换变量的参数表。
据我所记,以下内容应该生成beta系数和相应的推断统计数据。
计算标准差,但将常数设置为1。
std = model.exog.std(0)
std[0] = 1

然后使用results.t_test并查看params_table。np.diag(std)创建一个对角矩阵,转换params。
tt = results.t_test(np.diag(std))
print(tt.summary()
tt.summary_frame()

这里的“model”是什么? - Frank Wang
1
model is any of the model instances, e.g. OLS or GLM. results is the corresponding Results instance returned by model.fit(). e.g. model = OLS(y, x) and results = model.fit() - Josef
你也标准化了响应变量吗? - Maths12
我的错误,一般线性模型的定义也标准化了y。请参考https://github.com/statsmodels/statsmodels/issues/3857#issuecomment-463346200。 - Josef

0

您可以通过取标准差来转换非标准化系数。标准化系数(Beta)是驱动分析的要求。以下是适用于我的代码。 X是自变量,y是因变量,系数是coef,这些系数是从ols中提取的(model.params)。

sd_x = X.std()
sd_y = Y.std()
beta_coefficients = []

# Iterate through independent variables and calculate beta coefficients
for i, col in enumerate(X.columns):
    beta = coefficients[i] * (sd_x[col] / sd_y)
    beta_coefficients.append([col, beta])

# Print beta coefficients
for var, beta in beta_coefficients:
    print(f' {var}: {beta}')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接