Как построить линейную регрессию statsmodels (OLS) чисто

Постановка Задачи:

у меня есть хорошие данные в фрейме данных pandas. Я хотел бы запустить на нем простую линейную регрессию:

enter image description here

используя statsmodels, я выполняю регрессию. Теперь, как мне получить мой участок? Я пробовал statsmodels' plot_fit метод, но сюжет немного фанки:

enter image description here

Я надеялся получить горизонтальную линию, которая представляет собой фактический результат регрессия.

Statsmodels есть разнообразие методов построения регрессии (еще несколько подробностей о них здесь) но ни один из них не кажется супер простым "просто построить линию регрессии поверх ваших данных"-- plot_fit кажется, ближе всего.

вопросы:

  • первое изображение выше из функции графика панды, которая возвращает matplotlib.axes._subplots.AxesSubplot. Могу ли я легко наложить линию регрессии на этот участок?
  • есть ли функция в statsmodels, которую я пропустил?
  • есть ли лучший способ собрать эту цифру?

два вопроса:

ни один из них, кажется, не имеет хорошего ответа.

пример данных

As запрошено @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

1 ответов


как я уже упоминал в комментариях, 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