web-dev-qa-db-fra.com

Comment tracer proprement la régression linéaire (OLS) des modèles de statistiques

Énoncé du problème:

J'ai quelques belles données dans un cadre de données pandas. Je voudrais exécuter une régression linéaire simple dessus:

enter image description here

À l'aide de modèles statistiques, j'effectue ma régression. Maintenant, comment puis-je obtenir mon intrigue? J'ai essayé les modèles de statistiques plot_fit méthode, mais l'intrigue est un peu géniale:

enter image description here

J'espérais obtenir une ligne horizontale qui représente le résultat réel de la régression.

Statsmodels a un variété de méthodes pour tracer la régression ( quelques détails supplémentaires à leur sujet ici ) mais aucun ne semble être le super simple "tracer juste la ligne de régression en haut de vos données "- plot_fit semble être la chose la plus proche.

Des questions:

  • La première image ci-dessus provient de la fonction de tracé de pandas, qui renvoie un matplotlib.axes._subplots.AxesSubplot. Puis-je superposer facilement une ligne de régression sur ce tracé?
  • Y a-t-il une fonction dans les modèles de statistiques que j'ai ignorée?
  • Existe-t-il une meilleure façon de rassembler ce chiffre?

Deux questions connexes:

Aucun des deux ne semble avoir une bonne réponse.

Exemples de données

Comme demandé par @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

J'avais essayé, mais cela ne semble pas fonctionner ... je ne sais pas pourquoi:

enter image description here

15
Alex Lenail

Comme je l'ai mentionné dans les commentaires, seaborn est un excellent choix pour la visualisation de données statistiques.

import seaborn as sns

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

sns.regplot


Vous pouvez également utiliser statsmodels.regression.linear_model.OLS et tracez manuellement une ligne de régression.

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


Encore une autre solution est statsmodels.graphics.regressionplots.abline_plot ce qui enlève une partie du passe-partout de l'approche ci-dessus.

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