web-dev-qa-db-ja.com

統計モデル線形回帰(OLS)をきれいにプロットする方法

問題文:

pandasデータフレームにニースのデータがあります。単純な線形回帰を実行したいと思います。

enter image description here

Statsmodelsを使用して、回帰を実行します。さて、どうすればプロットを取得できますか? statsmodelsのplot_fitメソッドを試しましたが、プロットは少しファンキーです:

enter image description here

回帰の実際の結果を表す水平線を取得することを望んでいました。

Statsmodelsには 回帰をプロットするためのさまざまな方法ここでそれらについてのいくつかの詳細 )がありますが、それらのいずれも超単純なようではありませんあなたのデータの」-plot_fitが最も近いようです。

質問:

  • 上の最初の図は、matplotlib.axes._subplots.AxesSubplotを返すパンダのプロット関数です。そのプロットに回帰線を簡単に重ねることはできますか?
  • 私が見落とした統計モデルに機能はありますか?
  • この図をまとめるより良い方法はありますか?

関連する2つの質問:

どちらも良い答えがないようです。

サンプルデータ

@IgorRaushの要求どおり

        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

私はこれを試しましたが、うまくいかないようです...理由はわかりません:

enter image description here

15
Alex Lenail

コメントで述べたように、seabornは統計データの視覚化に最適です。

import seaborn as sns

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

sns.regplot


または、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])

manual


さらに別の解決策は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)

abline_plot

19
Igor Raush