matplotlib 如何清晰地绘制统计模型线性回归(OLS)

s5a0g9ez  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(202)

问题陈述:

我在pandas数据框中有一些很好的数据。我想对它进行简单的线性回归:

使用statmodels,我执行回归。现在,我如何得到我的情节?我试过statsmodels的plot_fit方法,但情节有点古怪:

我希望得到一条水平线,它代表回归的实际结果。
Statsmodels有多种绘制回归曲线的方法(a few more details about them here),但似乎没有一种是超级简单的“只在数据上绘制回归线”--plot_fit似乎是最接近的方法。

问题:

  • 上面的第一张图片来自pandas的plot函数,它返回一个matplotlib.axes._subplots.AxesSubplot。我可以很容易地将回归线叠加到该图上吗?
  • 在statmodels中有什么功能我忽略了吗?
  • 有没有更好的方法来统计这个数字?

两个相关问题:

两人似乎都没有一个好的答案。

示例数据

motifScore  expression
6870    1.401123    0.55
10456   1.188554    -1.58
12455   1.476361    -1.75
18052   1.805736    0.13
19725   1.110953    2.30
30401   1.744645    -0.49
30716   1.098253    -1.59
30771   1.098253    -2.04

abline_plot

我试过了,但似乎不起作用...不知道为什么:

pbwdgjma

pbwdgjma1#

正如我在评论中提到的,seaborn是统计数据可视化的绝佳选择。

import seaborn as sns

sns.regplot(x='motifScore', y='expression', data=motif)

或者,可以使用statsmodels.regression.linear_model.OLS手动绘制回归线。

import statsmodels.api as sm

# regress "expression" onto "motifScore" (plus an intercept)
model = sm.OLS(motif.expression, sm.add_constant(motif.motifScore))
p = model.fit().params

# generate x-values for your regression line (two is sufficient)
x = np.arange(1, 3)

# scatter-plot data
ax = motif.plot(x='motifScore', y='expression', kind='scatter')

# plot regression line on the same axes, set x-axis limits
ax.plot(x, p.const + p.motifScore * x)
ax.set_xlim([1, 2])

另一种解决方案是statsmodels.graphics.regressionplots.abline_plot,它从上述方法中去除了一些样板。

import statsmodels.api as sm
from statsmodels.graphics.regressionplots import abline_plot

# regress "expression" onto "motifScore" (plus an intercept)
model = sm.OLS(motif.expression, sm.add_constant(motif.motifScore))

# scatter-plot data
ax = motif.plot(x='motifScore', y='expression', kind='scatter')

# plot regression line
abline_plot(model_results=model.fit(), ax=ax)

3duebb1j

3duebb1j2#

我同意@Igor Rauch的观点,当涉及到绘制简单回归拟合线时,seaborn非常容易使用(特别是因为OLS拟合是在引擎盖下完成的)。
使用seaborn,您可以关闭ci,传递kwargs用于线和散点。

import pandas as pd
import seaborn as sns
df = pd.DataFrame({
    'motifScore': [1.401123, 1.188554, 1.476361, 1.805736, 1.110953, 1.744645, 1.098253, 1.098253], 
    'expression': [0.55, -1.58, -1.75, 0.13, 2.3, -0.49, -1.59, -2.04]})

sns.regplot(x='motifScore', y='expression', data=df, ci=False, line_kws={'color': 'red'}, scatter_kws={'s': 20, 'alpha': 0.7});

相关的statsmodels方法是abline_plot()。它使用matplotlib.lines.Line2D构建引擎盖下的拟合线;因此,如果轴限制设置不当,则可能不会显示该线。例如,对于默认限制((0,1),(0,1)),样本数据的拟合线根本不会显示出来。

import statsmodels.api as sm

X = sm.add_constant(df['motifScore'])
y = df['expression']
results = sm.OLS(y, X).fit()

fig = sm.graphics.abline_plot(model_results=results, color='red')
fig.axes[0].set(ylim=(-1,0), xlim=(1,2))

它不绘制原始数据,因此必须单独绘制。由于abline是一条拟合线,它可能会穿过分散的标记,因此不需要调整轴限制。请注意,在abline_plot()之前绘制散点图可能更好,以获得更明确定义的轴限制。

import matplotlib.pyplot as plt
plt.scatter(df['motifScore'], df['expression'])
fig = sm.graphics.abline_plot(model_results=results, color='red', ax=plt.gca())

如果您想坚持使用statsmodels.graphics,还有另一个绘图仪值得查看:plot_ccpr()。因为这绘制了CCPR,它的主要功能是查看特定回归量对因变量的影响(对于模型y=a+b*x,绘制x against b*x),它将被常数项关闭。如果y-刻度并不重要,它是有用的。

fig = sm.graphics.plot_ccpr(results, 'motifScore')
# the above is the same as the following (uncomment to see it drawn)
# notice that results.params.const is missing from y
# fig.axes[0].plot(range(1,3), [results.params['motifScore']*i for i in range(1,3)]);

相关问题