Как построить полиномиальную линию регрессии на диаграмме рассеяния в python (с использованием statsmodel) - PullRequest
2 голосов
/ 27 мая 2020

Вот поясняющий код для примера игрушки, на котором я пытался запустить полиномиальную модель второй степени (успешно), а затем построить соответствующую линию на диаграмме рассеяния:

import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm              
import statsmodels.stats.stattools as stools
import statsmodels.stats as stats
from   statsmodels.graphics.regressionplots import *
from   statsmodels.sandbox.regression.predstd import wls_prediction_std
from   statsmodels.formula.api import ols


import io
import requests

url = "https://raw.githubusercontent.com/RInterested/datasets/gh-pages/mtcars.csv"
contents = requests.get(url).content
mtcars = pd.read_csv(io.StringIO(contents.decode('utf-8')))

mtcars['wt_square']=mtcars['wt']**2
model = ols('mpg ~ wt + wt_square', data=mtcars).fit()
print(model.summary())
print(model.params)

plt.scatter(mtcars['wt'], mtcars['mpg'])

enter image description here

plt.scatter(mtcars['wt'], mtcars['mpg'])
x2 = np.arange(0, 6, 1) # I used only a few points to test.
y2 = np.polyval(model.params, x2)
print(x2)
print(y2)
plt.plot(x2, y2, label="deg=2")

Я пытался подписаться на этот пост . Я думаю, что мой ошибочный код выше использует точку пересечения для умножения квадрата независимой переменной, но я не уверен, что это реальная проблема. Вот совершенно неправильный вывод:

enter image description here

Эквивалентность в R (то, что я после) будет:

fit <- lm(mpg ~ poly(wt,2,raw=T), mtcars)
plot(mpg ~ wt, mtcars)
lines(sort(mtcars$wt), fitted(fit)[order(mtcars$wt)], col='red', type='b') 

[![enter image description here][1]][1]

enter image description here

Если бы вектор значений x2 использовался для создания этого графика, ручное вычисление в R было бы:

MM <- model.matrix(fit)
testing_points <- 0:5
tpsq <- testing_points^2
ones <- rep(1, length(testing_points))
testmat <- data.frame(ones, testing_points, tpsq)
as.matrix(testmat) %*% as.vector(fit$coef)

, что дало бы:

49.93081
37.72156
27.85448
20.32958
15.14685
12.30630

Возможно, есть способ организовать линейную алгебру с помощью Python.

...