Python - 多元线性回归 - 每个输入变量的确定系数

Posted

技术标签:

【中文标题】Python - 多元线性回归 - 每个输入变量的确定系数【英文标题】:Python - Multiple Linear Regression - Coefficient of Determination for each Input Variable 【发布时间】:2021-12-30 01:57:49 【问题描述】:

我正在使用 sklearn 在 Python 中执行相当直接的多元线性回归。请参阅下面的代码 sn-p - full_results 是一个数据框,其中所有变量都是数字。

这段代码的结果是一个单一的决定系数,我相信它表示 y 的变化是由于 x1 - x4 的组合造成的。

我的问题是确定系数是否可以在 4 个输入变量之间进行拆分,因此我可以看到 y 的变化分别归因于每个变量。

我当然可以为每个变量独立运行单变量线性回归,但这感觉不是正确的解决方案。

我记得很多年前在统计课上,并在 R 中做类似的事情。

from sklearn.linear_model import LinearRegression

x = full_results[['x1','x2','x3','x4']].values
y = full_results['y'].values

mlr = LinearRegression()
mlr.fit(x, y)

mlr.score(x, y)

【问题讨论】:

这里通常会使用 PCA 吗? “y 有多少变化”是什么意思?你拟合了一个线性模型,所以只有线性权重决定了 y 受 x1, ... x4 变化的影响程度。决定系数衡量模型解释/预测结果/数据点的程度。它是对整个模型的度量。这里解释得更好:stats.stackexchange.com/questions/412526/… 您可以执行优势分析。结果为您提供了每个变量解释的 y 方差百分比。确定单个变量的 R2 不会提供正确的信息,因为对单个变量的解释方差的贡献也受到模型中其他变量的影响。例如,具有 X1 的模型和具有 X2 的模型的 R2 之和与具有 X1 和 X2 组合的模型不同。 github.com/dominance-analysis/dominance-analysis 【参考方案1】:

决定系数是解释的总方差的比例。所以另一种看待它的方法是查看每个术语解释的方差比例,也解释了here。为此,我们使用方差分析来计算每个项的平方和。

您必须注意的一件事是,如果您的预测变量不相关,则此方法有效。如果是,那么在模型中指定的每个它们的顺序都会对计算产生影响。

使用示例数据集:

from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
import pandas as pd

X,y = make_regression(n_samples=100, n_features=4,
n_informative=3, noise=20, random_state=99)

df = pd.DataFrame(X,columns = ['x1','x2','x3','x4'])
df['y'] = y

mlr = LinearRegression()
mlr.fit(df[['x1','x2','x3','x4']], y)

mlr.coef_
array([ 8.33369861, 29.1717497 , 26.6294007 , -1.82445836])

mlr.score(df[['x1','x2','x3','x4']], y)

0.8465893941639528

使用statsmodels 更容易计算并进行线性拟合,您可以看到系数非常相似:

import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

lm = ols('y ~ x1 + x2 + x3 + x4',df).fit()
lm.params

Intercept    -0.740399
x1            8.333699
x2           29.171750
x3           26.629401
x4           -1.824458

我们得到方差分析:

anova_table = anova_lm(lm)
anova_table

            df         sum_sq        mean_sq           F        PR(>F)
x1         1.0   10394.554366   10394.554366   28.605241  6.110239e-07
x2         1.0  113541.846572  113541.846572  312.460911  8.531356e-32
x3         1.0   66267.787822   66267.787822  182.365304  7.899193e-24
x4         1.0     298.584632     298.584632    0.821688  3.669804e-01
Residual  95.0   34521.039456     363.379363         NaN           NaN

除了平方和列中的残差之外的所有内容都会为您提供类似于 sklearn 的 r 平方:

anova_table['sum_sq'][:-1].sum() / anova_table['sum_sq'].sum()
0.8465893941639528

现在解释的方差比例(我们很少称之为 r-squared)例如 'x1' 是:

anova_table.loc['x1','sum_sq'] / anova_table['sum_sq'].sum()
0.046193130558342954

【讨论】:

以上是关于Python - 多元线性回归 - 每个输入变量的确定系数的主要内容,如果未能解决你的问题,请参考以下文章

在多元线性回归 Python 中处理分类变量和数值变量

处理多元线性回归Python中的分类和数值变量

回归分析 R语言 -- 多元线性回归

python:多元线性回归总结

以字符为因变量的多元线性回归

spss 多元非线性回归分析