Подгонка кривой Python statsmodels (см. Более предварительные формулы) - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть некоторые проблемы с реализацией формул в модели состояния. (Я использую их впервые) Я обнаружил, что у них сильный статистический фон: R2 / adj-R2 / AIC / BIC / Pseudo-F и др. c.)

Я беру 6 различных функций что я проверяю в Scipy curve_fit(func, xData, yData, **options) и получаю результаты для сравнения с тем, что получу в модели статистики.

Мои функции:

# exponential function with adidtional konstant
def func0(x,a,b,c):
    return c+a*np.exp(b*x)

# exponential function
def func1(x, a, b):
    return a*np.exp(b*x) 

# logarithmic function
def func2(x, a,b):
    return a*np.exp(x)+b

# # generalized logistic function
def func3(x, a, b, c, d, g):
    return ((a-d)/((1+((x/c)**b))**g))+d

def func4(x, a,b,c,d):
    return a/(1 + np.exp(-c * (x - d))) + b

# parabola function
def func5(x, a,b,c):
    return a*x**2+b*x+c

Это результаты: text

но когда я пытаюсь вписать их в модель статистики:

ХОРОШО (coff. Тот же самый):

import statsmodels.formula.api as sm

# logarithmic function
def func2(x, a,b):
    return a*np.exp(x)+b

model = sm.ols(formula='Y ~ np.exp(x)', data=tmp_df)

               coef std err    t    P>|t|   [0.025  0.975]
Intercept   -0.4388 0.006   -69.890 0.000   -0.451  -0.426
np.exp(x)   0.4176  0.004   106.238 0.000   0.410   0.425

-------------------------------------------------------------
# parabola function
def func5(x, a,b,c):
    return a*x**2+b*x+c

model = sm.ols(formula='Y ~ x + I(x**2)', data=tmp_df)

            coef    std err     t   P>|t|   [0.025  0.975]
Intercept   0.1995  0.004   47.709  0.000   0.191   0.208
x          -0.7953  0.020   -39.745 0.000   -0.835  -0.756
I(x ** 2)   1.5475  0.021   74.036  0.000   1.506   1.588

каким должен быть синтаксис для остальных функции в параметре модели статистики? formula=

# exponential function with adidtional konstant
def func0(x,a,b,c):
    return c+a*np.exp(b*x)

# exponential function
def func1(x, a, b):
    return a*np.exp(b*x) 

# # generalized logistic function
def func3(x, a, b, c, d, g):
    return ((a-d)/((1+((x/c)**b))**g))+d

def func4(x, a,b,c,d):
    return a/(1 + np.exp(-c * (x - d))) + b

РЕДАКТИРОВАНИЕ:

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

def func0(x,a,b,c):
    return c+a*np.exp(b*x)

from scipy.optimize import curve_fit
popt, pcov = curve_fit(func, xData, yData, method='lm')

-------------------------------------------------------
popt
array([0.0116, 4.5424, 0.0796])

как получить те же результаты в statsmodels:

import statsmodels.formula.api as sm

model = sm.ols(formula='?????', data=tmp_df)

1 Ответ

0 голосов
/ 19 апреля 2020

Как на самом деле использовать написанную вами функцию?

https://www.statsmodels.org/devel/example_formulas.html#functions

Существует пример, аналогичный тому, что вам нужно:

def log_plus_1(x):
    return np.log(x) + 1.0


res = smf.ols(formula='Lottery ~ log_plus_1(Literacy)', data=df).fit()

Вы пытались настроить это с помощью дополнительных параметров и ваших имен?

Пожалуйста, прочитайте также

https://www.statsmodels.org/stable/generated/statsmodels.formula.api.ols.html#statsmodels .formula.api.ols

https://patsy.readthedocs.io/en/latest/formulas.html

Использование функции ols с параметрами, содержащими цифры / пробелы

Числа в качестве имен переменных, не распознаваемых статистическими моделями. formula.api

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...