Вот поясняющий код для примера игрушки, на котором я пытался запустить полиномиальную модель второй степени (успешно), а затем построить соответствующую линию на диаграмме рассеяния:
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'])
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")
Я пытался подписаться на этот пост . Я думаю, что мой ошибочный код выше использует точку пересечения для умножения квадрата независимой переменной, но я не уверен, что это реальная проблема. Вот совершенно неправильный вывод:
Эквивалентность в 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]
Если бы вектор значений 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.